Skip to content

Commit 4471203

Browse files
committed
Skip closed or null connections in lease, returning only live entries.
1 parent d1cf6f2 commit 4471203

2 files changed

Lines changed: 18 additions & 11 deletions

File tree

httpclient5/src/main/java/org/apache/hc/client5/http/impl/nio/H2SharingConnPool.java

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -270,16 +270,18 @@ long track(final PoolEntry<T, C> entry) {
270270
PoolEntry<T, C> lease() {
271271
lock.lock();
272272
try {
273-
final PoolEntry<T, C> entry = entryMap.entrySet().stream()
273+
return entryMap.entrySet().stream()
274+
.filter(e -> {
275+
final C conn = e.getKey().getConnection();
276+
return conn != null && conn.isOpen();
277+
})
274278
.min(Comparator.comparingLong(e -> e.getValue().get()))
275279
.map(Map.Entry::getKey)
280+
.map(e -> {
281+
entryMap.get(e).incrementAndGet();
282+
return e;
283+
})
276284
.orElse(null);
277-
if (entry == null) {
278-
return null;
279-
}
280-
final AtomicLong counter = getCounter(entry);
281-
counter.incrementAndGet();
282-
return entry;
283285
} finally {
284286
lock.unlock();
285287
}

httpclient5/src/test/java/org/apache/hc/client5/http/impl/nio/H2SharingConnPoolTest.java

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -86,10 +86,16 @@ void testLeaseFutureReturned() throws Exception {
8686
@Test
8787
void testLeaseExistingConnectionReturned() throws Exception {
8888
final PoolEntry<String, HttpConnection> poolEntry = new PoolEntry<>(DEFAULT_ROUTE);
89-
final H2SharingConnPool.PerRoutePool<String, HttpConnection> routePool = h2SharingPool.getPerRoutePool(DEFAULT_ROUTE);
89+
final HttpConnection conn = Mockito.mock(HttpConnection.class);
90+
Mockito.when(conn.isOpen()).thenReturn(true);
91+
poolEntry.assignConnection(conn);
92+
93+
final H2SharingConnPool.PerRoutePool<String, HttpConnection> routePool =
94+
h2SharingPool.getPerRoutePool(DEFAULT_ROUTE);
9095
routePool.track(poolEntry);
96+
final Future<PoolEntry<String, HttpConnection>> future =
97+
h2SharingPool.lease(DEFAULT_ROUTE, null, Timeout.ONE_MILLISECOND, callback);
9198

92-
final Future<PoolEntry<String, HttpConnection>> future = h2SharingPool.lease(DEFAULT_ROUTE, null, Timeout.ONE_MILLISECOND, callback);
9399
Assertions.assertNotNull(future);
94100
Assertions.assertSame(poolEntry, future.get());
95101

@@ -98,8 +104,7 @@ void testLeaseExistingConnectionReturned() throws Exception {
98104
Mockito.any(),
99105
Mockito.any(),
100106
Mockito.any());
101-
Mockito.verify(callback).completed(
102-
Mockito.same(poolEntry));
107+
Mockito.verify(callback).completed(Mockito.same(poolEntry));
103108
}
104109

105110
@Test

0 commit comments

Comments
 (0)