Esempio n. 1
0
        public void Remove(Member m)
        {
            if (m.UniqueAddress.Equals(SelfUniqueAddress))
            {
                Context.Stop(Self);
            }
            else
            {
                MutateMemberInfo(false, () =>
                {
                    Log.Debug("SBR remove [{0}]", m);
                    Strategy.Remove(m);

                    ResetReachabilityChangedStatsIfAllUnreachableDowned();

                    switch (releaseLeaseCondition)
                    {
                    case ReleaseLeaseCondition.WhenMembersRemoved rlc:
                        var remainingDownedNodes = rlc.Nodes.Remove(m.UniqueAddress);

                        if (remainingDownedNodes.IsEmpty)
                        {
                            releaseLeaseCondition =
                                new ReleaseLeaseCondition.WhenTimeElapsed(Deadline.Now + releaseLeaseAfter);
                        }
                        else
                        {
                            releaseLeaseCondition =
                                new ReleaseLeaseCondition.WhenMembersRemoved(remainingDownedNodes);
                        }
                        break;
                    }
                });
            }
        }
Esempio n. 2
0
        private void OnReleaseLeaseResult(bool released)
        {
            switch (releaseLeaseCondition)
            {
            case ReleaseLeaseCondition.WhenTimeElapsed rlc:
                if (released && rlc.Deadline.IsOverdue)
                {
                    Log.Info("SBR released lease.");
                    releaseLeaseCondition = ReleaseLeaseCondition.NoLease.Instance;     // released successfully
                }

                break;
            }
        }
Esempio n. 3
0
        public Receive WaitingForLease(IDecision decision)
        {
            bool Receive(object message)
            {
                switch (message)
                {
                case AcquireLease _:
                    OnAcquireLease();     // reply message is LeaseResult
                    return(true);

                case AcquireLeaseResult lr:
                    if (lr.HoldingLease)
                    {
                        Log.Info("SBR acquired lease for decision [{0}]", decision);
                        var downedNodes = ActOnDecision(decision);
                        switch (releaseLeaseCondition)
                        {
                        case ReleaseLeaseCondition.WhenMembersRemoved rlc:
                            releaseLeaseCondition =
                                new ReleaseLeaseCondition.WhenMembersRemoved(rlc.Nodes.Union(downedNodes));
                            break;

                        default:
                            if (downedNodes.IsEmpty)
                            {
                                releaseLeaseCondition =
                                    new ReleaseLeaseCondition.WhenTimeElapsed(Deadline.Now + releaseLeaseAfter);
                            }
                            else
                            {
                                releaseLeaseCondition =
                                    new ReleaseLeaseCondition.WhenMembersRemoved(downedNodes);
                            }
                            break;
                        }
                    }
                    else
                    {
                        var reverseDecision = Strategy.ReverseDecision(decision);
                        Log.Info(
                            "SBR couldn't acquire lease, reverse decision [{0}] to [{1}]",
                            decision,
                            reverseDecision);
                        ActOnDecision(reverseDecision);
                        releaseLeaseCondition = ReleaseLeaseCondition.NoLease.Instance;
                    }

                    Stash.UnstashAll();
                    Context.Become(Receive);
                    return(true);

                case ReleaseLeaseResult lr:
                    // superseded by new acquire release request
                    return(true);

                case Tick _:
                    // ignore ticks while waiting
                    return(true);

                default:
                    Stash.Stash();
                    return(true);
                }
            }

            return(Receive);
        }