@Override public String toString() { final PoolStats totalStats = getTotalStats(); final StringBuilder buffer = new StringBuilder(); buffer.append("[leased: "); buffer.append(totalStats.getLeased()); buffer.append("][available: "); buffer.append(totalStats.getAvailable()); buffer.append("][pending: "); buffer.append(totalStats.getPending()); buffer.append("]"); return buffer.toString(); }
@Override public void onLease(final HttpHost route, final ConnPoolStats<HttpHost> connPoolStats) { if (connLog.isDebugEnabled()) { final StringBuilder buf = new StringBuilder(); buf.append("Leased ").append(route).append(" "); final PoolStats totals = connPoolStats.getTotalStats(); buf.append(" total kept alive: ").append(totals.getAvailable()).append("; "); buf.append("total allocated: ").append(totals.getLeased() + totals.getAvailable()); buf.append(" of ").append(totals.getMax()); connLog.debug(buf.toString()); } }
@Override public PoolStats getTotalStats() { this.lock.lock(); try { return new PoolStats( this.leased.size(), this.leasingRequests.size(), this.available.size(), this.maxTotal); } finally { this.lock.unlock(); } }
@Test public void testEmptyPool() throws Exception { final StrictConnPool<String, HttpConnection> pool = new StrictConnPool<>(2, 10); final PoolStats totals = pool.getTotalStats(); Assert.assertEquals(0, totals.getAvailable()); Assert.assertEquals(0, totals.getLeased()); Assert.assertEquals(0, totals.getPending()); Assert.assertEquals(10, totals.getMax()); Assert.assertEquals(Collections.emptySet(), pool.getRoutes()); final PoolStats stats = pool.getStats("somehost"); Assert.assertEquals(0, stats.getAvailable()); Assert.assertEquals(0, stats.getLeased()); Assert.assertEquals(0, stats.getPending()); Assert.assertEquals(2, stats.getMax()); Assert.assertEquals("[leased: 0][available: 0][pending: 0]", pool.toString()); }
@Test public void testLeaseRequestCanceled() throws Exception { final StrictConnPool<String, HttpConnection> pool = new StrictConnPool<>(1, 1); final Future<PoolEntry<String, HttpConnection>> future1 = pool.lease("somehost", null, Timeout.ofMilliseconds(0), null); Assert.assertTrue(future1.isDone()); final PoolEntry<String, HttpConnection> entry1 = future1.get(); Assert.assertNotNull(entry1); entry1.assignConnection(Mockito.mock(HttpConnection.class)); final Future<PoolEntry<String, HttpConnection>> future2 = pool.lease("somehost", null, Timeout.ofMilliseconds(0), null); future2.cancel(true); pool.release(entry1, true); final PoolStats totals = pool.getTotalStats(); Assert.assertEquals(1, totals.getAvailable()); Assert.assertEquals(0, totals.getLeased()); }
@Test public void testEmptyPool() throws Exception { final LaxConnPool<String, HttpConnection> pool = new LaxConnPool<>(2); final PoolStats totals = pool.getTotalStats(); Assert.assertEquals(0, totals.getAvailable()); Assert.assertEquals(0, totals.getLeased()); Assert.assertEquals(0, totals.getPending()); Assert.assertEquals(0, totals.getMax()); Assert.assertEquals(Collections.emptySet(), pool.getRoutes()); final PoolStats stats = pool.getStats("somehost"); Assert.assertEquals(0, stats.getAvailable()); Assert.assertEquals(0, stats.getLeased()); Assert.assertEquals(0, stats.getPending()); Assert.assertEquals(2, stats.getMax()); Assert.assertEquals("[leased: 0][available: 0][pending: 0]", pool.toString()); }
@Test public void testLeaseRequestCanceled() throws Exception { final LaxConnPool<String, HttpConnection> pool = new LaxConnPool<>(1); final Future<PoolEntry<String, HttpConnection>> future1 = pool.lease("somehost", null, Timeout.ofMilliseconds(0), null); Assert.assertTrue(future1.isDone()); final PoolEntry<String, HttpConnection> entry1 = future1.get(); Assert.assertNotNull(entry1); entry1.assignConnection(Mockito.mock(HttpConnection.class)); final Future<PoolEntry<String, HttpConnection>> future2 = pool.lease("somehost", null, Timeout.ofMilliseconds(0), null); future2.cancel(true); pool.release(entry1, true); final PoolStats totals = pool.getTotalStats(); Assert.assertEquals(1, totals.getAvailable()); Assert.assertEquals(0, totals.getLeased()); }
@Override public String toString() { final PoolStats totalStats = getTotalStats(); final StringBuilder buffer = new StringBuilder(); buffer.append("[leased: "); buffer.append(totalStats.getLeased()); buffer.append("][available: "); buffer.append(totalStats.getAvailable()); buffer.append("][pending: "); buffer.append(totalStats.getPending()); buffer.append("]"); return buffer.toString(); }
@Override public void onRelease(final HttpHost route, final ConnPoolStats<HttpHost> connPoolStats) { if (connLog.isDebugEnabled()) { final StringBuilder buf = new StringBuilder(); buf.append("Released ").append(route).append(" "); final PoolStats totals = connPoolStats.getTotalStats(); buf.append(" total kept alive: ").append(totals.getAvailable()).append("; "); buf.append("total allocated: ").append(totals.getLeased() + totals.getAvailable()); buf.append(" of ").append(totals.getMax()); connLog.debug(buf.toString()); } }
@Test public void testCreateNewIfExpired() throws Exception { final HttpConnection conn1 = Mockito.mock(HttpConnection.class); final LaxConnPool<String, HttpConnection> pool = new LaxConnPool<>(2); final Future<PoolEntry<String, HttpConnection>> future1 = pool.lease("somehost", null); Assert.assertTrue(future1.isDone()); final PoolEntry<String, HttpConnection> entry1 = future1.get(); Assert.assertNotNull(entry1); entry1.assignConnection(conn1); entry1.updateExpiry(TimeValue.of(1, TimeUnit.MILLISECONDS)); pool.release(entry1, true); Thread.sleep(200L); final Future<PoolEntry<String, HttpConnection>> future2 = pool.lease("somehost", null); Assert.assertTrue(future2.isDone()); Mockito.verify(conn1).close(CloseMode.GRACEFUL); final PoolStats totals = pool.getTotalStats(); Assert.assertEquals(0, totals.getAvailable()); Assert.assertEquals(1, totals.getLeased()); Assert.assertEquals(Collections.singleton("somehost"), pool.getRoutes()); final PoolStats stats = pool.getStats("somehost"); Assert.assertEquals(0, stats.getAvailable()); Assert.assertEquals(1, stats.getLeased()); }
@Override public PoolStats getTotalStats() { this.lock.lock(); try { return new PoolStats( this.leased.size(), this.leasingRequests.size(), this.available.size(), this.maxTotal); } finally { this.lock.unlock(); } }
@Test public void testLeaseRelease() throws Exception { final HttpConnection conn1 = Mockito.mock(HttpConnection.class); final HttpConnection conn2 = Mockito.mock(HttpConnection.class); final HttpConnection conn3 = Mockito.mock(HttpConnection.class); final LaxConnPool<String, HttpConnection> pool = new LaxConnPool<>(2); final Future<PoolEntry<String, HttpConnection>> future1 = pool.lease("somehost", null); final Future<PoolEntry<String, HttpConnection>> future2 = pool.lease("somehost", null); final Future<PoolEntry<String, HttpConnection>> future3 = pool.lease("otherhost", null); final PoolEntry<String, HttpConnection> entry1 = future1.get(); Assert.assertNotNull(entry1); entry1.assignConnection(conn1); final PoolEntry<String, HttpConnection> entry2 = future2.get(); Assert.assertNotNull(entry2); entry2.assignConnection(conn2); final PoolEntry<String, HttpConnection> entry3 = future3.get(); Assert.assertNotNull(entry3); entry3.assignConnection(conn3); pool.release(entry1, true); pool.release(entry2, true); pool.release(entry3, false); Mockito.verify(conn1, Mockito.never()).close(ArgumentMatchers.<CloseMode>any()); Mockito.verify(conn2, Mockito.never()).close(ArgumentMatchers.<CloseMode>any()); Mockito.verify(conn3, Mockito.times(1)).close(CloseMode.GRACEFUL); final PoolStats totals = pool.getTotalStats(); Assert.assertEquals(2, totals.getAvailable()); Assert.assertEquals(0, totals.getLeased()); Assert.assertEquals(0, totals.getPending()); }
@Override public void onLease(final HttpHost route, final ConnPoolStats<HttpHost> connPoolStats) { if (connLog.isDebugEnabled()) { final StringBuilder buf = new StringBuilder(); buf.append("Leased ").append(route).append(" "); final PoolStats totals = connPoolStats.getTotalStats(); buf.append(" total kept alive: ").append(totals.getAvailable()).append("; "); buf.append("total allocated: ").append(totals.getLeased() + totals.getAvailable()); buf.append(" of ").append(totals.getMax()); connLog.debug(buf.toString()); } }
@Test public void testCreateNewIfExpired() throws Exception { final HttpConnection conn1 = Mockito.mock(HttpConnection.class); final StrictConnPool<String, HttpConnection> pool = new StrictConnPool<>(2, 2); final Future<PoolEntry<String, HttpConnection>> future1 = pool.lease("somehost", null); Assert.assertTrue(future1.isDone()); final PoolEntry<String, HttpConnection> entry1 = future1.get(); Assert.assertNotNull(entry1); entry1.assignConnection(conn1); entry1.updateExpiry(TimeValue.of(1, TimeUnit.MILLISECONDS)); pool.release(entry1, true); Thread.sleep(200L); final Future<PoolEntry<String, HttpConnection>> future2 = pool.lease("somehost", null); Assert.assertTrue(future2.isDone()); Mockito.verify(conn1).close(CloseMode.GRACEFUL); final PoolStats totals = pool.getTotalStats(); Assert.assertEquals(0, totals.getAvailable()); Assert.assertEquals(1, totals.getLeased()); Assert.assertEquals(Collections.singleton("somehost"), pool.getRoutes()); final PoolStats stats = pool.getStats("somehost"); Assert.assertEquals(0, stats.getAvailable()); Assert.assertEquals(1, stats.getLeased()); }
@Override public PoolStats getTotalStats() { int leasedTotal = 0; int pendingTotal = 0; int availableTotal = 0; int maxTotal = 0; for (final PerRoutePool<T, C> routePool : routeToPool.values()) { leasedTotal += routePool.getLeasedCount(); pendingTotal += routePool.getPendingCount(); availableTotal += routePool.getAvailableCount(); maxTotal += routePool.getMax(); } return new PoolStats(leasedTotal, pendingTotal, availableTotal, maxTotal); }
Assert.assertEquals(1, totals.getAvailable()); Assert.assertEquals(0, totals.getLeased()); Assert.assertEquals(0, totals.getPending()); PoolStats stats = pool.getStats("somehost"); Assert.assertEquals(1, stats.getAvailable()); Assert.assertEquals(0, stats.getLeased()); Assert.assertEquals(0, stats.getPending()); Assert.assertEquals(0, totals.getAvailable()); Assert.assertEquals(0, totals.getLeased()); Assert.assertEquals(0, totals.getPending()); stats = pool.getStats("somehost"); Assert.assertEquals(0, stats.getAvailable()); Assert.assertEquals(0, stats.getLeased()); Assert.assertEquals(0, stats.getPending());
@Override public void onRelease(final HttpHost route, final ConnPoolStats<HttpHost> connPoolStats) { if (connLog.isDebugEnabled()) { final StringBuilder buf = new StringBuilder(); buf.append("Released ").append(route).append(" "); final PoolStats totals = connPoolStats.getTotalStats(); buf.append(" total kept alive: ").append(totals.getAvailable()).append("; "); buf.append("total allocated: ").append(totals.getLeased() + totals.getAvailable()); buf.append(" of ").append(totals.getMax()); connLog.debug(buf.toString()); } }
@Override public PoolStats getTotalStats() { int leasedTotal = 0; int pendingTotal = 0; int availableTotal = 0; int maxTotal = 0; for (final PerRoutePool<T, C> routePool : routeToPool.values()) { leasedTotal += routePool.getLeasedCount(); pendingTotal += routePool.getPendingCount(); availableTotal += routePool.getAvailableCount(); maxTotal += routePool.getMax(); } return new PoolStats(leasedTotal, pendingTotal, availableTotal, maxTotal); }
@Test public void testLeaseRelease() throws Exception { final HttpConnection conn1 = Mockito.mock(HttpConnection.class); final HttpConnection conn2 = Mockito.mock(HttpConnection.class); final HttpConnection conn3 = Mockito.mock(HttpConnection.class); final StrictConnPool<String, HttpConnection> pool = new StrictConnPool<>(2, 10); final Future<PoolEntry<String, HttpConnection>> future1 = pool.lease("somehost", null); final Future<PoolEntry<String, HttpConnection>> future2 = pool.lease("somehost", null); final Future<PoolEntry<String, HttpConnection>> future3 = pool.lease("otherhost", null); final PoolEntry<String, HttpConnection> entry1 = future1.get(); Assert.assertNotNull(entry1); entry1.assignConnection(conn1); final PoolEntry<String, HttpConnection> entry2 = future2.get(); Assert.assertNotNull(entry2); entry2.assignConnection(conn2); final PoolEntry<String, HttpConnection> entry3 = future3.get(); Assert.assertNotNull(entry3); entry3.assignConnection(conn3); pool.release(entry1, true); pool.release(entry2, true); pool.release(entry3, false); Mockito.verify(conn1, Mockito.never()).close(ArgumentMatchers.<CloseMode>any()); Mockito.verify(conn2, Mockito.never()).close(ArgumentMatchers.<CloseMode>any()); Mockito.verify(conn3, Mockito.times(1)).close(CloseMode.GRACEFUL); final PoolStats totals = pool.getTotalStats(); Assert.assertEquals(2, totals.getAvailable()); Assert.assertEquals(0, totals.getLeased()); Assert.assertEquals(0, totals.getPending()); }
public static String formatStats( final Object object, final HttpRoute route, final Object state, final ConnPoolControl<HttpRoute> connPool) { final StringBuilder buf = new StringBuilder(); if (object != null) { buf.append("[id: ").append(getId(object)).append("]"); } buf.append("[route: ").append(route).append("]"); if (state != null) { buf.append("[state: ").append(state).append("]"); } final PoolStats totals = connPool.getTotalStats(); final PoolStats stats = connPool.getStats(route); buf.append("[total kept alive: ").append(totals.getAvailable()).append("; "); buf.append("route allocated: ").append(stats.getLeased() + stats.getAvailable()); buf.append(" of ").append(stats.getMax()).append("; "); buf.append("total allocated: ").append(totals.getLeased() + totals.getAvailable()); buf.append(" of ").append(totals.getMax()).append("]"); return buf.toString(); }