public final ClientConnectionRequest requestConnection(final HttpRoute paramHttpRoute, Object paramObject) { new ClientConnectionRequest() { public final void abortRequest() { this.val$poolRequest.abortRequest(); } public final ManagedClientConnection getConnection(long paramAnonymousLong, TimeUnit paramAnonymousTimeUnit) throws InterruptedException, ConnectionPoolTimeoutException { if (paramHttpRoute == null) { throw new IllegalArgumentException("Route may not be null."); } BasicPoolEntry localBasicPoolEntry = this.val$poolRequest.getPoolEntry(paramAnonymousLong, paramAnonymousTimeUnit); return new ElegantThreadSafeConnManager.ElegantBasicPooledConnAdapter(ElegantThreadSafeConnManager.this, localBasicPoolEntry); } }; }
public final PoolEntryRequest requestPoolEntry(final HttpRoute paramHttpRoute, final Object paramObject) { new PoolEntryRequest() { public final void abortRequest() { ElegantThreadSafeConnManager.ElegantPool.this.poolLock.lock(); try { this.val$aborter.abort(); return; } finally { ElegantThreadSafeConnManager.ElegantPool.this.poolLock.unlock(); } } public final BasicPoolEntry getPoolEntry(long paramAnonymousLong, TimeUnit paramAnonymousTimeUnit) throws InterruptedException, ConnectionPoolTimeoutException { return ElegantThreadSafeConnManager.ElegantPool.this.getEntryBlocking(paramHttpRoute, paramObject, paramAnonymousLong, paramAnonymousTimeUnit, this.val$aborter); } }; }
@Test @SuppressWarnings( "unchecked" ) public void testConnectionsLeak() throws Exception { Field fPool = ThreadSafeClientConnManager.class.getDeclaredField( "pool" ); Object ob = service.getHttpConnectionManager(); fPool.setAccessible( true ); ConnPoolByRoute pool = (ConnPoolByRoute) fPool.get( ob ); fPool.setAccessible( false ); Field fLeasedConnections = ConnPoolByRoute.class.getDeclaredField( "leasedConnections" ); fLeasedConnections.setAccessible( true ); Set<BasicPoolEntry> set = (Set<BasicPoolEntry>) fLeasedConnections.get( pool ); fLeasedConnections.setAccessible( false ); int connections = pool.getConnectionsInPool(); assertTrue( "Http connections leak was found. Check either unclosed streams in test methods or incorrect using S3FileObject" + ".getS3Object. Pool size is 10. Connections in pool=" + connections + "leasedConnections=" + set.size(), set.size() == 0 ); }
@Override protected BasicPoolEntry getFreeEntry(RouteSpecificPool rospl, Object state) { BasicPoolEntry entry = super.getFreeEntry(rospl, state); if (entry != null) { freeEntryCounter.increment(); } return entry; }
@Override protected BasicPoolEntry createEntry(RouteSpecificPool rospl, ClientConnectionOperator op) { createEntryCounter.increment(); Stopwatch stopWatch = creationTimer.start(); try { return super.createEntry(rospl, op); } finally { stopWatch.stop(); } }
@Override protected BasicPoolEntry getEntryBlocking(HttpRoute route, Object state, long timeout, TimeUnit tunit, WaitingThreadAborter aborter) throws ConnectionPoolTimeoutException, InterruptedException { Stopwatch stopWatch = requestTimer.start(); try { return super.getEntryBlocking(route, state, timeout, tunit, aborter); } finally { stopWatch.stop(); } }
@Override public void freeEntry(BasicPoolEntry entry, boolean reusable, long validDuration, TimeUnit timeUnit) { releaseCounter.increment(); super.freeEntry(entry, reusable, validDuration, timeUnit); }
@Override protected void deleteEntry(BasicPoolEntry entry) { deleteCounter.increment(); super.deleteEntry(entry); }