BUG-6937: Add ReachableMember case to Gossiper 02/51202/2
authorTomas Cere <tcere@cisco.com>
Thu, 26 Jan 2017 17:36:33 +0000 (18:36 +0100)
committerRobert Varga <rovarga@cisco.com>
Mon, 30 Jan 2017 20:20:29 +0000 (21:20 +0100)
In case we detect a member down event we remove that member's
address from the whitelist, leading to further gossips being
ignored.

Subscribe to ReachableMember event to receive notifications
when the cluster heals, so we propagate re-add the member
back to the whitelist.

Change-Id: Id6b366edfa2be89e1a15225d2cad786bbf552129
Signed-off-by: Tomas Cere <tcere@cisco.com>
Signed-off-by: Robert Varga <rovarga@cisco.com>
(cherry picked from commit b78ee4d6b08e2cc0cf5edd01af0e54c3bf619ab5)

opendaylight/md-sal/sal-remoterpc-connector/src/main/java/org/opendaylight/controller/remote/rpc/registry/gossip/Gossiper.java

index f597c316e5cdfda042fef8f6ea12741a905b20cf..a50a2723cd2e71e55604be4162acfe5ed47dc333 100644 (file)
@@ -104,6 +104,7 @@ public class Gossiper extends AbstractUntypedActorWithMetering {
             cluster.subscribe(getSelf(),
                     ClusterEvent.initialStateAsEvents(),
                     ClusterEvent.MemberEvent.class,
+                    ClusterEvent.ReachableMember.class,
                     ClusterEvent.UnreachableMember.class);
         }
 
@@ -144,7 +145,10 @@ public class Gossiper extends AbstractUntypedActorWithMetering {
             // comparing the GossipStatus message with its local versions.
             receiveGossip((GossipEnvelope) message);
         } else if (message instanceof ClusterEvent.MemberUp) {
-            receiveMemberUp(((ClusterEvent.MemberUp) message).member());
+            receiveMemberUpOrReachable(((ClusterEvent.MemberUp) message).member());
+
+        } else if (message instanceof ClusterEvent.ReachableMember) {
+            receiveMemberUpOrReachable(((ClusterEvent.ReachableMember) message).member());
 
         } else if (message instanceof ClusterEvent.MemberRemoved) {
             receiveMemberRemoveOrUnreachable(((ClusterEvent.MemberRemoved) message).member());
@@ -179,10 +183,11 @@ public class Gossiper extends AbstractUntypedActorWithMetering {
      * Add member to the local copy of member list if it doesnt already
      * @param member
      */
-    void receiveMemberUp(Member member) {
+    void receiveMemberUpOrReachable(final Member member) {
 
         if (selfAddress.equals(member.address())) {
-            return; //ignore up notification for self
+            //ignore up notification for self
+            return;
         }
 
         if (!clusterMembers.contains(member.address())) {