X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?p=controller.git;a=blobdiff_plain;f=opendaylight%2Fcommons%2Fprotocol-framework%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fprotocol%2Fframework%2FReconnectPromise.java;h=b2ab27a82671cdc0c2380ac8f1084e540ee61691;hp=fe1012f443fc7824b1e2b8b3d3c4ed15ecbfb30d;hb=50f4d81c7768736b7469a45e901663cfb1a2a137;hpb=475d28f717bae92b2cc10b0589131771fcc62242 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..b2ab27a826 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 @@ -47,10 +47,13 @@ final class ReconnectPromise, L extends SessionList pending = this.dispatcher.createClient(this.address, cs, b, new AbstractDispatcher.PipelineInitializer() { @Override public void initializeChannel(final SocketChannel channel, final Promise promise) { - initializer.initializeChannel(channel, promise); - // add closed channel handler + // This handler has to be added before initializer.initializeChannel is called + // Initializer might add some handlers using addFirst e.g. AsyncSshHandler and in that case + // closed channel handler is before the handler that invokes channel inactive event channel.pipeline().addFirst(new ClosedChannelHandler(ReconnectPromise.this)); + + initializer.initializeChannel(channel, promise); } }); } @@ -77,7 +80,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 +91,15 @@ final class ReconnectPromise, L extends SessionList @Override public void channelInactive(final ChannelHandlerContext ctx) throws Exception { + // Pass info about disconnect further and then reconnect + super.channelInactive(ctx); + 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);