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); } }
public void AddMember(MemberStatus member) { _members.Add(member); _rdv.UpdateRdv(); }