From 6818783370ac17a14126b6a44e56cc65dfd5d833 Mon Sep 17 00:00:00 2001 From: Brett Wooldridge Date: Fri, 10 Oct 2014 10:21:05 +0900 Subject: [PATCH] Improve accuracy of pool stat reporting (at a slight performance cost). --- .../java/com/zaxxer/hikari/pool/HikariPool.java | 14 ++++++++------ .../java/com/zaxxer/hikari/util/ConcurrentBag.java | 2 +- .../test/java/com/zaxxer/hikari/ShutdownTest.java | 12 +++--------- .../java/com/zaxxer/hikari/pool/HikariPool.java | 14 ++++++++------ .../java/com/zaxxer/hikari/util/ConcurrentBag.java | 2 +- .../test/java/com/zaxxer/hikari/ShutdownTest.java | 12 +++--------- 6 files changed, 24 insertions(+), 32 deletions(-) diff --git a/hikaricp-java6/src/main/java/com/zaxxer/hikari/pool/HikariPool.java b/hikaricp-java6/src/main/java/com/zaxxer/hikari/pool/HikariPool.java index cad2181a..7ac45dab 100644 --- a/hikaricp-java6/src/main/java/com/zaxxer/hikari/pool/HikariPool.java +++ b/hikaricp-java6/src/main/java/com/zaxxer/hikari/pool/HikariPool.java @@ -18,6 +18,7 @@ package com.zaxxer.hikari.pool; import static com.zaxxer.hikari.util.ConcurrentBag.STATE_IN_USE; import static com.zaxxer.hikari.util.ConcurrentBag.STATE_NOT_IN_USE; +import static com.zaxxer.hikari.util.ConcurrentBag.STATE_REMOVED; import static com.zaxxer.hikari.util.PoolUtilities.IS_JAVA7; import static com.zaxxer.hikari.util.PoolUtilities.createInstance; import static com.zaxxer.hikari.util.PoolUtilities.createThreadPoolExecutor; @@ -351,7 +352,7 @@ public final class HikariPool implements HikariPoolMBean, IBagStateListener @Override public int getActiveConnections() { - return Math.min(configuration.getMaximumPoolSize(), totalConnections.get() - getIdleConnections()); + return connectionBag.getCount(STATE_IN_USE); } /** {@inheritDoc} */ @@ -365,7 +366,7 @@ public final class HikariPool implements HikariPoolMBean, IBagStateListener @Override public int getTotalConnections() { - return totalConnections.get(); + return connectionBag.size() - connectionBag.getCount(STATE_REMOVED); } /** {@inheritDoc} */ @@ -579,10 +580,11 @@ public final class HikariPool implements HikariPoolMBean, IBagStateListener private void logPoolState(String... prefix) { - int total = totalConnections.get(); - int idle = getIdleConnections(); - LOGGER.debug("{}pool stats {} (total={}, inUse={}, avail={}, waiting={})", (prefix.length > 0 ? prefix[0] : ""), configuration.getPoolName(), total, - total - idle, idle, getThreadsAwaitingConnection()); + if (LOGGER.isDebugEnabled()) { + LOGGER.debug("{}pool stats {} (total={}, inUse={}, avail={}, waiting={})", + (prefix.length > 0 ? prefix[0] : ""), configuration.getPoolName(), + getTotalConnections(), getActiveConnections(), getIdleConnections(), getThreadsAwaitingConnection()); + } } /** diff --git a/hikaricp-java6/src/main/java/com/zaxxer/hikari/util/ConcurrentBag.java b/hikaricp-java6/src/main/java/com/zaxxer/hikari/util/ConcurrentBag.java index 4d47bbc2..e6a93318 100644 --- a/hikaricp-java6/src/main/java/com/zaxxer/hikari/util/ConcurrentBag.java +++ b/hikaricp-java6/src/main/java/com/zaxxer/hikari/util/ConcurrentBag.java @@ -57,7 +57,7 @@ public final class ConcurrentBag public static final int STATE_NOT_IN_USE = 0; public static final int STATE_IN_USE = 1; - private static final int STATE_REMOVED = -1; + public static final int STATE_REMOVED = -1; private static final int STATE_RESERVED = -2; public static abstract class BagEntry diff --git a/hikaricp-java6/src/test/java/com/zaxxer/hikari/ShutdownTest.java b/hikaricp-java6/src/test/java/com/zaxxer/hikari/ShutdownTest.java index ba14cf64..9e7f4fd1 100644 --- a/hikaricp-java6/src/test/java/com/zaxxer/hikari/ShutdownTest.java +++ b/hikaricp-java6/src/test/java/com/zaxxer/hikari/ShutdownTest.java @@ -56,7 +56,7 @@ public class ShutdownTest HikariConfig config = new HikariConfig(); config.setMinimumIdle(0); config.setMaximumPoolSize(10); - config.setInitializationFailFast(true); + config.setInitializationFailFast(false); config.setConnectionTestQuery("VALUES 1"); config.setDataSourceClassName("com.zaxxer.hikari.mocks.StubDataSource"); @@ -81,7 +81,7 @@ public class ShutdownTest threads[i].start(); } - PoolUtilities.quietlySleep(300); + PoolUtilities.quietlySleep(1200); Assert.assertTrue("Totals connection count not as expected, ", pool.getTotalConnections() > 0); @@ -109,7 +109,7 @@ public class ShutdownTest HikariDataSource ds = new HikariDataSource(config); HikariPool pool = TestElf.getPool(ds); - PoolUtilities.quietlySleep(300); + PoolUtilities.quietlySleep(1200); Assert.assertTrue("Totals connection count not as expected, ", pool.getTotalConnections() > 0); @@ -125,8 +125,6 @@ public class ShutdownTest { Assert.assertSame("StubConnection count not as expected", 0, StubConnection.count.get()); - StubConnection.slowCreate = true; - HikariConfig config = new HikariConfig(); config.setMinimumIdle(5); config.setMaximumPoolSize(5); @@ -137,8 +135,6 @@ public class ShutdownTest HikariDataSource ds = new HikariDataSource(config); HikariPool pool = TestElf.getPool(ds); - PoolUtilities.quietlySleep(300); - Assert.assertTrue("Totals connection count not as expected, ", pool.getTotalConnections() == 5); ds.close(); @@ -179,8 +175,6 @@ public class ShutdownTest { Assert.assertSame("StubConnection count not as expected", 0, StubConnection.count.get()); - StubConnection.slowCreate = false; - HikariConfig config = new HikariConfig(); config.setMinimumIdle(5); config.setMaximumPoolSize(5); diff --git a/hikaricp/src/main/java/com/zaxxer/hikari/pool/HikariPool.java b/hikaricp/src/main/java/com/zaxxer/hikari/pool/HikariPool.java index d4846e8b..56d21092 100644 --- a/hikaricp/src/main/java/com/zaxxer/hikari/pool/HikariPool.java +++ b/hikaricp/src/main/java/com/zaxxer/hikari/pool/HikariPool.java @@ -18,6 +18,7 @@ package com.zaxxer.hikari.pool; import static com.zaxxer.hikari.util.ConcurrentBag.STATE_IN_USE; import static com.zaxxer.hikari.util.ConcurrentBag.STATE_NOT_IN_USE; +import static com.zaxxer.hikari.util.ConcurrentBag.STATE_REMOVED; import static com.zaxxer.hikari.util.PoolUtilities.createInstance; import static com.zaxxer.hikari.util.PoolUtilities.createThreadPoolExecutor; import static com.zaxxer.hikari.util.PoolUtilities.elapsedTimeMs; @@ -342,7 +343,7 @@ public final class HikariPool implements HikariPoolMBean, IBagStateListener @Override public int getActiveConnections() { - return Math.min(configuration.getMaximumPoolSize(), totalConnections.get() - getIdleConnections()); + return connectionBag.getCount(STATE_IN_USE); } /** {@inheritDoc} */ @@ -356,7 +357,7 @@ public final class HikariPool implements HikariPoolMBean, IBagStateListener @Override public int getTotalConnections() { - return totalConnections.get(); + return connectionBag.size() - connectionBag.getCount(STATE_REMOVED); } /** {@inheritDoc} */ @@ -558,10 +559,11 @@ public final class HikariPool implements HikariPoolMBean, IBagStateListener private void logPoolState(String... prefix) { - int total = totalConnections.get(); - int idle = getIdleConnections(); - LOGGER.debug("{}pool stats {} (total={}, inUse={}, avail={}, waiting={})", (prefix.length > 0 ? prefix[0] : ""), configuration.getPoolName(), total, - total - idle, idle, getThreadsAwaitingConnection()); + if (LOGGER.isDebugEnabled()) { + LOGGER.debug("{}pool stats {} (total={}, inUse={}, avail={}, waiting={})", + (prefix.length > 0 ? prefix[0] : ""), configuration.getPoolName(), + getTotalConnections(), getActiveConnections(), getIdleConnections(), getThreadsAwaitingConnection()); + } } /** diff --git a/hikaricp/src/main/java/com/zaxxer/hikari/util/ConcurrentBag.java b/hikaricp/src/main/java/com/zaxxer/hikari/util/ConcurrentBag.java index f823f31e..2a08db8b 100644 --- a/hikaricp/src/main/java/com/zaxxer/hikari/util/ConcurrentBag.java +++ b/hikaricp/src/main/java/com/zaxxer/hikari/util/ConcurrentBag.java @@ -56,7 +56,7 @@ public final class ConcurrentBag public static final int STATE_NOT_IN_USE = 0; public static final int STATE_IN_USE = 1; - private static final int STATE_REMOVED = -1; + public static final int STATE_REMOVED = -1; private static final int STATE_RESERVED = -2; public static abstract class BagEntry diff --git a/hikaricp/src/test/java/com/zaxxer/hikari/ShutdownTest.java b/hikaricp/src/test/java/com/zaxxer/hikari/ShutdownTest.java index ba14cf64..9e7f4fd1 100644 --- a/hikaricp/src/test/java/com/zaxxer/hikari/ShutdownTest.java +++ b/hikaricp/src/test/java/com/zaxxer/hikari/ShutdownTest.java @@ -56,7 +56,7 @@ public class ShutdownTest HikariConfig config = new HikariConfig(); config.setMinimumIdle(0); config.setMaximumPoolSize(10); - config.setInitializationFailFast(true); + config.setInitializationFailFast(false); config.setConnectionTestQuery("VALUES 1"); config.setDataSourceClassName("com.zaxxer.hikari.mocks.StubDataSource"); @@ -81,7 +81,7 @@ public class ShutdownTest threads[i].start(); } - PoolUtilities.quietlySleep(300); + PoolUtilities.quietlySleep(1200); Assert.assertTrue("Totals connection count not as expected, ", pool.getTotalConnections() > 0); @@ -109,7 +109,7 @@ public class ShutdownTest HikariDataSource ds = new HikariDataSource(config); HikariPool pool = TestElf.getPool(ds); - PoolUtilities.quietlySleep(300); + PoolUtilities.quietlySleep(1200); Assert.assertTrue("Totals connection count not as expected, ", pool.getTotalConnections() > 0); @@ -125,8 +125,6 @@ public class ShutdownTest { Assert.assertSame("StubConnection count not as expected", 0, StubConnection.count.get()); - StubConnection.slowCreate = true; - HikariConfig config = new HikariConfig(); config.setMinimumIdle(5); config.setMaximumPoolSize(5); @@ -137,8 +135,6 @@ public class ShutdownTest HikariDataSource ds = new HikariDataSource(config); HikariPool pool = TestElf.getPool(ds); - PoolUtilities.quietlySleep(300); - Assert.assertTrue("Totals connection count not as expected, ", pool.getTotalConnections() == 5); ds.close(); @@ -179,8 +175,6 @@ public class ShutdownTest { Assert.assertSame("StubConnection count not as expected", 0, StubConnection.count.get()); - StubConnection.slowCreate = false; - HikariConfig config = new HikariConfig(); config.setMinimumIdle(5); config.setMaximumPoolSize(5);