diff --git a/src/main/java/io/vertx/core/net/impl/pool/SimpleConnectionPool.java b/src/main/java/io/vertx/core/net/impl/pool/SimpleConnectionPool.java index dd7c95bb149..c11a7b88426 100644 --- a/src/main/java/io/vertx/core/net/impl/pool/SimpleConnectionPool.java +++ b/src/main/java/io/vertx/core/net/impl/pool/SimpleConnectionPool.java @@ -850,7 +850,7 @@ void addFirst(PoolWaiter node) { } node.queued = true; node.prev = head; - node.next = head.prev; + node.next = head.next; head.next.prev = node; head.next = node; size++; diff --git a/src/test/java/io/vertx/core/net/impl/pool/ConnectionPoolTest.java b/src/test/java/io/vertx/core/net/impl/pool/ConnectionPoolTest.java index 121ed8838d7..2d3463de50e 100644 --- a/src/test/java/io/vertx/core/net/impl/pool/ConnectionPoolTest.java +++ b/src/test/java/io/vertx/core/net/impl/pool/ConnectionPoolTest.java @@ -206,6 +206,30 @@ public void testEmptyConcurrency() { await(); } + @Test + public void testEmptyConcurrencyWithManyWaiters() { + ContextInternal context = vertx.createEventLoopContext(); + ConnectionManager mgr = new ConnectionManager(); + ConnectionPool pool = ConnectionPool.pool(mgr, new int[] { 1 }, 3); + Connection expected = new Connection(); + AtomicInteger seq = new AtomicInteger(); + for (int i = 0;i < 3;i++) { + int expectedSeq = i + 1; + pool.acquire(context, 0, onSuccess(lease -> { + assertSame(lease.get(), expected); + assertEquals(expectedSeq, seq.getAndIncrement()); + if (expectedSeq == 3) { + testComplete(); + } + })); + } + ConnectionRequest request = mgr.assertRequest(); + request.concurrency(0).connect(expected, 0); + assertEquals(0, seq.getAndIncrement()); + request.concurrency(3); + await(); + } + @Test public void testDecreaseConcurrency() throws Exception { ConnectionManager mgr = new ConnectionManager();