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_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_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);
        }
예제 #4
0
        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 PersistentActor_with_Timer_must_not_discard_timer_msg_due_to_stashing()
        {
            var pa = ActorOf(TestPersistentActor.TestProps("p1"));

            pa.Tell("msg1");
            ExpectMsg <string>("msg1");
        }
        public void PersistentActor_with_Timer_must_handle_AutoReceivedMessages_automatically()
        {
            var pa = ActorOf(TestPersistentActor.TestProps("p3"));

            Watch(pa);
            pa.Tell(new AutoReceivedMessageWrapper(PoisonPill.Instance));
            ExpectTerminated(pa);
        }
        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);
        }