public void Cluster_singleton_manager_with_lease_should_find_the_lease_on_every_node() { Sys.ActorSelection(Node(_config.Controller) / "user" / $"lease-{Sys.Name}").Tell(new Identify(null)); IActorRef leaseRef = ExpectMsg <ActorIdentity>().Subject; TestLeaseActorClientExt.Get(Sys).SetActorLease(leaseRef); EnterBarrier("singleton-started"); }
public TestLeaseActorClient(LeaseSettings settings, ExtendedActorSystem system) : base(settings) { _log = Logging.GetLogger(system, "TestLeaseActorClient"); leaseActor = TestLeaseActorClientExt.Get(system).GetLeaseActor(); _log.Info("lease created {0}", settings); leaseActor.Tell(new TestLeaseActor.Create(settings.LeaseName, settings.OwnerName)); }
public void Cluster_singleton_manager_with_lease_should_Start_singleton_and_ping_from_all_nodes() { RunOn(() => { Sys.ActorOf( ClusterSingletonManager.Props( ClusterSingletonManagerLeaseSpecConfig.ImportantSingleton.Props, PoisonPill.Instance, ClusterSingletonManagerSettings.Create(Sys).WithRole("worker")), "important"); }, _config.First, _config.Second, _config.Third, _config.Fourth); EnterBarrier("singleton-started"); var proxy = Sys.ActorOf( ClusterSingletonProxy.Props( singletonManagerPath: "/user/important", settings: ClusterSingletonProxySettings.Create(Sys).WithRole("worker"))); RunOn(() => { proxy.Tell("Ping"); // lease has not been granted so now allowed to come up ExpectNoMsg(TimeSpan.FromSeconds(2)); }, _config.First, _config.Second, _config.Third, _config.Fourth); EnterBarrier("singleton-pending"); RunOn(() => { TestLeaseActorClientExt.Get(Sys).GetLeaseActor().Tell(TestLeaseActor.GetRequests.Instance); ExpectMsg <TestLeaseActor.LeaseRequests>(msg => msg.Requests.Should().BeEquivalentTo(new TestLeaseActor.Acquire(GetAddress(_config.First).HostPort()))); TestLeaseActorClientExt.Get(Sys).GetLeaseActor().Tell(new TestLeaseActor.ActionRequest(new TestLeaseActor.Acquire(GetAddress(_config.First).HostPort()), true)); }, _config.Controller); EnterBarrier("lease-acquired"); RunOn(() => { ExpectMsg(new ClusterSingletonManagerLeaseSpecConfig.ImportantSingleton.Response("Ping", GetAddress(_config.First))); }, _config.First, _config.Second, _config.Third, _config.Fourth); EnterBarrier("pinged"); }
public void Cluster_singleton_manager_with_lease_should_Move_singleton_when_oldest_node_downed() { Cluster.State.Members.Count.ShouldBe(5); RunOn(() => { Cluster.Down(GetAddress(_config.First)); AwaitAssert(() => { Cluster.State.Members.Select(i => i.Status).Should().BeEquivalentTo(MemberStatus.Up, MemberStatus.Up, MemberStatus.Up, MemberStatus.Up); }, TimeSpan.FromSeconds(20)); TestLeaseActor.LeaseRequests requests = null; AwaitAssert(() => { TestLeaseActorClientExt.Get(Sys).GetLeaseActor().Tell(TestLeaseActor.GetRequests.Instance); var msg = ExpectMsg <TestLeaseActor.LeaseRequests>(); msg.Requests.Count.ShouldBe(2, "Requests: " + msg); requests = msg; }, TimeSpan.FromSeconds(10)); requests.Requests.Should().Contain(new TestLeaseActor.Release(GetAddress(_config.First).HostPort())); requests.Requests.Should().Contain(new TestLeaseActor.Acquire(GetAddress(_config.Second).HostPort())); }, _config.Controller); RunOn(() => { AwaitAssert(() => { Cluster.State.Members.Select(i => i.Status).Should().BeEquivalentTo(MemberStatus.Up, MemberStatus.Up, MemberStatus.Up, MemberStatus.Up); }, TimeSpan.FromSeconds(20)); }, _config.Second, _config.Third, _config.Fourth); EnterBarrier("first node downed"); var proxy = Sys.ActorOf( ClusterSingletonProxy.Props( singletonManagerPath: "/user/important", settings: ClusterSingletonProxySettings.Create(Sys).WithRole("worker"))); RunOn(() => { proxy.Tell("Ping"); // lease has not been granted so now allowed to come up ExpectNoMsg(TimeSpan.FromSeconds(2)); }, _config.Second, _config.Third, _config.Fourth); EnterBarrier("singleton-not-migrated"); RunOn(() => { TestLeaseActorClientExt.Get(Sys).GetLeaseActor().Tell(new TestLeaseActor.ActionRequest(new TestLeaseActor.Acquire(GetAddress(_config.Second).HostPort()), true)); }, _config.Controller); EnterBarrier("singleton-moved-to-second"); RunOn(() => { proxy.Tell("Ping"); ExpectMsg(new ClusterSingletonManagerLeaseSpecConfig.ImportantSingleton.Response("Ping", GetAddress(_config.Second)), TimeSpan.FromSeconds(20)); }, _config.Second, _config.Third, _config.Fourth); EnterBarrier("finished"); }