Bug 4823: Notify findPrimary callbacks on ReachableMember event 66/31866/3
authorTom Pantelis <tpanteli@brocade.com>
Thu, 24 Dec 2015 11:01:43 +0000 (06:01 -0500)
committerGerrit Code Review <gerrit@opendaylight.org>
Tue, 5 Jan 2016 17:28:59 +0000 (17:28 +0000)
Modified the ShardManager to notify waiting findPrimary callbacks when a
ReachableMember event is received and leaderAvailable is set to true.
This prevents waiting findPrimary queries from timng out with
NoShardLeaderException.

Change-Id: Iabcc6f2a66e5271342914ebfcaad23dd1e122787
Signed-off-by: Tom Pantelis <tpanteli@brocade.com>
opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/ShardManager.java
opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/ShardManagerTest.java

index 8532b95efb3de9cbc39920dc622f4b420850aaab..a91109c64b3fa5aac674677b95d2a31c83477fbd 100644 (file)
@@ -1460,6 +1460,10 @@ public class ShardManager extends AbstractUntypedPersistentActorWithMetering {
 
         void setLeaderAvailable(boolean leaderAvailable) {
             this.leaderAvailable = leaderAvailable;
+
+            if(leaderAvailable) {
+                notifyOnShardInitializedCallbacks();
+            }
         }
 
         short getLeaderVersion() {
index f9b67567d1ae4214b06981176e5e443ab1a01f00..e32e9385f43b697058f924673e5ad0241368face 100644 (file)
@@ -794,6 +794,20 @@ public class ShardManagerTest extends AbstractActorTest {
 
             MessageCollectorActor.expectFirstMatching(mockShardActor1, PeerUp.class);
 
+            // Test FindPrimary wait succeeds after reachable member event.
+
+            shardManager1.underlyingActor().onReceiveCommand(MockClusterWrapper.
+                    createUnreachableMember("member-2", "akka.tcp://cluster-test@127.0.0.1:2558"));
+            shardManager1.underlyingActor().waitForUnreachableMember();
+
+            shardManager1.tell(new FindPrimary("default", true), getRef());
+
+            shardManager1.underlyingActor().onReceiveCommand(MockClusterWrapper.
+                    createReachableMember("member-2", "akka.tcp://cluster-test@127.0.0.1:2558"));
+
+            RemotePrimaryShardFound found2 = expectMsgClass(duration("5 seconds"), RemotePrimaryShardFound.class);
+            String path2 = found2.getPrimaryPath();
+            assertTrue("Unexpected primary path " + path2, path2.contains("member-2-shard-default-config"));
         }};
 
         LOG.info("testShardAvailabilityOnChangeOfMemberReachability ending");