From b15dcf73f6a9b71da045bc471697702d99e871af Mon Sep 17 00:00:00 2001 From: Basil Crow Date: Tue, 9 Jan 2024 08:15:22 -0800 Subject: [PATCH] Avoid continual thread replacement in `JarCacheSupport` (#717) --- src/main/java/hudson/remoting/JarCacheSupport.java | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/src/main/java/hudson/remoting/JarCacheSupport.java b/src/main/java/hudson/remoting/JarCacheSupport.java index ff898f5ac..d10ce3858 100644 --- a/src/main/java/hudson/remoting/JarCacheSupport.java +++ b/src/main/java/hudson/remoting/JarCacheSupport.java @@ -6,6 +6,10 @@ import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; import java.util.concurrent.ExecutorService; +import java.util.concurrent.LinkedBlockingQueue; +import java.util.concurrent.ThreadFactory; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; import java.util.logging.Level; import java.util.logging.Logger; @@ -40,10 +44,17 @@ public abstract class JarCacheSupport extends JarCache { /** * Throttle the jar downloading activity so that it won't eat up all the channel bandwidth. */ - private final ExecutorService downloader = new AtmostOneThreadExecutor( + private final ExecutorService downloader = newCachingSingleThreadExecutor( new NamingThreadFactory(new DaemonThreadFactory(), JarCacheSupport.class.getSimpleName()) ); + private static ExecutorService newCachingSingleThreadExecutor(ThreadFactory threadFactory) { + ThreadPoolExecutor threadPoolExecutor = + new ThreadPoolExecutor(1, 1, 60L, TimeUnit.SECONDS, new LinkedBlockingQueue<>(), threadFactory); + threadPoolExecutor.allowCoreThreadTimeOut(true); + return threadPoolExecutor; + } + @Override @NonNull public CompletableFuture resolve(@NonNull final Channel channel, final long sum1, final long sum2) throws IOException, InterruptedException {