From 30615ae6155ce9b83e104c64d61413068d5ddce5 Mon Sep 17 00:00:00 2001 From: David Walluck Date: Mon, 24 Aug 2026 15:33:35 -0400 Subject: [PATCH 1/3] Fix `doShutdown()` task counting The `doShutdown()` method counted the number of threads created rather than the number of tasks submitted. It was also off by one when draining. --- .../INTERNAL/conn/ConnectionManagerCache.java | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/src/main/java/org/commonjava/util/jhttpc/INTERNAL/conn/ConnectionManagerCache.java b/src/main/java/org/commonjava/util/jhttpc/INTERNAL/conn/ConnectionManagerCache.java index fdb0cca..821bca2 100644 --- a/src/main/java/org/commonjava/util/jhttpc/INTERNAL/conn/ConnectionManagerCache.java +++ b/src/main/java/org/commonjava/util/jhttpc/INTERNAL/conn/ConnectionManagerCache.java @@ -126,22 +126,30 @@ private synchronized boolean doShutdown( Function svc = new ExecutorCompletionService<>( exec ); - cache.forEach( ( config, tracker ) -> svc.submit( () -> shutdownAction.apply( tracker ) ) ); + + int submitted = 0; + for ( ConnectionManagerTracker tracker : cache.values() ) + { + svc.submit( () -> shutdownAction.apply( tracker ) ); + submitted++; + } boolean result = true; - while ( counter.getAndDecrement() > 0 ) + for ( int i = 0; i < submitted; i++ ) { try { - result = result && svc.take().get(); + boolean shutDown = svc.take().get(); + result = result && shutDown; } catch ( ExecutionException e ) { - logger.warn( "Error executing shutdown of connection managers." ); + logger.warn( "Error executing shutdown of connection managers.", e ); result = false; } } + exec.shutdown(); timer.cancel(); shutdown = true; cache.clear(); From eef80b4f10093909924ba2a76fddf87e4d250bb1 Mon Sep 17 00:00:00 2001 From: David Walluck Date: Wed, 26 Aug 2026 09:26:20 -0400 Subject: [PATCH 2/3] Graceful shutdown and reassert interrupt --- .../INTERNAL/conn/ConnectionManagerCache.java | 50 ++++++++++--------- 1 file changed, 27 insertions(+), 23 deletions(-) diff --git a/src/main/java/org/commonjava/util/jhttpc/INTERNAL/conn/ConnectionManagerCache.java b/src/main/java/org/commonjava/util/jhttpc/INTERNAL/conn/ConnectionManagerCache.java index 821bca2..ce98a73 100644 --- a/src/main/java/org/commonjava/util/jhttpc/INTERNAL/conn/ConnectionManagerCache.java +++ b/src/main/java/org/commonjava/util/jhttpc/INTERNAL/conn/ConnectionManagerCache.java @@ -106,6 +106,7 @@ public boolean shutdownNow() } catch ( InterruptedException e ) { + Thread.currentThread().interrupt(); logger.warn( "Interrupted while shutting down connection manager cache." ); } @@ -125,36 +126,39 @@ private synchronized boolean doShutdown( Function svc = new ExecutorCompletionService<>( exec ); - - int submitted = 0; - for ( ConnectionManagerTracker tracker : cache.values() ) + try { - svc.submit( () -> shutdownAction.apply( tracker ) ); - submitted++; - } + ExecutorCompletionService svc = new ExecutorCompletionService<>( exec ); - boolean result = true; - for ( int i = 0; i < submitted; i++ ) - { - try + int submitted = 0; + for ( ConnectionManagerTracker tracker : cache.values() ) { - boolean shutDown = svc.take().get(); - result = result && shutDown; + svc.submit( () -> shutdownAction.apply( tracker ) ); + submitted++; } - catch ( ExecutionException e ) + + boolean result = true; + for ( int i = 0; i < submitted; i++ ) { - logger.warn( "Error executing shutdown of connection managers.", e ); - result = false; + try + { + boolean shutDown = svc.take().get(); + result = result && shutDown; + } + catch ( ExecutionException e ) + { + logger.warn( "Error executing shutdown of connection managers.", e ); + result = false; + } } - } - - exec.shutdown(); - timer.cancel(); - shutdown = true; - cache.clear(); - return result; + return result; + } + finally + { + exec.shutdown(); + timer.cancel(); + } } @Override From c179c859c2c1d3709cf1554b4b1c010778febc1a Mon Sep 17 00:00:00 2001 From: David Walluck Date: Wed, 26 Aug 2026 09:30:04 -0400 Subject: [PATCH 3/3] Change submission loop --- .../jhttpc/INTERNAL/conn/ConnectionManagerCache.java | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/src/main/java/org/commonjava/util/jhttpc/INTERNAL/conn/ConnectionManagerCache.java b/src/main/java/org/commonjava/util/jhttpc/INTERNAL/conn/ConnectionManagerCache.java index ce98a73..f1de480 100644 --- a/src/main/java/org/commonjava/util/jhttpc/INTERNAL/conn/ConnectionManagerCache.java +++ b/src/main/java/org/commonjava/util/jhttpc/INTERNAL/conn/ConnectionManagerCache.java @@ -129,14 +129,8 @@ private synchronized boolean doShutdown( Function svc = new ExecutorCompletionService<>( exec ); - - int submitted = 0; - for ( ConnectionManagerTracker tracker : cache.values() ) - { - svc.submit( () -> shutdownAction.apply( tracker ) ); - submitted++; - } - + int submitted = cache.size(); + cache.values().forEach( tracker -> svc.submit( () -> shutdownAction.apply( tracker ) ) ); boolean result = true; for ( int i = 0; i < submitted; i++ ) {