From 5110cfd49d1c66368353dcb612224adb8fea37c0 Mon Sep 17 00:00:00 2001 From: Guimu <30684111+daguimu@users.noreply.github.com> Date: Thu, 23 Apr 2026 14:07:09 +0800 Subject: [PATCH] fix: close HttpClient after binlog download to prevent resource leak (#5579) BinlogDownloadQueue.download() creates a CloseableHttpClient for each download but never closes it. Over time this exhausts connection pool resources. Wrap the HTTP execution in a try-finally block to ensure the client is always closed. Co-authored-by: Claude Opus 4.6 (1M context) --- .../mysql/rds/BinlogDownloadQueue.java | 28 +++++++++++-------- 1 file changed, 16 insertions(+), 12 deletions(-) diff --git a/parse/src/main/java/com/alibaba/otter/canal/parse/inbound/mysql/rds/BinlogDownloadQueue.java b/parse/src/main/java/com/alibaba/otter/canal/parse/inbound/mysql/rds/BinlogDownloadQueue.java index 807ffe49..7268cd54 100644 --- a/parse/src/main/java/com/alibaba/otter/canal/parse/inbound/mysql/rds/BinlogDownloadQueue.java +++ b/parse/src/main/java/com/alibaba/otter/canal/parse/inbound/mysql/rds/BinlogDownloadQueue.java @@ -189,19 +189,23 @@ public class BinlogDownloadQueue { httpClient = HttpClientBuilder.create().setMaxConnPerRoute(50).setMaxConnTotal(100).build(); } - HttpGet httpGet = new HttpGet(downloadLink); - RequestConfig requestConfig = RequestConfig.custom() - .setConnectTimeout(TIMEOUT) - .setConnectionRequestTimeout(TIMEOUT) - .setSocketTimeout(TIMEOUT) - .build(); - httpGet.setConfig(requestConfig); - HttpResponse response = httpClient.execute(httpGet); - int statusCode = response.getStatusLine().getStatusCode(); - if (statusCode != HttpResponseStatus.OK.code()) { - throw new RuntimeException("download failed , url:" + downloadLink + " , statusCode:" + statusCode); + try { + HttpGet httpGet = new HttpGet(downloadLink); + RequestConfig requestConfig = RequestConfig.custom() + .setConnectTimeout(TIMEOUT) + .setConnectionRequestTimeout(TIMEOUT) + .setSocketTimeout(TIMEOUT) + .build(); + httpGet.setConfig(requestConfig); + HttpResponse response = httpClient.execute(httpGet); + int statusCode = response.getStatusLine().getStatusCode(); + if (statusCode != HttpResponseStatus.OK.code()) { + throw new RuntimeException("download failed , url:" + downloadLink + " , statusCode:" + statusCode); + } + saveFile(new File(destDir), "mysql-bin." + fileName, response); + } finally { + httpClient.close(); } - saveFile(new File(destDir), "mysql-bin." + fileName, response); } private static void saveFile(File parentFile, String fileName, HttpResponse response) throws IOException {