From 155e4c7662cce76792d055ce1c79bbce11b14b16 Mon Sep 17 00:00:00 2001 From: Guruprasad Bhat Date: Mon, 29 Dec 2025 16:34:30 +0530 Subject: [PATCH 1/5] Add a property to disable client object caching --- src/main/java/io/jenkins/docker/client/DockerAPI.java | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/main/java/io/jenkins/docker/client/DockerAPI.java b/src/main/java/io/jenkins/docker/client/DockerAPI.java index 5da9f7042..109898d29 100644 --- a/src/main/java/io/jenkins/docker/client/DockerAPI.java +++ b/src/main/java/io/jenkins/docker/client/DockerAPI.java @@ -34,6 +34,7 @@ import java.util.Objects; import java.util.concurrent.TimeUnit; import jenkins.model.Jenkins; +import jenkins.util.SystemProperties; import org.jenkinsci.plugins.docker.commons.credentials.DockerServerCredentials; import org.jenkinsci.plugins.docker.commons.credentials.DockerServerEndpoint; import org.kohsuke.stapler.AncestorInPath; @@ -64,6 +65,9 @@ public class DockerAPI extends AbstractDescribableImpl { private String hostname; + private static boolean DISABLE_CLIENT_CACHE = + SystemProperties.getBoolean("io.jenkins.docker.client.DockerAPI.DISABLE_CLIENT_CACHE", false); + /** * Is this host actually a swarm? */ @@ -204,7 +208,9 @@ private static DockerClient getOrMakeClient( client = makeClient( dockerUri, credentialsId, readTimeoutInMillisecondsOrNull, connectTimeoutInMillisecondsOrNull); LOGGER.info("Cached connection {} to {}", client, cacheKey); - CLIENT_CACHE.cacheAndIncrementUsage(cacheKey, client); + if (!DISABLE_CLIENT_CACHE) { + CLIENT_CACHE.cacheAndIncrementUsage(cacheKey, client); + } } return client; } From d808649441b9a804cca7866448897e9f5d5edd4a Mon Sep 17 00:00:00 2001 From: Guruprasad Bhat Date: Mon, 29 Dec 2025 21:21:58 +0530 Subject: [PATCH 2/5] fix the cache disable logic --- .../io/jenkins/docker/client/DockerAPI.java | 33 +++++++++++++++---- 1 file changed, 27 insertions(+), 6 deletions(-) diff --git a/src/main/java/io/jenkins/docker/client/DockerAPI.java b/src/main/java/io/jenkins/docker/client/DockerAPI.java index 109898d29..42304aa8c 100644 --- a/src/main/java/io/jenkins/docker/client/DockerAPI.java +++ b/src/main/java/io/jenkins/docker/client/DockerAPI.java @@ -200,6 +200,14 @@ private static DockerClient getOrMakeClient( final String dockerUri, final String credentialsId, final int readTimeout, final int connectTimeout) { final Integer readTimeoutInMillisecondsOrNull = readTimeout > 0 ? readTimeout * 1000 : null; final Integer connectTimeoutInMillisecondsOrNull = connectTimeout > 0 ? connectTimeout * 1000 : null; + + if (DISABLE_CLIENT_CACHE) { + SharableDockerClient client = makeClient( + dockerUri, credentialsId, readTimeoutInMillisecondsOrNull, connectTimeoutInMillisecondsOrNull); + LOGGER.info("Created non-cached connection {} to {}", client, dockerUri); + return client; + } + final DockerClientParameters cacheKey = new DockerClientParameters( dockerUri, credentialsId, readTimeoutInMillisecondsOrNull, connectTimeoutInMillisecondsOrNull); synchronized (CLIENT_CACHE) { @@ -207,10 +215,9 @@ private static DockerClient getOrMakeClient( if (client == null) { client = makeClient( dockerUri, credentialsId, readTimeoutInMillisecondsOrNull, connectTimeoutInMillisecondsOrNull); + CLIENT_CACHE.cacheAndIncrementUsage(cacheKey, client); + client.setCached(true); LOGGER.info("Cached connection {} to {}", client, cacheKey); - if (!DISABLE_CLIENT_CACHE) { - CLIENT_CACHE.cacheAndIncrementUsage(cacheKey, client); - } } return client; } @@ -223,18 +230,32 @@ private static DockerClient getOrMakeClient( */ private static class SharableDockerClient extends DelegatingDockerClient { + private boolean cached = false; + public SharableDockerClient(DockerClient delegate) { super(delegate); } + /** + * Sets whether this client is managed by the cache. + */ + public void setCached(boolean cached) { + this.cached = cached; + } + /** * Tell the cache we no longer need the {@link DockerClient} and it can * be thrown away if it remains unused. + * If the client is not cached, close it immediately. */ @Override - public void close() { - synchronized (CLIENT_CACHE) { - CLIENT_CACHE.decrementUsage(this); + public void close() throws IOException { + if (cached) { + synchronized (CLIENT_CACHE) { + CLIENT_CACHE.decrementUsage(this); + } + } else { + reallyClose(); } } From 359503adab7af1adfb3ba893bcc122a5beea8fab Mon Sep 17 00:00:00 2001 From: Guruprasad Bhat Date: Mon, 29 Dec 2025 22:18:50 +0530 Subject: [PATCH 3/5] reduce log level to debug for connection creation logs --- src/main/java/io/jenkins/docker/client/DockerAPI.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/io/jenkins/docker/client/DockerAPI.java b/src/main/java/io/jenkins/docker/client/DockerAPI.java index 42304aa8c..0684720a9 100644 --- a/src/main/java/io/jenkins/docker/client/DockerAPI.java +++ b/src/main/java/io/jenkins/docker/client/DockerAPI.java @@ -204,7 +204,7 @@ private static DockerClient getOrMakeClient( if (DISABLE_CLIENT_CACHE) { SharableDockerClient client = makeClient( dockerUri, credentialsId, readTimeoutInMillisecondsOrNull, connectTimeoutInMillisecondsOrNull); - LOGGER.info("Created non-cached connection {} to {}", client, dockerUri); + LOGGER.debug("Created non-cached connection {} to {}", client, dockerUri); return client; } @@ -217,7 +217,7 @@ private static DockerClient getOrMakeClient( dockerUri, credentialsId, readTimeoutInMillisecondsOrNull, connectTimeoutInMillisecondsOrNull); CLIENT_CACHE.cacheAndIncrementUsage(cacheKey, client); client.setCached(true); - LOGGER.info("Cached connection {} to {}", client, cacheKey); + LOGGER.debug("Cached connection {} to {}", client, cacheKey); } return client; } From ff3ea299f25d41b4651e735c47e065c71c806a27 Mon Sep 17 00:00:00 2001 From: Guruprasad Bhat Date: Tue, 30 Dec 2025 09:48:02 +0530 Subject: [PATCH 4/5] minor fix to the javadoc --- src/main/java/com/example/DockerClientWrapper.java | 1 + src/main/java/io/jenkins/docker/client/DockerAPI.java | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) create mode 100644 src/main/java/com/example/DockerClientWrapper.java diff --git a/src/main/java/com/example/DockerClientWrapper.java b/src/main/java/com/example/DockerClientWrapper.java new file mode 100644 index 000000000..8b1378917 --- /dev/null +++ b/src/main/java/com/example/DockerClientWrapper.java @@ -0,0 +1 @@ + diff --git a/src/main/java/io/jenkins/docker/client/DockerAPI.java b/src/main/java/io/jenkins/docker/client/DockerAPI.java index 0684720a9..6b04627ac 100644 --- a/src/main/java/io/jenkins/docker/client/DockerAPI.java +++ b/src/main/java/io/jenkins/docker/client/DockerAPI.java @@ -225,8 +225,8 @@ private static DockerClient getOrMakeClient( /** * A docker-client that, when {@link Closeable#close()} is called, merely - * decrements the usage count. It'll only get properly closed once it's - * purged from the cache. + * decrements the usage count - when {@code DISABLE_CLIENT_CACHE} is not enabled. It'll only get properly closed + * once it's purged from the cache. */ private static class SharableDockerClient extends DelegatingDockerClient { From 777fa13b9ecf78efa8d80ee7999eb4e53a3a7efe Mon Sep 17 00:00:00 2001 From: Guruprasad Bhat Date: Tue, 30 Dec 2025 20:19:01 +0530 Subject: [PATCH 5/5] remove uninteded file addition --- src/main/java/com/example/DockerClientWrapper.java | 1 - 1 file changed, 1 deletion(-) delete mode 100644 src/main/java/com/example/DockerClientWrapper.java diff --git a/src/main/java/com/example/DockerClientWrapper.java b/src/main/java/com/example/DockerClientWrapper.java deleted file mode 100644 index 8b1378917..000000000 --- a/src/main/java/com/example/DockerClientWrapper.java +++ /dev/null @@ -1 +0,0 @@ -