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=aaec95a74b5886150c8d0bc4bb7d11a1a1570dbf;hp=98a2c2cca16cbc8c085e530af206aa497c9e5d49;hb=9454191b8dcbbf94f422fa090690bbec0284bed6;hpb=835be1b216e0b8b4144fc3ec8016700866fd2833 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 98a2c2cca1..aaec95a74b 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,13 +47,12 @@ 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) { - // 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); + // add closed channel handler + // 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)); } }); } @@ -80,7 +79,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; @@ -91,9 +90,7 @@ 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); - + // This is the ultimate channel inactive handler, not forwarding if (promise.isCancelled()) { return; }