public void JoinClusterWithOneOfflineSeedNode() { Within(TimeSpan.FromSeconds(30), () => { RunOn(() => { Sys.ActorOf(c => c.Receive<UniqueAddress>((address, ctx) => { _seedUniqueAddress = address; ctx.Sender.Tell("ok"); }), "address-receiver"); Sys.ActorOf(Props.Create(() => new DomainEventLogger()), "cluster-logger"); }, _config.NonSeed); EnterBarrier("addr-receiver-ready"); RunOn(() => { _seedUniqueAddress = Cluster.Get(_seedSystem.Value).SelfUniqueAddress; _seedSystem.Value.ActorOf(Props.Create(() => new DomainEventLogger()), "clusterLogger"); var probe = CreateTestProbe(_seedSystem.Value); _seedSystem.Value.ActorSelection(new RootActorPath(GetAddress(_config.NonSeed)) / "user" / "address-receiver").Tell(_seedUniqueAddress, probe.Ref); probe.ExpectMsg("ok", TimeSpan.FromSeconds(5)); }, _config.Seed); EnterBarrier("addr-transferred"); RunOn(() => { Cluster.Get(_seedSystem.Value).JoinSeedNodes(SeedNodes); AwaitCondition(() => Cluster.Get(_seedSystem.Value).ReadView.IsSingletonCluster); _seedSystem.Value.ActorOf(Props.Create(() => new LeaderSynchronizer()), "leader-sync"); }, _config.Seed); EnterBarrier("seed-self-joined"); RunOn(() => { var unreachableNodeAddress = Cluster.Get(_unavailableSeedSystem.Value).SelfAddress; // terminate the unreachableSeedNode Shutdown(_unavailableSeedSystem.Value, RemainingOrDefault); Cluster.JoinSeedNodes(SeedNodes.Add(unreachableNodeAddress)); // append the unreachable node address AwaitMembersUp(2); Sys.ActorOf(Props.Create(() => new LeaderSynchronizer()), "leader-sync"); }, _config.NonSeed); EnterBarrier("formed-cluster"); /* * Verify that both nodes agree on who the leader is */ RunOn(() => { var addr2 = GetAddress(_config.NonSeed); var probe2 = CreateTestProbe(_seedSystem.Value); AwaitAssert(() => { _seedSystem.Value.ActorSelection(new RootActorPath(addr2) / "user" / "leader-sync") .Tell("leader", probe2.Ref); _verifiedLeader = probe2.ExpectMsg<Address>(); _verifiedLeader.Should().Be(Cluster.Get(_seedSystem.Value).State.Leader); }); }, _config.Seed); RunOn(() => { AwaitAssert(() => { _verifiedLeader = Sys.ActorSelection(new RootActorPath(SeedUniqueAddress.Address) / "user" / "leader-sync") .Ask<Address>("leader") .Result; _verifiedLeader.Should().Be(Cluster.State.Leader); }); }, _config.NonSeed); EnterBarrier("verified-leader"); }); }