X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;ds=sidebyside;f=opendaylight%2Fcommons%2Fprotocol-framework%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fprotocol%2Fframework%2FReconnectPromise.java;h=e57976449bef78f2c6422420233f2d60e79fd0cd;hb=e3998d55e33da9f6ecb69da75ecc71a047b6362b;hp=fe1012f443fc7824b1e2b8b3d3c4ed15ecbfb30d;hpb=475d28f717bae92b2cc10b0589131771fcc62242;p=controller.git diff --git a/opendaylight/commons/protocol-framework/src/main/java/org/opendaylight/protocol/framework/ReconnectPromise.java b/opendaylight/commons/protocol-framework/src/main/java/org/opendaylight/protocol/framework/ReconnectPromise.java index fe1012f443..e57976449b 100644 --- a/opendaylight/commons/protocol-framework/src/main/java/org/opendaylight/protocol/framework/ReconnectPromise.java +++ b/opendaylight/commons/protocol-framework/src/main/java/org/opendaylight/protocol/framework/ReconnectPromise.java @@ -15,11 +15,13 @@ import io.netty.channel.socket.SocketChannel; import io.netty.util.concurrent.DefaultPromise; import io.netty.util.concurrent.EventExecutor; import io.netty.util.concurrent.Future; +import io.netty.util.concurrent.GenericFutureListener; import io.netty.util.concurrent.Promise; import java.net.InetSocketAddress; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +@Deprecated final class ReconnectPromise, L extends SessionListener> extends DefaultPromise { private static final Logger LOG = LoggerFactory.getLogger(ReconnectPromise.class); @@ -48,9 +50,20 @@ final class ReconnectPromise, L extends SessionList @Override public void initializeChannel(final SocketChannel channel, final Promise promise) { initializer.initializeChannel(channel, promise); - // add closed channel handler - channel.pipeline().addFirst(new ClosedChannelHandler(ReconnectPromise.this)); + // This handler has to be added as last channel handler and the channel inactive event has to be caught by it + // Handlers in front of it can react to channelInactive event, but have to forward the event or the reconnect will not work + // This handler is last so all handlers in front of it can handle channel inactive (to e.g. resource cleanup) before a new connection is started + channel.pipeline().addLast(new ClosedChannelHandler(ReconnectPromise.this)); + } + }); + + pending.addListener(new GenericFutureListener>() { + @Override + public void operationComplete(Future future) throws Exception { + if (!future.isSuccess()) { + ReconnectPromise.this.setFailure(future.cause()); + } } }); } @@ -77,7 +90,7 @@ final class ReconnectPromise, L extends SessionList /** * Channel handler that responds to channelInactive event and reconnects the session. - * Only if the initial connection was successfully established and promise was not canceled. + * Only if the promise was not canceled. */ private static final class ClosedChannelHandler extends ChannelInboundHandlerAdapter { private final ReconnectPromise promise; @@ -88,14 +101,13 @@ final class ReconnectPromise, L extends SessionList @Override public void channelInactive(final ChannelHandlerContext ctx) throws Exception { + // This is the ultimate channel inactive handler, not forwarding if (promise.isCancelled()) { return; } - // Check if initial connection was fully finished. If the session was dropped during negotiation, reconnect will not happen. - // Session can be dropped during negotiation on purpose by the client side and would make no sense to initiate reconnect if (promise.isInitialConnectFinished() == false) { - return; + LOG.debug("Connection to {} was dropped during negotiation, reattempting", promise.address); } LOG.debug("Reconnecting after connection to {} was dropped", promise.address);