BUG-7964: IllegalStateException under testReconectClient test 25/53225/1
authorClaudio D. Gasparini <claudio.gasparini@pantheon.tech>
Mon, 13 Mar 2017 12:26:44 +0000 (13:26 +0100)
committerClaudio D. Gasparini <claudio.gasparini@pantheon.tech>
Mon, 13 Mar 2017 14:57:19 +0000 (14:57 +0000)
Fix by wait until channel is closed before retry to connect.

Change-Id: If1c7889b7988ce5cab3e11f73b6134ad2af182c7
Signed-off-by: Claudio D. Gasparini <claudio.gasparini@pantheon.tech>
(cherry picked from commit 7b48d57ba01775ff48b1686ea8093b009df2ee3c)

pcep/impl/src/main/java/org/opendaylight/protocol/pcep/impl/PCEPSessionImpl.java
pcep/impl/src/test/java/org/opendaylight/protocol/pcep/impl/PCEPDispatcherImplTest.java

index 9fe8c8a98f579b8b7f2b4e47458f6a508a39596c..04152c312257442f71c946b26ef88cd74cdb5c42 100644 (file)
@@ -69,7 +69,7 @@ public class PCEPSessionImpl extends SimpleChannelInboundHandler<Message> implem
      */
     private long lastMessageReceivedAt;
 
-    private final Queue<Long> unknownMessagesTimes = new LinkedList<Long>();
+    private final Queue<Long> unknownMessagesTimes = new LinkedList<>();
 
     private final PCEPSessionListener listener;
 
@@ -110,21 +110,11 @@ public class PCEPSessionImpl extends SimpleChannelInboundHandler<Message> implem
 
 
         if (getDeadTimerValue() != 0) {
-            channel.eventLoop().schedule(new Runnable() {
-                @Override
-                public void run() {
-                    handleDeadTimer();
-                }
-            }, getDeadTimerValue(), TimeUnit.SECONDS);
+            channel.eventLoop().schedule(this::handleDeadTimer, getDeadTimerValue(), TimeUnit.SECONDS);
         }
 
         if (getKeepAliveTimerValue() != 0) {
-            channel.eventLoop().schedule(new Runnable() {
-                @Override
-                public void run() {
-                    handleKeepaliveTimer();
-                }
-            }, getKeepAliveTimerValue(), TimeUnit.SECONDS);
+            channel.eventLoop().schedule(this::handleKeepaliveTimer, getKeepAliveTimerValue(), TimeUnit.SECONDS);
         }
 
         LOG.info("Session {}[{}] <-> {}[{}] started", channel.localAddress(), localOpen.getSessionId(), channel.remoteAddress(),
@@ -156,12 +146,7 @@ public class PCEPSessionImpl extends SimpleChannelInboundHandler<Message> implem
                 LOG.debug("DeadTimer expired. {}", new Date());
                 this.terminate(TerminationReason.EXP_DEADTIMER);
             } else {
-                this.channel.eventLoop().schedule(new Runnable() {
-                    @Override
-                    public void run() {
-                        handleDeadTimer();
-                    }
-                }, nextDead - ct, TimeUnit.NANOSECONDS);
+                this.channel.eventLoop().schedule(this::handleDeadTimer, nextDead - ct, TimeUnit.NANOSECONDS);
             }
         }
     }
@@ -183,12 +168,7 @@ public class PCEPSessionImpl extends SimpleChannelInboundHandler<Message> implem
                 nextKeepalive = this.lastMessageSentAt + TimeUnit.SECONDS.toNanos(getKeepAliveTimerValue());
             }
 
-            this.channel.eventLoop().schedule(new Runnable() {
-                @Override
-                public void run() {
-                    handleKeepaliveTimer();
-                }
-            }, nextKeepalive - ct, TimeUnit.NANOSECONDS);
+            this.channel.eventLoop().schedule(this::handleKeepaliveTimer, nextKeepalive - ct, TimeUnit.NANOSECONDS);
         }
     }
 
@@ -209,27 +189,30 @@ public class PCEPSessionImpl extends SimpleChannelInboundHandler<Message> implem
             this.sessionState.setLastSentError(msg);
         }
 
