public string GetNode()
        {
            var members = _memberStrategy.GetAllMembers();
            var l = members.Count;
            if (l == 0) return "";
            if (l == 1) return members[0].Address;

            lock (_lock)
            {
                while (true)
                {
                    _currIndex = (_currIndex + 1) % l;

                    if (_currIndex == 0)
                    {
                        if (_currWeight > _gcd)
                        {
                            _currWeight -= _gcd;
                        }
                        else
                        {
                            _currWeight = _maxWeight;
                        }
                    }

                    if (((WeightedMemberStatusValue) members[_currIndex].StatusValue).Weight >= _currWeight)
                    {
                        return members[_currIndex].Address;
                    }
                }
            }
        }
Exemplo n.º 2
0
        public string GetNode(string key)
        {
            var members = _m.GetAllMembers();

            if (members == null || members.Count == 0)
            {
                return("");
            }

            if (members.Count == 1)
            {
                return(members[0].Address);
            }

            var keyBytes = Encoding.UTF8.GetBytes(key);

            uint         maxScore = 0;
            MemberStatus maxNode  = null;
            uint         score;

            for (int i = 0; i < members.Count; i++)
            {
                var member = members[i];
                if (member.Alive)
                {
                    var hashBytes = _memberHashes[i];
                    score = RdvHash(hashBytes, keyBytes);
                    if (score > maxScore)
                    {
                        maxScore = score;
                        maxNode  = member;
                    }
                }
            }

            return(maxNode == null ? "" : maxNode.Address);
        }
Exemplo n.º 3
0
        public string GetNode()
        {
            var members = _m.GetAllMembers();
            var l       = members.Count;

            if (l == 0)
            {
                return("");
            }
            if (l == 1)
            {
                return(members[0].Address);
            }

            var nv = Interlocked.Increment(ref _val);

            return(members[nv % l].Address);
        }