From: Tomas Cere Date: Wed, 10 May 2017 12:04:37 +0000 (+0200) Subject: BUG-8392 RpcRegistry has it's buckets populated by unreachable nodes X-Git-Tag: release/nitrogen~276 X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?p=controller.git;a=commitdiff_plain;h=e222d9f4a5b6957853cff9cf73987e6ce0ae3b24;ds=inline BUG-8392 RpcRegistry has it's buckets populated by unreachable nodes In a situation when a member(f.ex member2) is isolated and the rpc registrations are removed from the node(member1) we can still have our bucket store populated by buckets from the remaining node(member-3) which might not have received the memberUnreachable message yet leadig to stale routing of an rpc to member-2. This patch adds bucket filtering based on the currently present peers so that we only accept Buckets that we can see. Change-Id: I92c1e063f4754aca829bd73df4518f859e1d8497 Signed-off-by: Tomas Cere --- diff --git a/opendaylight/md-sal/sal-remoterpc-connector/src/main/java/org/opendaylight/controller/remote/rpc/registry/gossip/Gossiper.java b/opendaylight/md-sal/sal-remoterpc-connector/src/main/java/org/opendaylight/controller/remote/rpc/registry/gossip/Gossiper.java index f24ca3329d..275200f8d5 100644 --- a/opendaylight/md-sal/sal-remoterpc-connector/src/main/java/org/opendaylight/controller/remote/rpc/registry/gossip/Gossiper.java +++ b/opendaylight/md-sal/sal-remoterpc-connector/src/main/java/org/opendaylight/controller/remote/rpc/registry/gossip/Gossiper.java @@ -20,6 +20,7 @@ import akka.cluster.Member; import com.google.common.annotations.VisibleForTesting; import com.google.common.base.Preconditions; import com.google.common.base.Verify; +import com.google.common.collect.Maps; import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; @@ -175,6 +176,8 @@ public class Gossiper extends AbstractUntypedActorWithMetering { * @param member who went down */ private void receiveMemberRemoveOrUnreachable(final Member member) { + LOG.debug("Received memberDown or Unreachable: {}", member); + //if its self, then stop itself if (selfAddress.equals(member.address())) { getContext().stop(getSelf()); @@ -205,6 +208,8 @@ public class Gossiper extends AbstractUntypedActorWithMetering { * @param member the member to add */ private void receiveMemberUpOrReachable(final Member member) { + LOG.debug("Received memberUp or reachable: {}", member); + //ignore up notification for self if (selfAddress.equals(member.address())) { return; @@ -329,7 +334,8 @@ public class Gossiper extends AbstractUntypedActorWithMetering { */ @VisibleForTesting void updateRemoteBuckets(final Map> buckets) { - bucketStore.updateRemoteBuckets(buckets); + // filter this so we only handle buckets for known peers + bucketStore.updateRemoteBuckets(Maps.filterKeys(buckets, peers::containsKey)); } /**