-        f.addListener(new ChannelFutureListener() {
-            @Override
-            public void operationComplete(final ChannelFuture arg) {
-                if (arg.isSuccess()) {
-                    LOG.trace("Message sent to socket: {}", msg);
-                } else {
-                    LOG.debug("Message not sent: {}", msg, arg.cause());
-                }
+        f.addListener((ChannelFutureListener) arg -> {
+            if (arg.isSuccess()) {
+                LOG.trace("Message sent to socket: {}", msg);
+            } else {
+                LOG.debug("Message not sent: {}", msg, arg.cause());
             }
         });
 
         return f;
     }
 
+    @VisibleForTesting
+    ChannelFuture closeChannel() {
+        LOG.info("Closing PCEP session: {}", this);
+        return this.channel.close();
+    }
+
     /**
      * Closes PCEP session without sending a Close message, as the channel is no longer active.
      */
     @Override
     public void close() {
         LOG.info("Closing PCEP session: {}", this);
-        this.channel.close();
+        closeChannel();
     }
 
     /**
index 1a04a229502315b6bc3a1338ceb37ab07d83eb17..c5e5a009334cbe987c47082d140916206181aec6 100755 (executable)
@@ -8,6 +8,8 @@
 
 package org.opendaylight.protocol.pcep.impl;
 
+import static org.junit.Assert.assertEquals;
+import static org.mockito.Matchers.any;
 import static org.opendaylight.protocol.util.CheckUtil.waitFutureSuccess;
 
 import com.google.common.base.Preconditions;
@@ -103,13 +105,13 @@ public class PCEPDispatcherImplTest {
             RETRY_TIMER, CONNECT_TIMEOUT, SimpleSessionListener::new).get();
 
         Assert.assertTrue(futureChannel.channel().isActive());
-        Assert.assertEquals(clientAddr1.getAddress().getHostAddress(), session1.getPeerPref().getIpAddress());
-        Assert.assertEquals(DEAD_TIMER, session1.getDeadTimerValue().shortValue());
-        Assert.assertEquals(KEEP_ALIVE, session1.getKeepAliveTimerValue().shortValue());
+        assertEquals(clientAddr1.getAddress().getHostAddress(), session1.getPeerPref().getIpAddress());
+        assertEquals(DEAD_TIMER, session1.getDeadTimerValue().shortValue());
+        assertEquals(KEEP_ALIVE, session1.getKeepAliveTimerValue().shortValue());
 
-        Assert.assertEquals(clientAddr2.getAddress().getHostAddress(), session2.getPeerPref().getIpAddress());
-        Assert.assertEquals(DEAD_TIMER, session2.getDeadTimerValue().shortValue());
-        Assert.assertEquals(KEEP_ALIVE, session2.getKeepAliveTimerValue().shortValue());
+        assertEquals(clientAddr2.getAddress().getHostAddress(), session2.getPeerPref().getIpAddress());
+        assertEquals(DEAD_TIMER, session2.getDeadTimerValue().shortValue());
+        assertEquals(KEEP_ALIVE, session2.getKeepAliveTimerValue().shortValue());
 
         session1.close();
         session2.close();
@@ -147,17 +149,17 @@ public class PCEPDispatcherImplTest {
         final PCEPSessionImpl session1 = (PCEPSessionImpl) this.pccMock.createClient(clientAddr,
             RETRY_TIMER, CONNECT_TIMEOUT, SimpleSessionListener::new).get();
 
-        Assert.assertEquals(clientAddr.getAddress(), session1.getRemoteAddress());
-        Assert.assertEquals(DEAD_TIMER, session1.getDeadTimerValue().shortValue());
-        Assert.assertEquals(KEEP_ALIVE, session1.getKeepAliveTimerValue().shortValue());
-        session1.close();
+        assertEquals(clientAddr.getAddress(), session1.getRemoteAddress());
+        assertEquals(DEAD_TIMER, session1.getDeadTimerValue().shortValue());
+        assertEquals(KEEP_ALIVE, session1.getKeepAliveTimerValue().shortValue());
+        waitFutureSuccess(session1.closeChannel());
 
         final PCEPSessionImpl session2 = (PCEPSessionImpl) this.pccMock.createClient(clientAddr,
             RETRY_TIMER, CONNECT_TIMEOUT, SimpleSessionListener::new).get();
 
-        Assert.assertEquals(clientAddr.getAddress(), session1.getRemoteAddress());
-        Assert.assertEquals(DEAD_TIMER, session2.getDeadTimerValue().shortValue());
-        Assert.assertEquals(KEEP_ALIVE, session2.getKeepAliveTimerValue().shortValue());
+        assertEquals(clientAddr.getAddress(), session1.getRemoteAddress());
+        assertEquals(DEAD_TIMER, session2.getDeadTimerValue().shortValue());
+        assertEquals(KEEP_ALIVE, session2.getKeepAliveTimerValue().shortValue());
 
         session2.close();
     }
@@ -173,7 +175,7 @@ public class PCEPDispatcherImplTest {
         final ChannelFuture futureChannel = this.disp2Spy.createServer(new InetSocketAddress("0.0.0.0", port),
             SimpleSessionListener::new, null);
         waitFutureSuccess(futureChannel);
-        Mockito.verify(this.disp2Spy).createServerBootstrap(Mockito.any(PCEPDispatcherImpl.ChannelPipelineInitializer.class));
+        Mockito.verify(this.disp2Spy).createServerBootstrap(any(PCEPDispatcherImpl.ChannelPipelineInitializer.class));
     }
 
     @After