Description
LaxConnPool intentionally does not make strong guarantees about enforcing the maximum size of the connection pools. However, it has poor behaviour when hit with a block of concurrent requests all at once.
e.g. if the pool max size is 2, and 20 lease request all arrive concurrently at once, it may well create 20 connections.
That's because the pool size is limited by the leased size, but there's a gap in the code between testing the size and adding a leased entry:
if (pending.isEmpty() && leased.size() < max) { final PoolEntry<T, C> entry = new PoolEntry<>(route, timeToLive); addLeased(entry);
Thus multiple threads can concurrently pass the leased.size() < max test and thus all create a new PoolEntry.
That can be greatly improved by not using the leased.size() to track pool size, but to have a separate explicit AtomicInteger counting the number of created PoolEntries.
Attachments
Issue Links
- links to