internal static void UpdateClusterTopology(ClusterTopologyEvent msg) { performUpdate: if (Monitor.TryEnter(_lock, TimeSpan.FromSeconds(1))) { try { //get all new members address sets var newMembersAddress = new HashSet <string>(); foreach (var status in msg.Statuses) { newMembersAddress.Add(status.Address); } //remove old ones whose address not exist in new address sets //_members.ToList() duplicates _members, allow _members to be modified in Notify foreach (var(address, old) in _members.ToList()) { if (!newMembersAddress.Contains(address)) { UpdateAndNotify(null, old); } } //find all the entries that exist in the new set foreach (var @new in msg.Statuses) { _members.TryGetValue(@new.Address, out var old); _members[@new.Address] = @new; UpdateAndNotify(@new, old); } } finally { Monitor.Exit(_lock); } } else { _logger.LogDebug("Did not acquire lock within 1 seconds, retry"); goto performUpdate; } }
internal static void UpdateClusterTopology(ClusterTopologyEvent msg) { bool locked = RwLock.TryEnterWriteLock(1000); while (!locked) { Logger.LogDebug("MemberList did not acquire writer lock within 1 seconds, retry"); locked = RwLock.TryEnterWriteLock(1000); } try { //get all new members address sets var newMembersAddress = new HashSet <string>(); foreach (var status in msg.Statuses) { newMembersAddress.Add(status.Address); } //remove old ones whose address not exist in new address sets //_members.ToList() duplicates _members, allow _members to be modified in Notify foreach (var(address, old) in Members.ToList()) { if (!newMembersAddress.Contains(address)) { UpdateAndNotify(null, old); } } //find all the entries that exist in the new set foreach (var @new in msg.Statuses) { Members.TryGetValue(@new.Address, out var old); Members[@new.Address] = @new; UpdateAndNotify(@new, old); } } finally { RwLock.ExitWriteLock(); } }