A_leader_that_is_leaving_must_be_moved_to_leaving_then_exiting_then_removed_then_be_shut_down_and_then_a_new_leader_should_be_elected
()
{
AwaitClusterUp(_config.First, _config.Second, _config.Third);
var oldLeaderAddress = ClusterView.Leader;
Within(TimeSpan.FromSeconds(30), () =>
{
if (ClusterView.IsLeader)
{
EnterBarrier("registered-listener");
Cluster.Leave(oldLeaderAddress);
EnterBarrier("leader-left");
// verify that the LEADER is shut down
AwaitCondition(() => Cluster.IsTerminated);
EnterBarrier("leader-shutdown");
}
else
{
var exitingLatch = new TestLatch();
var listener = Sys.ActorOf(Props.Create(() => new Listener(oldLeaderAddress, exitingLatch)).WithDeploy(Deploy.Local));
Cluster.Subscribe(listener, new []{typeof(ClusterEvent.IMemberEvent)});
EnterBarrier("registered-listener");
EnterBarrier("leader-left");
// verify that the LEADER is EXITING
exitingLatch.Ready(TestLatch.DefaultTimeout);
EnterBarrier("leader-shutdown");
MarkNodeAsUnavailable(oldLeaderAddress);
// verify that the LEADER is no longer part of the 'members' set
AwaitAssert(() => ClusterView.Members.Select(m => m.Address).Contains(oldLeaderAddress).ShouldBeFalse());
// verify that the LEADER is not part of the 'unreachable' set
AwaitAssert(() => ClusterView.UnreachableMembers.Select(m => m.Address).Contains(oldLeaderAddress).ShouldBeFalse());
// verify that we have a new LEADER
AwaitAssert(() => ClusterView.Leader.ShouldNotBe(oldLeaderAddress));
}
EnterBarrier("finished");
});
}
}