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; } }); } }
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; } }
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); }