public void RecoveryPermitter_must_return_permit_when_actor_throws_from_RecoveryCompleted() { var p1 = CreateTestProbe(); var p2 = CreateTestProbe(); var p3 = CreateTestProbe(); var p4 = CreateTestProbe(); RequestPermit(p1); RequestPermit(p2); var persistentActor = Sys.ActorOf(TestPersistentActor.Props("p3", p3.Ref, throwFromRecoveryCompleted: true)); p3.ExpectMsg <RecoveryCompleted>(); p3.ExpectMsg("postStop"); // it's restarting for (int i = 1; i < 5; i++) { p3.ExpectMsg <RecoveryCompleted>(); p3.ExpectMsg("postStop"); } // stop it var stopProbe = CreateTestProbe(); stopProbe.Watch(persistentActor); Sys.Stop(persistentActor); stopProbe.ExpectTerminated(persistentActor); RequestPermit(p4); permitter.Tell(ReturnRecoveryPermit.Instance, p1.Ref); permitter.Tell(ReturnRecoveryPermit.Instance, p2.Ref); permitter.Tell(ReturnRecoveryPermit.Instance, p4.Ref); }
public void RecoveryPermitter_must_return_permit_when_actor_is_prematurely_terminated_before_holding_permit() { var p1 = CreateTestProbe(); var p2 = CreateTestProbe(); var p3 = CreateTestProbe(); var p4 = CreateTestProbe(); var p5 = CreateTestProbe(); RequestPermit(p1); RequestPermit(p2); RequestPermit(p3); var persistentActor = Sys.ActorOf(TestPersistentActor.Props("p4", p4.Ref)); p4.ExpectNoMsg(100); permitter.Tell(RequestRecoveryPermit.Instance, p5.Ref); p5.ExpectNoMsg(100); // PoisonPill is not stashed persistentActor.Tell(PoisonPill.Instance); p4.ExpectMsg("postStop"); // persistentActor didn't hold a permit so still p5.ExpectNoMsg(100); permitter.Tell(ReturnRecoveryPermit.Instance, p1.Ref); p5.ExpectMsg <RecoveryPermitGranted>(); permitter.Tell(ReturnRecoveryPermit.Instance, p2.Ref); permitter.Tell(ReturnRecoveryPermit.Instance, p3.Ref); permitter.Tell(ReturnRecoveryPermit.Instance, p4.Ref); }
public void RecoveryPermitter_must_delay_recovery_when_all_permits_used() { var p1 = CreateTestProbe(); var p2 = CreateTestProbe(); var p3 = CreateTestProbe(); var p4 = CreateTestProbe(); RequestPermit(p1); RequestPermit(p2); RequestPermit(p3); var persistentActor = Sys.ActorOf(TestPersistentActor.Props("p4", p4.Ref)); p4.Watch(persistentActor); persistentActor.Tell("stop"); p4.ExpectNoMsg(200); permitter.Tell(ReturnRecoveryPermit.Instance, p3.Ref); p4.ExpectMsg <RecoveryCompleted>(); p4.ExpectMsg("postStop"); p4.ExpectTerminated(persistentActor); permitter.Tell(ReturnRecoveryPermit.Instance, p1.Ref); permitter.Tell(ReturnRecoveryPermit.Instance, p2.Ref); }
public void Many_persistent_actors_must_be_able_to_recover_without_overloading() { Enumerable.Range(1, 100).ForEach(n => { Sys.ActorOf(TestPersistentActor.Props($"a{n}", null)).Tell(new Cmd("A")); ExpectMsg($"a{n}-A-1"); }); // This would starve (block) all threads without max-concurrent-recoveries var latch = new TestLatch(); Enumerable.Range(1, 100).ForEach(n => { Sys.ActorOf(TestPersistentActor.Props($"a{n}", latch)).Tell(new Cmd("B")); }); // This should be able to progress even though above is blocking, 2 remaining non-blocked threads Enumerable.Range(1, 10).ForEach(n => { Sys.ActorOf(EchoActor.Props(this)).Tell(n); ExpectMsg(n); }); latch.CountDown(); ReceiveN(100).ShouldAllBeEquivalentTo(Enumerable.Range(1, 100).Select(n => $"a{n}-B-2")); }
public void RecoveryPermitter_must_grant_recovery_when_all_permits_not_used() { var p1 = CreateTestProbe(); var p2 = CreateTestProbe(); RequestPermit(p1); Sys.ActorOf(TestPersistentActor.Props("p2", p2.Ref)); p2.ExpectMsg <RecoveryCompleted>(); permitter.Tell(ReturnRecoveryPermit.Instance, p1.Ref); }