public ReaderWriter(INode creator, IMessageHub messageHub, IEnumerable <IConfiguration> configMap, IMessageSerializer serializer) { var configurations = configMap.ToDictionary(c => c.Key, c => c); this.serializer = serializer; op = new CurrentOperation { Phase = new ObservableAtomicValue <OperationPhase>(OperationPhase.Idle), Type = new ObservableAtomicValue <OperationType>(OperationType.Idle), Accepted = new ObservableConcurrentDictionary <int, INode>(Enumerable.Empty <KeyValuePair <int, INode> >()), ConfigurationMap = new ObservableConcurrentDictionary <IConfigurationIndex, IConfiguration>(configurations) }; gc = new GarbageCollectionOperation { Phase = new ObservableAtomicValue <OperationPhase>(OperationPhase.Idle) }; this.creator = creator; this.configMap = new ObservableConcurrentDictionary <IConfigurationIndex, IConfiguration>(configurations); this.messageHub = messageHub; value = new ObjectValue { Value = 0 }; tag = new Tag(creator); localPhase = new PhaseNumber(); operationQueue = new BlockingCollection <OperationRequest>(new ConcurrentQueue <OperationRequest>()); eventHandlers = new EventHandlerList(); status = new ObservableAtomicValue <NodeStatus>(NodeStatus.Idle); world = new ObservableConcurrentDictionary <int, INode>(); phaseVector = new ObservableConcurrentDictionary <INode, IPhaseNumber>(); preJoinAck = new ObservableCondition(() => status.Get() == NodeStatus.Active, new[] { status }); preOutSend = new ObservableCondition(() => status.Get() == NodeStatus.Active, new[] { status }); preQueryFix = new ObservableCondition(QueryFixCondition, new IChangeNotifiable[] { status, op.Type, op.Phase, op.Accepted, op.ConfigurationMap }); prePropagationFix = new ObservableCondition(PropagationFixCondition, new IChangeNotifiable[] { status, op.Type, op.Phase, op.Accepted, op.ConfigurationMap }); preReadAck = new ObservableCondition(() => status.Get() == NodeStatus.Active && op.Type.Get() == OperationType.Read && op.Phase.Get() == OperationPhase.Done, new IChangeNotifiable[] { status, op.Type, op.Phase }); preWriteAck = new ObservableCondition(() => status.Get() == NodeStatus.Active && op.Type.Get() == OperationType.Write && op.Phase.Get() == OperationPhase.Done, new IChangeNotifiable[] { status, op.Type, op.Phase }); new Thread(ProcessReadWriteRequests).Start(); new Thread(OutJoinAck).Start(); new Thread(OutSend).Start(); new Thread(IntQueryFix).Start(); new Thread(IntPropagationFix).Start(); new Thread(OutReadAck).Start(); new Thread(OutWriteAck).Start(); var listener = messageHub.Subscribe(creator); listener.Where(m => m.Body.MessageType.ToMessageType() == MessageTypes.JoinRw) .Subscribe(new MessageStreamListener(OnJoinReceived)); listener.Where(m => m.Body.MessageType.ToMessageType() == MessageTypes.Gossip) .Subscribe(new MessageStreamListener(OnGossipReceived)); }
private void MergeWorld(IObservableConcurrentDictionary <int, INode> localWorld, IEnumerable <INode> senderWorld) { foreach (var node in senderWorld) { localWorld[node.Id] = node; } }
private bool Usable(IObservableConcurrentDictionary <IConfigurationIndex, IConfiguration> configurationMap) { var gc = configurationMap.Where(entry => entry.Value.State == ConfigurationState.GCed); var active = configurationMap.Where(entry => entry.Value.State == ConfigurationState.Active); return(MonitonicallyIncreasing(gc.Select(c => c.Key), active.Select(c => c.Key))); }
private void ExtendConfigurationMap(IObservableConcurrentDictionary <IConfigurationIndex, IConfiguration> localConfiguration, IEnumerable <KeyValuePair <IConfigurationIndex, IConfiguration> > senderConfig) { foreach (var configuration in senderConfig) { if (!localConfiguration.ContainsKey(configuration.Key)) { localConfiguration[configuration.Key] = configuration.Value; } } }
private void UpdateConfigurationMap(IObservableConcurrentDictionary <IConfigurationIndex, IConfiguration> localConfiguration, IEnumerable <KeyValuePair <IConfigurationIndex, IConfiguration> > senderConfig) { foreach (var configuration in senderConfig) { if (configuration.Value.State == ConfigurationState.GCed || localConfiguration[configuration.Key].State == ConfigurationState.GCed) { localConfiguration[configuration.Key] = new GarbageCollectedConfiguration(configuration.Key); } else if (configuration.Value.State == ConfigurationState.Active) { localConfiguration[configuration.Key] = configuration.Value; } } }