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; } } } }
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); }
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); }