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);
        }
        private static void UpdateAndNotify(MemberStatus @new, MemberStatus old)
        {
            if (@new == null && old == null)
            {
                return; //ignore
            }

            if (@new == null)
            {
                //update MemberStrategy
                foreach (var k in old.Kinds)
                {
                    if (MemberStrategyByKind.TryGetValue(k, out var ms))
                    {
                        ms.RemoveMember(old);
                        if (ms.GetAllMembers().Count == 0)
                        {
                            MemberStrategyByKind.Remove(k);
                        }
                    }
                }

                //notify left
                var left = new MemberLeftEvent(old.Host, old.Port, old.Kinds);
                Actor.EventStream.Publish(left);
                Members.Remove(old.Address);
                var endpointTerminated = new EndpointTerminatedEvent
                {
                    Address = old.Address
                };
                Actor.EventStream.Publish(endpointTerminated);
                return;
            }

            if (old == null)
            {
                //update MemberStrategy
                foreach (var k in @new.Kinds)
                {
                    if (!MemberStrategyByKind.ContainsKey(k))
                    {
                        MemberStrategyByKind[k] = Cluster.Config.MemberStrategyBuilder(k);
                    }
                    MemberStrategyByKind[k].AddMember(@new);
                }

                //notify joined
                var joined = new MemberJoinedEvent(@new.Host, @new.Port, @new.Kinds);
                Actor.EventStream.Publish(joined);
                return;
            }

            //update MemberStrategy
            if (@new.Alive != old.Alive || @new.MemberId != old.MemberId || @new.StatusValue != null && [email protected](old.StatusValue))
            {
                foreach (var k in @new.Kinds)
                {
                    if (MemberStrategyByKind.TryGetValue(k, out var ms))
                    {
                        ms.UpdateMember(@new);
                    }
                }
            }

            //notify changes
            if (@new.MemberId != old.MemberId)
            {
                var rejoined = new MemberRejoinedEvent(@new.Host, @new.Port, @new.Kinds);
                Actor.EventStream.Publish(rejoined);
            }
        }
Esempio n. 3
0
 public void AddMember(MemberStatus member)
 {
     _members.Add(member);
     _rdv.UpdateRdv();
 }