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