From d4d59200f8c56551755c36fbbd2b4aa52defa5cb Mon Sep 17 00:00:00 2001 From: Tom Pantelis Date: Thu, 24 Dec 2015 06:01:43 -0500 Subject: [PATCH] Bug 4823: Notify findPrimary callbacks on ReachableMember event 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 --- .../controller/cluster/datastore/ShardManager.java | 4 ++++ .../cluster/datastore/ShardManagerTest.java | 14 ++++++++++++++ 2 files changed, 18 insertions(+) diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/ShardManager.java b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/ShardManager.java index 8532b95efb..a91109c64b 100644 --- a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/ShardManager.java +++ b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/ShardManager.java @@ -1460,6 +1460,10 @@ public class ShardManager extends AbstractUntypedPersistentActorWithMetering { void setLeaderAvailable(boolean leaderAvailable) { this.leaderAvailable = leaderAvailable; + + if(leaderAvailable) { + notifyOnShardInitializedCallbacks(); + } } short getLeaderVersion() { diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/ShardManagerTest.java b/opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/ShardManagerTest.java index f9b67567d1..e32e9385f4 100644 --- a/opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/ShardManagerTest.java +++ b/opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/ShardManagerTest.java @@ -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"); -- 2.36.6