X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?p=controller.git;a=blobdiff_plain;f=opendaylight%2Fmd-sal%2Fcds-access-client%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fcontroller%2Fcluster%2Faccess%2Fclient%2FClientActorBehavior.java;h=554ffe97c77ae7c3011daca2a28c22f660a20e78;hp=5d61885cd55adde9cc40d85228c9dc02c9931497;hb=a12fb3d06006f9f5ca90f4323dcaaad4f5ad1f62;hpb=b74c6012092e47430a8f4d6f4ddeb1d3e2b1b7df diff --git a/opendaylight/md-sal/cds-access-client/src/main/java/org/opendaylight/controller/cluster/access/client/ClientActorBehavior.java b/opendaylight/md-sal/cds-access-client/src/main/java/org/opendaylight/controller/cluster/access/client/ClientActorBehavior.java index 5d61885cd5..554ffe97c7 100644 --- a/opendaylight/md-sal/cds-access-client/src/main/java/org/opendaylight/controller/cluster/access/client/ClientActorBehavior.java +++ b/opendaylight/md-sal/cds-access-client/src/main/java/org/opendaylight/controller/cluster/access/client/ClientActorBehavior.java @@ -9,6 +9,7 @@ package org.opendaylight.controller.cluster.access.client; import com.google.common.annotations.Beta; import com.google.common.base.Preconditions; +import com.google.common.base.Stopwatch; import com.google.common.base.Verify; import java.util.Collection; import java.util.Map; @@ -174,7 +175,7 @@ public abstract class ClientActorBehavior extends return this; } else if (conn != null) { LOG.info("{}: connection {} indicated no leadership, reconnecting it", persistenceId(), conn, cause); - return conn.reconnect(this); + return conn.reconnect(this, cause); } } if (cause instanceof OutOfSequenceEnvelopeException) { @@ -185,7 +186,7 @@ public abstract class ClientActorBehavior extends } else if (conn != null) { LOG.info("{}: connection {} indicated no sequencing mismatch on {} sequence {}, reconnecting it", persistenceId(), conn, failure.getTarget(), failure.getSequence(), cause); - return conn.reconnect(this); + return conn.reconnect(this, cause); } } @@ -278,6 +279,8 @@ public abstract class ClientActorBehavior extends LOG.info("{}: resolved shard {} to {}", persistenceId(), shard, backend); final long stamp = connectionsLock.writeLock(); try { + final Stopwatch sw = Stopwatch.createStarted(); + // Create a new connected connection final ConnectedClientConnection newConn = new ConnectedClientConnection<>(conn.context(), conn.cookie(), backend); @@ -296,16 +299,35 @@ public abstract class ClientActorBehavior extends conn.finishReplay(forwarder); // Make sure new lookups pick up the new connection - connections.replace(shard, conn, newConn); - LOG.info("{}: replaced connection {} with {}", persistenceId(), conn, newConn); + if (!connections.replace(shard, conn, newConn)) { + final AbstractClientConnection existing = connections.get(conn.cookie()); + LOG.warn("{}: old connection {} does not match existing {}, new connection {} in limbo", + persistenceId(), conn, existing, newConn); + } else { + LOG.info("{}: replaced connection {} with {} in {}", persistenceId(), conn, newConn, sw); + } } finally { connectionsLock.unlockWrite(stamp); } } void removeConnection(final AbstractClientConnection conn) { - connections.remove(conn.cookie(), conn); - LOG.debug("{}: removed connection {}", persistenceId(), conn); + final long stamp = connectionsLock.writeLock(); + try { + if (!connections.remove(conn.cookie(), conn)) { + final AbstractClientConnection existing = connections.get(conn.cookie()); + if (existing != null) { + LOG.warn("{}: failed to remove connection {}, as it was superseded by {}", persistenceId(), conn, + existing); + } else { + LOG.warn("{}: failed to remove connection {}, as it was not tracked", persistenceId(), conn); + } + } else { + LOG.info("{}: removed connection {}", persistenceId(), conn); + } + } finally { + connectionsLock.unlockWrite(stamp); + } } @SuppressWarnings("unchecked") @@ -314,11 +336,20 @@ public abstract class ClientActorBehavior extends final ReconnectingClientConnection conn = (ReconnectingClientConnection)newConn; LOG.info("{}: connection {} reconnecting as {}", persistenceId(), oldConn, newConn); - final boolean replaced = connections.replace(oldConn.cookie(), (AbstractClientConnection)oldConn, conn); - if (!replaced) { - final AbstractClientConnection existing = connections.get(oldConn.cookie()); - LOG.warn("{}: old connection {} does not match existing {}, new connection {} in limbo", persistenceId(), - oldConn, existing, newConn); + final long stamp = connectionsLock.writeLock(); + try { + final boolean replaced = connections.replace(oldConn.cookie(), (AbstractClientConnection)oldConn, conn); + if (!replaced) { + final AbstractClientConnection existing = connections.get(oldConn.cookie()); + if (existing != null) { + LOG.warn("{}: failed to replace connection {}, as it was superseded by {}", persistenceId(), conn, + existing); + } else { + LOG.warn("{}: failed to replace connection {}, as it was not tracked", persistenceId(), conn); + } + } + } finally { + connectionsLock.unlockWrite(stamp); } final Long shard = oldConn.cookie();