You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hc.apache.org by ol...@apache.org on 2013/06/23 18:50:17 UTC
svn commit: r1495842 - in /httpcomponents/httpcore/trunk/httpcore-nio/src:
main/java/org/apache/http/impl/nio/pool/ main/java/org/apache/http/nio/pool/
test/java/org/apache/http/impl/nio/pool/
Author: olegk
Date: Sun Jun 23 16:50:17 2013
New Revision: 1495842
URL: http://svn.apache.org/r1495842
Log:
BasicNIOConnPool to reset socket timeout on lease / release operations
Modified:
httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/impl/nio/pool/BasicNIOConnPool.java
httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/impl/nio/pool/BasicNIOPoolEntry.java
httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/nio/pool/AbstractNIOConnPool.java
httpcomponents/httpcore/trunk/httpcore-nio/src/test/java/org/apache/http/impl/nio/pool/TestBasicNIOConnPool.java
Modified: httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/impl/nio/pool/BasicNIOConnPool.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/impl/nio/pool/BasicNIOConnPool.java?rev=1495842&r1=1495841&r2=1495842&view=diff
==============================================================================
--- httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/impl/nio/pool/BasicNIOConnPool.java (original)
+++ httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/impl/nio/pool/BasicNIOConnPool.java Sun Jun 23 16:50:17 2013
@@ -157,7 +157,10 @@ public class BasicNIOConnPool extends Ab
@Override
protected BasicNIOPoolEntry createEntry(final HttpHost host, final NHttpClientConnection conn) {
- return new BasicNIOPoolEntry(Long.toString(COUNTER.getAndIncrement()), host, conn);
+ final BasicNIOPoolEntry entry = new BasicNIOPoolEntry(
+ Long.toString(COUNTER.getAndIncrement()), host, conn);
+ entry.setSocketTimeout(conn.getSocketTimeout());
+ return entry;
}
@Override
@@ -177,4 +180,17 @@ public class BasicNIOConnPool extends Ab
this.connectTimeout, TimeUnit.MILLISECONDS, null);
}
+ @Override
+ protected void onLease(final BasicNIOPoolEntry entry) {
+ final NHttpClientConnection conn = entry.getConnection();
+ conn.setSocketTimeout(entry.getSocketTimeout());
+ }
+
+ @Override
+ protected void onRelease(final BasicNIOPoolEntry entry) {
+ final NHttpClientConnection conn = entry.getConnection();
+ entry.setSocketTimeout(conn.getSocketTimeout());
+ conn.setSocketTimeout(0);
+ }
+
}
Modified: httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/impl/nio/pool/BasicNIOPoolEntry.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/impl/nio/pool/BasicNIOPoolEntry.java?rev=1495842&r1=1495841&r2=1495842&view=diff
==============================================================================
--- httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/impl/nio/pool/BasicNIOPoolEntry.java (original)
+++ httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/impl/nio/pool/BasicNIOPoolEntry.java Sun Jun 23 16:50:17 2013
@@ -44,6 +44,8 @@ import org.apache.http.pool.PoolEntry;
@ThreadSafe
public class BasicNIOPoolEntry extends PoolEntry<HttpHost, NHttpClientConnection> {
+ private volatile int socketTimeout;
+
public BasicNIOPoolEntry(final String id, final HttpHost route, final NHttpClientConnection conn) {
super(id, route, conn);
}
@@ -61,4 +63,12 @@ public class BasicNIOPoolEntry extends P
return !getConnection().isOpen();
}
+ int getSocketTimeout() {
+ return socketTimeout;
+ }
+
+ void setSocketTimeout(final int socketTimeout) {
+ this.socketTimeout = socketTimeout;
+ }
+
}
Modified: httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/nio/pool/AbstractNIOConnPool.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/nio/pool/AbstractNIOConnPool.java?rev=1495842&r1=1495841&r2=1495842&view=diff
==============================================================================
--- httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/nio/pool/AbstractNIOConnPool.java (original)
+++ httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/nio/pool/AbstractNIOConnPool.java Sun Jun 23 16:50:17 2013
@@ -484,7 +484,7 @@ public abstract class AbstractNIOConnPoo
final E entry = pool.createEntry(request, conn);
this.leased.add(entry);
pool.completed(request, entry);
-
+ onLease(entry);
} catch (final IOException ex) {
pool.failed(request, ex);
}
Modified: httpcomponents/httpcore/trunk/httpcore-nio/src/test/java/org/apache/http/impl/nio/pool/TestBasicNIOConnPool.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpcore/trunk/httpcore-nio/src/test/java/org/apache/http/impl/nio/pool/TestBasicNIOConnPool.java?rev=1495842&r1=1495841&r2=1495842&view=diff
==============================================================================
--- httpcomponents/httpcore/trunk/httpcore-nio/src/test/java/org/apache/http/impl/nio/pool/TestBasicNIOConnPool.java (original)
+++ httpcomponents/httpcore/trunk/httpcore-nio/src/test/java/org/apache/http/impl/nio/pool/TestBasicNIOConnPool.java Sun Jun 23 16:50:17 2013
@@ -29,18 +29,49 @@ package org.apache.http.impl.nio.pool;
import org.apache.http.HttpHost;
import org.apache.http.config.ConnectionConfig;
import org.apache.http.nio.NHttpClientConnection;
+import org.apache.http.nio.pool.NIOConnFactory;
import org.apache.http.nio.reactor.ConnectingIOReactor;
import org.apache.http.nio.reactor.IOSession;
+import org.apache.http.nio.reactor.SessionRequest;
+import org.apache.http.nio.reactor.SessionRequestCallback;
import org.junit.After;
+import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.mockito.Mock;
+import org.mockito.Mockito;
import org.mockito.MockitoAnnotations;
+import java.net.SocketAddress;
+import java.util.concurrent.Future;
+import java.util.concurrent.TimeUnit;
+
public class TestBasicNIOConnPool {
+ static class LocalPool extends BasicNIOConnPool {
+
+ public LocalPool(
+ final ConnectingIOReactor ioreactor,
+ final NIOConnFactory<HttpHost, NHttpClientConnection> connFactory,
+ final int connectTimeout) {
+ super(ioreactor, connFactory, connectTimeout);
+ }
+
+ public LocalPool(
+ final ConnectingIOReactor ioreactor,
+ final ConnectionConfig config) {
+ super(ioreactor, config);
+ }
+
+ @Override
+ public void requestCompleted(final SessionRequest request) {
+ super.requestCompleted(request);
+ }
+
+ }
+
private BasicNIOConnFactory connFactory;
- private BasicNIOConnPool pool;
+ private LocalPool pool;
private HttpHost route;
@Mock private ConnectingIOReactor reactor;
@Mock private IOSession session;
@@ -51,7 +82,7 @@ public class TestBasicNIOConnPool {
route = new HttpHost("localhost", 80, "http");
connFactory = new BasicNIOConnFactory(ConnectionConfig.DEFAULT);
- pool = new BasicNIOConnPool(reactor, connFactory, 0);
+ pool = new LocalPool(reactor, connFactory, 0);
}
@After
@@ -60,7 +91,7 @@ public class TestBasicNIOConnPool {
@Test(expected=IllegalArgumentException.class)
public void testNullConstructor() throws Exception {
- pool = new BasicNIOConnPool(null, ConnectionConfig.DEFAULT);
+ pool = new LocalPool(null, ConnectionConfig.DEFAULT);
}
@Test
@@ -74,4 +105,49 @@ public class TestBasicNIOConnPool {
final BasicNIOPoolEntry entry = pool.createEntry(route, conn);
entry.close();
}
+
+ @Test
+ public void testTimeoutOnLeaseRelease() throws Exception {
+ final HttpHost host = new HttpHost("somehost");
+ final SessionRequest sessionRequest = Mockito.mock(SessionRequest.class);
+ Mockito.when(sessionRequest.getSession()).thenReturn(session);
+ Mockito.when(sessionRequest.getAttachment()).thenReturn(host);
+ Mockito.when(reactor.connect(
+ Mockito.any(SocketAddress.class),
+ Mockito.any(SocketAddress.class),
+ Mockito.eq(host),
+ Mockito.any(SessionRequestCallback.class))).
+ thenReturn(sessionRequest);
+
+ Mockito.when(session.getSocketTimeout()).thenReturn(999);
+
+ final Future<BasicNIOPoolEntry> future1 = pool.lease(host, null, 10, TimeUnit.SECONDS, null);
+ Mockito.verify(sessionRequest).setConnectTimeout(10000);
+
+ pool.requestCompleted(sessionRequest);
+
+ final BasicNIOPoolEntry entry1 = future1.get();
+ final NHttpClientConnection conn1 = entry1.getConnection();
+ Assert.assertNotNull(entry1);
+ Assert.assertNotNull(conn1);
+ Assert.assertEquals(999, entry1.getSocketTimeout());
+ Assert.assertEquals(999, conn1.getSocketTimeout());
+
+ Mockito.when(session.getSocketTimeout()).thenReturn(888);
+
+ pool.release(entry1, true);
+ Assert.assertEquals(888, entry1.getSocketTimeout());
+ Mockito.verify(session).setSocketTimeout(0);
+
+ final Future<BasicNIOPoolEntry> future2 = pool.lease(host, null, 10, TimeUnit.SECONDS, null);
+ final BasicNIOPoolEntry entry2 = future2.get();
+ final NHttpClientConnection conn2 = entry2.getConnection();
+ Assert.assertNotNull(entry2);
+ Assert.assertNotNull(conn2);
+
+ Assert.assertEquals(888, entry1.getSocketTimeout());
+ Mockito.verify(session).setSocketTimeout(888);
+ }
+
+
}