Exemplo n.º 1
0
        public IEnumerable <Member> GetVictims(CurrentClusterState clusterState)
        {
            var oldest        = clusterState.GetMembers(Role).SortByAge().FirstOrDefault();
            var available     = clusterState.GetAvailableMembers(Role);
            var haveOldest    = oldest != null && available.Contains(oldest);
            var oldestIsAlone =
                (haveOldest && available.Count == 1) ||
                (!haveOldest && available.Count == clusterState.GetMembers(Role).Count - 1);

            if (oldest == null)
            {
                return(clusterState.GetUnreachableMembers());
            }

            if (oldestIsAlone && DownIfAlone)
            {
                return new List <Member> {
                           oldest
                }
            }
            ;

            return(haveOldest
                ? clusterState.GetUnreachableMembers()
                : clusterState.GetMembers());
        }
    }
Exemplo n.º 2
0
        /// <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());;
        }
Exemplo n.º 3
0
        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());
        }
Exemplo n.º 4
0
        public IEnumerable <Member> GetVictims(CurrentClusterState clusterState)
        {
            bool haveReferee = clusterState.HasAvailableMember(Address);

            return(!haveReferee || clusterState.GetAvailableMembers().Count < DownAllIfLessThanNodes
                ? clusterState.GetMembers()
                : clusterState.GetUnreachableMembers());
        }