diff --git a/zuul-core/src/main/java/com/netflix/zuul/netty/connectionpool/DefaultClientChannelManager.java b/zuul-core/src/main/java/com/netflix/zuul/netty/connectionpool/DefaultClientChannelManager.java index eade417573..199bf6046c 100644 --- a/zuul-core/src/main/java/com/netflix/zuul/netty/connectionpool/DefaultClientChannelManager.java +++ b/zuul-core/src/main/java/com/netflix/zuul/netty/connectionpool/DefaultClientChannelManager.java @@ -250,11 +250,7 @@ else if (!conn.isActive()) { conn.setInPool(false); } else { - final ChannelPipeline pipeline = conn.getChannel().pipeline(); - removeHandlerFromPipeline(OriginResponseReceiver.CHANNEL_HANDLER_NAME, pipeline); - pipeline.addAfter(PassportStateHttpClientHandler.PASSPORT_STATE_HTTP_CLIENT_HANDLER_NAME, IDLE_STATE_HANDLER_NAME, - new IdleStateHandler(0, 0, connPoolConfig.getIdleTimeout(), TimeUnit.MILLISECONDS)); - + releaseHandlers(conn); // Attempt to return connection to the pool. IConnectionPool pool = perServerPools.get(conn.getServer()); @@ -275,6 +271,13 @@ else if (!conn.isActive()) { return released; } + protected void releaseHandlers(PooledConnection conn) { + final ChannelPipeline pipeline = conn.getChannel().pipeline(); + removeHandlerFromPipeline(OriginResponseReceiver.CHANNEL_HANDLER_NAME, pipeline); + pipeline.addAfter(PassportStateHttpClientHandler.PASSPORT_STATE_HTTP_CLIENT_HANDLER_NAME, IDLE_STATE_HANDLER_NAME, + new IdleStateHandler(0, 0, connPoolConfig.getIdleTimeout(), TimeUnit.MILLISECONDS)); + } + public static void removeHandlerFromPipeline(final String handlerName, final ChannelPipeline pipeline) { if (pipeline.get(handlerName) != null) { pipeline.remove(handlerName); diff --git a/zuul-core/src/main/java/com/netflix/zuul/netty/connectionpool/PerServerConnectionPool.java b/zuul-core/src/main/java/com/netflix/zuul/netty/connectionpool/PerServerConnectionPool.java index ea85645e17..3f30c032a7 100644 --- a/zuul-core/src/main/java/com/netflix/zuul/netty/connectionpool/PerServerConnectionPool.java +++ b/zuul-core/src/main/java/com/netflix/zuul/netty/connectionpool/PerServerConnectionPool.java @@ -143,12 +143,16 @@ private void onAcquire(final PooledConnection conn, String httpMethod, String ur int attemptNum, CurrentPassport passport) { passport.setOnChannel(conn.getChannel()); - DefaultClientChannelManager.removeHandlerFromPipeline(DefaultClientChannelManager.IDLE_STATE_HANDLER_NAME, conn.getChannel().pipeline()); + removeIdleStateHandler(conn); conn.setInUse(); if (LOG.isDebugEnabled()) LOG.debug("PooledConnection acquired: " + conn.toString()); } + protected void removeIdleStateHandler(PooledConnection conn) { + DefaultClientChannelManager.removeHandlerFromPipeline(DefaultClientChannelManager.IDLE_STATE_HANDLER_NAME, conn.getChannel().pipeline()); + } + @Override public Promise acquire(EventLoop eventLoop, Object key, String httpMethod, String uri, int attemptNum, CurrentPassport passport, @@ -186,8 +190,10 @@ public PooledConnection tryGettingFromConnectionPool(EventLoop eventLoop) conn.setInPool(false); + initConnection(conn); + /* Check that the connection is still open. */ - if ((conn.isActive() && conn.getChannel().isOpen())) { + if (isValidFromPool(conn)) { reuseConnCounter.increment(); connsInUse.incrementAndGet(); connsInPool.decrementAndGet(); @@ -202,6 +208,14 @@ public PooledConnection tryGettingFromConnectionPool(EventLoop eventLoop) return null; } + protected boolean isValidFromPool(PooledConnection conn) { + return conn.isActive() && conn.getChannel().isOpen(); + } + + protected void initConnection(PooledConnection conn) { + // custom init code + } + protected Deque getPoolForEventLoop(EventLoop eventLoop) { // We don't want to block under any circumstances, so can't use CHM.computeIfAbsent(). diff --git a/zuul-core/src/main/java/com/netflix/zuul/netty/connectionpool/PooledConnection.java b/zuul-core/src/main/java/com/netflix/zuul/netty/connectionpool/PooledConnection.java index a5363e1b1c..0256813743 100644 --- a/zuul-core/src/main/java/com/netflix/zuul/netty/connectionpool/PooledConnection.java +++ b/zuul-core/src/main/java/com/netflix/zuul/netty/connectionpool/PooledConnection.java @@ -36,7 +36,7 @@ */ public class PooledConnection { - private static final AttributeKey CHANNEL_ATTR = AttributeKey.newInstance("_pooled_connection"); + protected static final AttributeKey CHANNEL_ATTR = AttributeKey.newInstance("_pooled_connection"); public static final String READ_TIMEOUT_HANDLER_NAME = "readTimeoutHandler"; private final Server server;