From a12fb3d06006f9f5ca90f4323dcaaad4f5ad1f62 Mon Sep 17 00:00:00 2001 From: Robert Varga Date: Sat, 3 Jun 2017 04:16:00 +0200 Subject: [PATCH] BUG-8494: do not attempt to reconnect ReconnectingClientConnection If we are in reconnect state, we should never attempt to initiate reconnection, as that would leave us without the timer running -- which is a problem since we need to be timing out requests which are queued even as we are attempting to reconnect to the backend. Change-Id: Ic955a2e5b743617c26cc72815df94d0c4584704c Signed-off-by: Robert Varga (cherry picked from commit 584be7bf6b41f2f8b01dd718aba8d3b6cf7426ef) --- .../access/client/AbstractClientConnection.java | 2 +- .../access/client/ReconnectingClientConnection.java | 8 +++++++- .../access/client/AbstractClientConnectionTest.java | 9 --------- .../client/ConnectedClientConnectionTest.java | 13 +++++++++++++ .../client/ReconnectingClientConnectionTest.java | 11 +++++++++++ 5 files changed, 32 insertions(+), 11 deletions(-) diff --git a/opendaylight/md-sal/cds-access-client/src/main/java/org/opendaylight/controller/cluster/access/client/AbstractClientConnection.java b/opendaylight/md-sal/cds-access-client/src/main/java/org/opendaylight/controller/cluster/access/client/AbstractClientConnection.java index 98442256c6..abd668010a 100644 --- a/opendaylight/md-sal/cds-access-client/src/main/java/org/opendaylight/controller/cluster/access/client/AbstractClientConnection.java +++ b/opendaylight/md-sal/cds-access-client/src/main/java/org/opendaylight/controller/cluster/access/client/AbstractClientConnection.java @@ -217,7 +217,7 @@ public abstract class AbstractClientConnection { if (delay >= DEBUG_DELAY_NANOS) { if (delay > MAX_DELAY_NANOS) { LOG.info("Capping {} throttle delay from {} to {} seconds", this, - TimeUnit.NANOSECONDS.toSeconds(delay), MAX_DELAY_SECONDS); + TimeUnit.NANOSECONDS.toSeconds(delay), MAX_DELAY_SECONDS, new Throwable()); delay = MAX_DELAY_NANOS; } if (LOG.isDebugEnabled()) { diff --git a/opendaylight/md-sal/cds-access-client/src/main/java/org/opendaylight/controller/cluster/access/client/ReconnectingClientConnection.java b/opendaylight/md-sal/cds-access-client/src/main/java/org/opendaylight/controller/cluster/access/client/ReconnectingClientConnection.java index b59c9e324a..6a3ba276fb 100644 --- a/opendaylight/md-sal/cds-access-client/src/main/java/org/opendaylight/controller/cluster/access/client/ReconnectingClientConnection.java +++ b/opendaylight/md-sal/cds-access-client/src/main/java/org/opendaylight/controller/cluster/access/client/ReconnectingClientConnection.java @@ -29,10 +29,16 @@ public final class ReconnectingClientConnection extends A this.cause = Preconditions.checkNotNull(cause); } + @Override + long backendSilentTicks(final long now) { + // We do not want to reconnect this connection, as we need the timer to to keep running + return 0; + } + @Override ClientActorBehavior lockedReconnect(final ClientActorBehavior current, final RequestException cause) { this.cause = Preconditions.checkNotNull(cause); - LOG.debug("Skipping reconnect of already-reconnecting connection {}", this); + LOG.warn("Skipping reconnect of already-reconnecting connection {}", this); return current; } diff --git a/opendaylight/md-sal/cds-access-client/src/test/java/org/opendaylight/controller/cluster/access/client/AbstractClientConnectionTest.java b/opendaylight/md-sal/cds-access-client/src/test/java/org/opendaylight/controller/cluster/access/client/AbstractClientConnectionTest.java index 9fd3a21d8f..3a2abbe31c 100644 --- a/opendaylight/md-sal/cds-access-client/src/test/java/org/opendaylight/controller/cluster/access/client/AbstractClientConnectionTest.java +++ b/opendaylight/md-sal/cds-access-client/src/test/java/org/opendaylight/controller/cluster/access/client/AbstractClientConnectionTest.java @@ -117,15 +117,6 @@ public abstract class AbstractClientConnectionTest> callback = mock(Consumer.class); - connection.sendRequest(createRequest(replyToProbe.ref()), callback); - final long now = context.ticker().read() + ConnectedClientConnection.BACKEND_ALIVE_TIMEOUT_NANOS; - final Optional timeout = connection.checkTimeout(now); - Assert.assertNull(timeout); - } - @Test public void testCheckTimeout() throws Exception { final Consumer> callback = mock(Consumer.class); diff --git a/opendaylight/md-sal/cds-access-client/src/test/java/org/opendaylight/controller/cluster/access/client/ConnectedClientConnectionTest.java b/opendaylight/md-sal/cds-access-client/src/test/java/org/opendaylight/controller/cluster/access/client/ConnectedClientConnectionTest.java index e66512d041..29cac2315e 100644 --- a/opendaylight/md-sal/cds-access-client/src/test/java/org/opendaylight/controller/cluster/access/client/ConnectedClientConnectionTest.java +++ b/opendaylight/md-sal/cds-access-client/src/test/java/org/opendaylight/controller/cluster/access/client/ConnectedClientConnectionTest.java @@ -12,13 +12,26 @@ import static org.mockito.Matchers.same; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; +import java.util.Optional; +import java.util.function.Consumer; +import org.junit.Assert; import org.junit.Test; import org.opendaylight.controller.cluster.access.ABIVersion; import org.opendaylight.controller.cluster.access.concepts.RequestException; +import org.opendaylight.controller.cluster.access.concepts.Response; public class ConnectedClientConnectionTest extends AbstractClientConnectionTest, BackendInfo> { + @Test + public void testCheckTimeoutConnectionTimedout() throws Exception { + final Consumer> callback = mock(Consumer.class); + connection.sendRequest(createRequest(replyToProbe.ref()), callback); + final long now = context.ticker().read() + ConnectedClientConnection.BACKEND_ALIVE_TIMEOUT_NANOS; + final Optional timeout = connection.checkTimeout(now); + Assert.assertNull(timeout); + } + @Override protected ConnectedClientConnection createConnection() { final BackendInfo backend = new BackendInfo(backendProbe.ref(), 0L, ABIVersion.BORON, 10); diff --git a/opendaylight/md-sal/cds-access-client/src/test/java/org/opendaylight/controller/cluster/access/client/ReconnectingClientConnectionTest.java b/opendaylight/md-sal/cds-access-client/src/test/java/org/opendaylight/controller/cluster/access/client/ReconnectingClientConnectionTest.java index b36dd7ccec..a281b1208a 100644 --- a/opendaylight/md-sal/cds-access-client/src/test/java/org/opendaylight/controller/cluster/access/client/ReconnectingClientConnectionTest.java +++ b/opendaylight/md-sal/cds-access-client/src/test/java/org/opendaylight/controller/cluster/access/client/ReconnectingClientConnectionTest.java @@ -12,6 +12,7 @@ import static org.mockito.Mockito.after; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; +import java.util.Optional; import java.util.function.Consumer; import org.junit.Assert; import org.junit.Test; @@ -29,6 +30,16 @@ import org.opendaylight.controller.cluster.access.concepts.TransactionIdentifier public class ReconnectingClientConnectionTest extends AbstractClientConnectionTest, BackendInfo> { + @Test + public void testCheckTimeoutConnectionTimedout() throws Exception { + final Consumer> callback = mock(Consumer.class); + connection.sendRequest(createRequest(replyToProbe.ref()), callback); + final long now = context.ticker().read() + ConnectedClientConnection.BACKEND_ALIVE_TIMEOUT_NANOS; + final Optional timeout = connection.checkTimeout(now); + Assert.assertNotNull(timeout); + Assert.assertTrue(timeout.isPresent()); + } + @Override protected ReconnectingClientConnection createConnection() { final BackendInfo backend = new BackendInfo(backendProbe.ref(), 0L, ABIVersion.BORON, 10); -- 2.36.6