private void MemberUp(Member member) { if (!member.Address.Equals(_cluster.SelfAddress)) { _clusterNodes = _clusterNodes.Add(member.Address); TakeOverResponsibility(member.Address); Unreachable.Remove(member.Address); } }
protected override void OnReceive(object message) { var watchRemote = message as WatchRemote; if (watchRemote != null && _clusterNodes.Contains(watchRemote.Watchee.Path.Address)) { return; // cluster managed node, don't propagate to super; } var state = message as ClusterEvent.CurrentClusterState; if (state != null) { _clusterNodes = state.Members.Select(m => m.Address).Where(a => a != _cluster.SelfAddress).ToImmutableHashSet(); foreach (var node in _clusterNodes) { TakeOverResponsibility(node); } Unreachable.ExceptWith(_clusterNodes); return; } var memberUp = message as ClusterEvent.MemberUp; if (memberUp != null) { if (memberUp.Member.Address != _cluster.SelfAddress) { _clusterNodes = _clusterNodes.Add(memberUp.Member.Address); TakeOverResponsibility(memberUp.Member.Address); Unreachable.Remove(memberUp.Member.Address); } return; } var memberRemoved = message as ClusterEvent.MemberRemoved; if (memberRemoved != null) { if (memberRemoved.Member.Address != _cluster.SelfAddress) { _clusterNodes = _clusterNodes.Remove(memberRemoved.Member.Address); if (memberRemoved.PreviousStatus == MemberStatus.Down) { Quarantine(memberRemoved.Member.Address, memberRemoved.Member.UniqueAddress.Uid); } PublishAddressTerminated(memberRemoved.Member.Address); } return; } if (message is ClusterEvent.IMemberEvent) { return; // not interesting } base.OnReceive(message); }
public ClusterHeartbeatSenderState HeartbeatRsp(UniqueAddress from) { if (ActiveReceivers.Contains(from)) { FailureDetector.Heartbeat(from.Address); if (Unreachable.Contains(from)) { //back from unreachable, ok to stop heartbeating to it if (!Ring.MyReceivers.Value.Contains(from)) { FailureDetector.Remove(from.Address); } return(Copy(unreachable: Unreachable.Remove(from))); } return(this); } return(this); }