コード例 #1
0
ファイル: MemberList.cs プロジェクト: tdav/protoactor-dotnet
        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;
            }
        }
コード例 #2
0
        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();
            }
        }