}
}).start();
}
openedLatch.await();
ConnectionPool pool = ds.getPool();
//Now we have 3 initialized busy connections
Assert.assertEquals(0, pool.getIdle());
Assert.assertEquals(threadsCount, pool.getActive());
Assert.assertEquals(threadsCount, pool.getSize());
List<Thread> threads = new ArrayList<>();
for (int i = 0; i < threadsCount; i++) {
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
try {
ds.getConnection();
} catch (Exception e) {
System.err.println("Step 2:"+e.getMessage());
}
}
});
thread.start();
threads.add(thread);
}
for (Thread thread : threads) {
thread.interrupt();
}
for (Thread thread : threads) {
thread.join();
}
//Still 3 active connections
Assert.assertEquals(0, pool.getIdle());
Assert.assertEquals(threadsCount, pool.getActive());
Assert.assertEquals(threadsCount, pool.getSize());
toCloseLatch.countDown();
closedLatch.await();
//Here comes the bug! No more active connections and unable to establish new connections.
Assert.assertEquals(threadsCount, pool.getIdle()); // <-- Should be threadsCount (3) here
Assert.assertEquals(0, pool.getActive());
Assert.assertEquals(threadsCount, pool.getSize());
final AtomicInteger failedCount = new AtomicInteger();
final ArrayBlockingQueue<Connection> cons = new ArrayBlockingQueue<>(threadsCount);
threads.clear();
for (int i = 0; i < threadsCount; i++) {
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
try {
cons.add(ds.getConnection());
} catch (PoolExhaustedException e) {
failedCount.incrementAndGet();
System.err.println("Step 3:"+e.getMessage());
} catch (Exception e) {
System.err.println("Step 4:"+e.getMessage());
throw new RuntimeException(e);
}
}
});
thread.start();
threads.add(thread);
}
for (Thread thread : threads) {
thread.join();
}
Assert.assertEquals(0, failedCount.get());
Assert.assertEquals(0, pool.getIdle());
Assert.assertEquals(threadsCount, pool.getActive());
Assert.assertEquals(threadsCount, pool.getSize());
for (Connection con : cons) {
con.close();
}
Assert.assertEquals(threadsCount, pool.getIdle());
Assert.assertEquals(0, pool.getActive());
Assert.assertEquals(threadsCount, pool.getSize());
}