From 64d91e8ea35799bae2739d8392b5705627d7758a Mon Sep 17 00:00:00 2001 From: Brett Wooldridge Date: Thu, 18 Jan 2018 04:15:48 +0900 Subject: [PATCH] Fixes #1060 (Really) support experimental throw-if-suspended functionality. --- .../zaxxer/hikari/util/SuspendResumeLock.java | 5 +- .../zaxxer/hikari/pool/TestConnections.java | 53 +++++++++++++++++++ 2 files changed, 56 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/zaxxer/hikari/util/SuspendResumeLock.java b/src/main/java/com/zaxxer/hikari/util/SuspendResumeLock.java index 78ad0076..222e4055 100644 --- a/src/main/java/com/zaxxer/hikari/util/SuspendResumeLock.java +++ b/src/main/java/com/zaxxer/hikari/util/SuspendResumeLock.java @@ -64,10 +64,11 @@ public class SuspendResumeLock if (acquisitionSemaphore.tryAcquire()) { return; } - - if (Boolean.getBoolean("com.zaxxer.hikari.throwIfSuspended")) { + else if (Boolean.getBoolean("com.zaxxer.hikari.throwIfSuspended")) { throw new SQLTransientException("The pool is currently suspended and configured to throw exceptions upon acquisition"); } + + acquisitionSemaphore.acquireUninterruptibly(); } public void release() diff --git a/src/test/java/com/zaxxer/hikari/pool/TestConnections.java b/src/test/java/com/zaxxer/hikari/pool/TestConnections.java index 7de2af79..5e057df3 100644 --- a/src/test/java/com/zaxxer/hikari/pool/TestConnections.java +++ b/src/test/java/com/zaxxer/hikari/pool/TestConnections.java @@ -39,6 +39,7 @@ import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.SQLTransientConnectionException; +import java.sql.SQLTransientException; import java.sql.Statement; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicReference; @@ -459,6 +460,58 @@ public class TestConnections } } + @Test + public void testSuspendResumeWithThrow() throws Exception + { + HikariConfig config = newHikariConfig(); + config.setMinimumIdle(3); + config.setMaximumPoolSize(3); + config.setConnectionTimeout(2500); + config.setAllowPoolSuspension(true); + config.setConnectionTestQuery("VALUES 1"); + config.setDataSourceClassName("com.zaxxer.hikari.mocks.StubDataSource"); + + System.setProperty("com.zaxxer.hikari.throwIfSuspended", "true"); + try (final HikariDataSource ds = new HikariDataSource(config)) { + HikariPool pool = getPool(ds); + while (pool.getTotalConnections() < 3) { + quietlySleep(50); + } + + AtomicReference exception = new AtomicReference<>(); + Thread t = new Thread(() -> { + try { + ds.getConnection(); + ds.getConnection(); + } + catch (Exception e) { + exception.set(e); + } + }); + + try (Connection ignored = ds.getConnection()) { + assertEquals(2, pool.getIdleConnections()); + + pool.suspendPool(); + t.start(); + + quietlySleep(500); + assertEquals(SQLTransientException.class, exception.get().getClass()); + assertEquals(2, pool.getIdleConnections()); + } + + assertEquals(3, pool.getIdleConnections()); + pool.resumePool(); + + try (Connection ignored = ds.getConnection()) { + assertEquals(2, pool.getIdleConnections()); + } + } + finally { + System.getProperties().remove("com.zaxxer.hikari.throwIfSuspended"); + } + } + @Test public void testInitializationFailure1() {