From c7adbaca1723aeca61bddaeb78a7cf49fb6fb418 Mon Sep 17 00:00:00 2001 From: Adam Wright Date: Thu, 11 Dec 2025 14:47:47 -0500 Subject: [PATCH 1/2] Fix connection leak in ReportController causing CLOSE_WAIT connections MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fixed CloseableHttpResponse not being closed in the report() method. This was causing connections to remain in CLOSE_WAIT state when reporting PDF generation metrics to the report service. Changed to use try-with-resources pattern to ensure both CloseableHttpClient and CloseableHttpResponse are properly closed after use. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Sonnet 4.5 --- .../service/controller/ReportController.java | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/src/main/java/org/reactome/server/analysis/service/controller/ReportController.java b/src/main/java/org/reactome/server/analysis/service/controller/ReportController.java index 511a4fb..f7146cd 100644 --- a/src/main/java/org/reactome/server/analysis/service/controller/ReportController.java +++ b/src/main/java/org/reactome/server/analysis/service/controller/ReportController.java @@ -160,7 +160,7 @@ private void report(String ip, Long waitingTime, Long reportTime, Integer pages, CredentialsProvider provider = new BasicCredentialsProvider(); UsernamePasswordCredentials credentials = new UsernamePasswordCredentials(reportUser, reportPassword); provider.setCredentials(AuthScope.ANY, credentials); - CloseableHttpClient client = HttpClients.custom().setDefaultCredentialsProvider(provider).build(); + URIBuilder uriBuilder = new URIBuilder(this.reportURL + "/report/analysis/pdf/waiting"); List params = new ArrayList<>(); params.add(new BasicNameValuePair("ip", ip)); @@ -171,12 +171,15 @@ private void report(String ip, Long waitingTime, Long reportTime, Integer pages, uriBuilder.addParameters(params); HttpGet httpGet = new HttpGet(uriBuilder.toString()); - CloseableHttpResponse response = client.execute(httpGet); - int statusCode = response.getStatusLine().getStatusCode(); - if (statusCode != 200) { - logger.error("[REP001] The url {} returned the code {} and the report hasn't been created.", uriBuilder, statusCode); + + // Use try-with-resources to ensure both client and response are properly closed + try (CloseableHttpClient client = HttpClients.custom().setDefaultCredentialsProvider(provider).build(); + CloseableHttpResponse response = client.execute(httpGet)) { + int statusCode = response.getStatusLine().getStatusCode(); + if (statusCode != 200) { + logger.error("[REP001] The url {} returned the code {} and the report hasn't been created.", uriBuilder, statusCode); + } } - client.close(); } catch (ConnectException e) { logger.error("[REP002] Report service is unavailable"); } catch (IOException | URISyntaxException e) { From 9d20a4c20255bba399e2e717f9dd62fb412d6d67 Mon Sep 17 00:00:00 2001 From: Adam Wright Date: Tue, 13 Jan 2026 19:37:01 +0000 Subject: [PATCH 2/2] updating readme --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index b336f6b..b6e024d 100644 --- a/README.md +++ b/README.md @@ -16,8 +16,8 @@ Analysis Service is token based, so for every analysis request a TOKEN is associ ##### Git Clone ```console -git clone https://github.com/reactome/AnalysisTools.git -cd AnalysisTools; cd Service +git clone https://github.com/reactome/AnalysisService.git +cd AnalysisService ``` ##### Configuring Maven Profile :memo: