/// <summary> /// The strategy named keep-majority will down the unreachable nodes if the /// current node is in the majority part based on the last known membership information. /// Otherwise down the reachable nodes, i.e. the own part. If the parts are of equal size /// the part containing the node with the lowest address is kept. /// </summary> public IEnumerable <Member> GetVictims(CurrentClusterState clusterState) { var members = clusterState.GetMembers(Role); var unreachableMembers = clusterState.GetUnreachableMembers(Role); var availableMembers = clusterState.GetAvailableMembers(Role); int unreachableCount = unreachableMembers.Count; int availableCount = availableMembers.Count; if (availableCount == unreachableCount) { var oldest = clusterState.GetMembers(Role).SortByAge().FirstOrDefault(); if (oldest != null && availableMembers.Contains(oldest)) { return(clusterState.GetUnreachableMembers()); } else { return(clusterState.GetMembers()); } } return(availableCount < unreachableCount //too few available, down our partition (entire members) ? clusterState.GetMembers() //enough available, down unreachable : clusterState.GetUnreachableMembers());; }
public IEnumerable <Member> GetVictims(CurrentClusterState clusterState) { var members = clusterState.GetMembers(Role); var unreachable = clusterState.GetUnreachableMembers(Role); int availableCount = members.Count - unreachable.Count; return(availableCount < QuorumSize //too few available, down our partition ? clusterState.GetMembers() //enough available, down unreachable : clusterState.GetUnreachableMembers()); }
public IEnumerable <Member> GetVictims(CurrentClusterState clusterState) { bool haveReferee = clusterState.HasAvailableMember(Address); return(!haveReferee || clusterState.GetAvailableMembers().Count < DownAllIfLessThanNodes ? clusterState.GetMembers() : clusterState.GetUnreachableMembers()); }