Пример #1
0
        public Task PerformAction(DirectoryAction action)
        {
            var _hub = _hubs.GetOrAdd(action.Hub, _ => new ClusterNodeHubDirectory());


            lock (_syncObject)
            {
                var operationSequence = this.Sequence;

                if (_hub.PerformOperation(action))
                {
                    var remoteOperation = new RemoteDirectoryOperation(_membershipProvider.GetOwnUniqueId(), Sequence, action);

                    this.Sequence = this.Sequence == Int32.MaxValue ? 0 : this.Sequence++;

                    _actionHistory.Add(action);

                    return(_clusterClient.BroadcastDirectoryOperation(new[] { remoteOperation }));
                }
            }

            return(Task.CompletedTask);
        }
        public void PerformAction(RemoteDirectoryOperation operation)
        {
            var action = operation.Action;
            var node   = operation.Node;

            if (action.Element == DirectoryElement.Connection)
            {
                if (action.Action == DirectoryElementAction.Add)
                {
                    _connections.AddOrUpdate(action.Item, node, (_, __) => node);
                }
                else
                {
                    _connections.TryRemove(action.Item, out _);
                }

                return;
            }

            if (action.Element == DirectoryElement.User)
            {
                var user = action.Item;

                var hashSet = _users.GetOrAdd(user, ImmutableHashSet <string> .Empty);

                if (action.Action == DirectoryElementAction.Add)
                {
                    _users.AddOrUpdate(
                        user,
                        ImmutableHashSet <string> .Empty.Add(node),
                        (_, set) => set.Add(node)
                        );
                }
                else
                {
                    if (_users.TryGetValue(user, out var set))
                    {
                        var newSet = set.Remove(node);
                        if (newSet == ImmutableHashSet <string> .Empty)
                        {
                            _users.TryRemove(user, out _);
                        }
                        else
                        {
                            _users.TryUpdate(user, set, newSet);
                        }
                    }
                }

                return;
            }

            if (action.Element == DirectoryElement.Group)
            {
                var group = action.Item;

                var hashSet = _groups.GetOrAdd(group, ImmutableHashSet <string> .Empty);

                if (action.Action == DirectoryElementAction.Add)
                {
                    _users.AddOrUpdate(
                        group,
                        ImmutableHashSet <string> .Empty.Add(node),
                        (_, set) => set.Add(node)
                        );
                }
                else
                {
                    if (_users.TryGetValue(group, out var set))
                    {
                        var newSet = set.Remove(node);
                        if (newSet == ImmutableHashSet <string> .Empty)
                        {
                            _users.TryRemove(group, out _);
                        }
                        else
                        {
                            _users.TryUpdate(group, set, newSet);
                        }
                    }
                }

                return;
            }
        }