From 4847a653f2be9b2cd773592d7cd8c8bdf2ce1d2d Mon Sep 17 00:00:00 2001 From: Nitin Date: Fri, 13 Nov 2015 14:20:09 +0530 Subject: [PATCH] do not add cons if pool is not normal, avoid exceptions in shutdown --- .../java/com/zaxxer/hikari/pool/HikariPool.java | 8 ++++---- .../com/zaxxer/hikari/pool/ShutdownTest.java | 16 ++++++++-------- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/src/main/java/com/zaxxer/hikari/pool/HikariPool.java b/src/main/java/com/zaxxer/hikari/pool/HikariPool.java index f3de3e79..88a3c81a 100644 --- a/src/main/java/com/zaxxer/hikari/pool/HikariPool.java +++ b/src/main/java/com/zaxxer/hikari/pool/HikariPool.java @@ -213,8 +213,6 @@ public class HikariPool extends PoolBase implements HikariPoolMXBean, IBagStateL LOGGER.info("{} - is closing down.", poolName); logPoolState("Before closing\t"); - connectionBag.close(); - softEvictConnections(); addConnectionExecutor.shutdown(); addConnectionExecutor.awaitTermination(5L, TimeUnit.SECONDS); if (config.getScheduledExecutorService() == null) { @@ -222,6 +220,8 @@ public class HikariPool extends PoolBase implements HikariPoolMXBean, IBagStateL houseKeepingExecutorService.awaitTermination(5L, TimeUnit.SECONDS); } + connectionBag.close(); + final ExecutorService assassinExecutor = createThreadPoolExecutor(config.getMaximumPoolSize(), "Hikari connection assassin", config.getThreadFactory(), new ThreadPoolExecutor.CallerRunsPolicy()); try { @@ -561,7 +561,7 @@ public class HikariPool extends PoolBase implements HikariPoolMXBean, IBagStateL public Boolean call() throws Exception { long sleepBackoff = 200L; - while (totalConnections.get() < config.getMaximumPoolSize()) { + while (poolState == POOL_NORMAL && totalConnections.get() < config.getMaximumPoolSize()) { final PoolEntry poolEntry = createPoolEntry(); if (poolEntry != null) { totalConnections.incrementAndGet(); @@ -573,7 +573,7 @@ public class HikariPool extends PoolBase implements HikariPoolMXBean, IBagStateL quietlySleep(sleepBackoff); sleepBackoff = Math.min(connectionTimeout / 2, (long) (sleepBackoff * 1.3)); } - // Pool is at max size + // Pool is suspended or shutdown or at max size return Boolean.FALSE; } } diff --git a/src/test/java/com/zaxxer/hikari/pool/ShutdownTest.java b/src/test/java/com/zaxxer/hikari/pool/ShutdownTest.java index 9d9bc5ac..dfc9bf5f 100644 --- a/src/test/java/com/zaxxer/hikari/pool/ShutdownTest.java +++ b/src/test/java/com/zaxxer/hikari/pool/ShutdownTest.java @@ -87,13 +87,13 @@ public class ShutdownTest UtilityElf.quietlySleep(1200L); - Assert.assertTrue("Totals connection count not as expected, ", pool.getTotalConnections() > 0); + Assert.assertTrue("Total connection count not as expected, ", pool.getTotalConnections() > 0); ds.close(); Assert.assertSame("Active connection count not as expected, ", 0, pool.getActiveConnections()); Assert.assertSame("Idle connection count not as expected, ", 0, pool.getIdleConnections()); - Assert.assertSame("Total connection count not as expected", 0, pool.getTotalConnections()); + Assert.assertSame("Total connection count not as expected, ", 0, pool.getTotalConnections()); Assert.assertTrue(ds.isClosed()); } @@ -116,13 +116,13 @@ public class ShutdownTest UtilityElf.quietlySleep(1200L); - Assert.assertTrue("Totals connection count not as expected, ", pool.getTotalConnections() > 0); + Assert.assertTrue("Total connection count not as expected, ", pool.getTotalConnections() > 0); ds.close(); Assert.assertSame("Active connection count not as expected, ", 0, pool.getActiveConnections()); Assert.assertSame("Idle connection count not as expected, ", 0, pool.getIdleConnections()); - Assert.assertSame("Total connection count not as expected", 0, pool.getTotalConnections()); + Assert.assertSame("Total connection count not as expected, ", 0, pool.getTotalConnections()); Assert.assertTrue(ds.toString().startsWith("HikariDataSource (") && ds.toString().endsWith(")")); } @@ -145,13 +145,13 @@ public class ShutdownTest UtilityElf.quietlySleep(1200L); - Assert.assertTrue("Totals connection count not as expected, ", pool.getTotalConnections() == 5); + Assert.assertTrue("Total connection count not as expected, ", pool.getTotalConnections() == 5); ds.close(); Assert.assertSame("Active connection count not as expected, ", 0, pool.getActiveConnections()); Assert.assertSame("Idle connection count not as expected, ", 0, pool.getIdleConnections()); - Assert.assertSame("Total connection count not as expected", 0, pool.getTotalConnections()); + Assert.assertSame("Total connection count not as expected, ", 0, pool.getTotalConnections()); } @Test @@ -200,13 +200,13 @@ public class ShutdownTest connections[i] = ds.getConnection(); } - Assert.assertTrue("Totals connection count not as expected, ", pool.getTotalConnections() == 5); + Assert.assertTrue("Total connection count not as expected, ", pool.getTotalConnections() == 5); ds.close(); Assert.assertSame("Active connection count not as expected, ", 0, pool.getActiveConnections()); Assert.assertSame("Idle connection count not as expected, ", 0, pool.getIdleConnections()); - Assert.assertSame("Total connection count not as expected", 0, pool.getTotalConnections()); + Assert.assertSame("Total connection count not as expected, ", 0, pool.getTotalConnections()); } @Test