X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=opendaylight%2Fcommons%2Fprotocol-framework%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fprotocol%2Fframework%2FReconnectPromise.java;h=98a2c2cca16cbc8c085e530af206aa497c9e5d49;hb=f1124e95b6b1b4a6b8b8661bdd78aa74a6977b55;hp=fe1012f443fc7824b1e2b8b3d3c4ed15ecbfb30d;hpb=98eda7d02fdb6ae0c72edb88b125d166d6933ed0;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..98a2c2cca1 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); } }); } @@ -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);