Merge "Remove logged unstubbed exception in test for netconf-monitoring"
[controller.git] / opendaylight / commons / protocol-framework / src / main / java / org / opendaylight / protocol / framework / ReconnectPromise.java
index fe1012f443fc7824b1e2b8b3d3c4ed15ecbfb30d..b2ab27a82671cdc0c2380ac8f1084e540ee61691 100644 (file)
@@ -47,10 +47,13 @@ final class ReconnectPromise<S extends ProtocolSession<?>, L extends SessionList
         pending = this.dispatcher.createClient(this.address, cs, b, new AbstractDispatcher.PipelineInitializer<S>() {
             @Override
             public void initializeChannel(final SocketChannel channel, final Promise<S> 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<S extends ProtocolSession<?>, 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<S extends ProtocolSession<?>, 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);