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);
+    }
+
+
 }