Example #1
0
        public Joiner(INode i, IReaderWriter readerWriter, IRecon recon, IMessageHub messageHub)
        {
            this.i          = i;
            this.messageHub = messageHub;
            eventHandlers   = new EventHandlerList();
            status          = new ObservableAtomicValue <NodeStatus>(NodeStatus.Idle);
            reconStatus     = new ObservableAtomicValue <NodeStatus>(NodeStatus.Idle);
            rwStatus        = new ObservableAtomicValue <NodeStatus>(NodeStatus.Idle);
            hints           = new ObservableAtomicValue <IEnumerable <INode> >(Enumerable.Empty <INode>());

            preJoinRw = new ObservableCondition(() => status.Get() == NodeStatus.Joining &&
                                                rwStatus.Get() == NodeStatus.Idle,
                                                new[] { status, rwStatus });
            preJoinRecon = new ObservableCondition(() => status.Get() == NodeStatus.Joining &&
                                                   reconStatus.Get() == NodeStatus.Idle,
                                                   new[] { status, reconStatus });
            preJoin    = new ObservableCondition(() => status.Get() == NodeStatus.Joining, new[] { status });
            preJoinAck = new ObservableCondition(() => status.Get() == NodeStatus.Joining &&
                                                 rwStatus.Get() == NodeStatus.Active &&
                                                 reconStatus.Get() == NodeStatus.Active,
                                                 new[] { status, rwStatus, reconStatus });

            this.recon                 = recon;
            this.recon.JoinAck        += JoinAckReaderWriter;
            this.readerWriter          = readerWriter;
            this.readerWriter.JoinAck += JoinAckRecon;

            new Thread(OutJoinRw).Start();
            new Thread(OutJoinRecon).Start();
            new Thread(OutSend).Start();
            new Thread(OutJoinAck).Start();
        }
Example #2
0
        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));
        }
Example #3
0
        private bool PropagationFixCondition()
        {
            var operationType = op.Type.Get();

            return(status.Get() == NodeStatus.Active &&
                   (operationType == OperationType.Read || operationType == OperationType.Write) &&
                   op.Phase.Get() == OperationPhase.Propagation &&
                   QuorumReached(op.ConfigurationMap, op.Accepted));
        }
Example #4
0
        /// <summary>
        /// send(join)i;j , j ∈ I - {i}
        /// </summary>
        private void OutSend()
        {
            preJoin.Waitable.WaitOne();

            foreach (var node in hints.Get())
            {
                messageHub.Send(node, new JoinRwMessage(i));
            }
        }
Example #5
0
 /// <summary>
 /// Input join(rambo; J)i
 /// </summary>
 /// <param name="initialWorld"></param>
 public void Join(IEnumerable <INode> initialWorld)
 {
     // TODO: Entry point.
     // Here all status handling threads (see ctor) might be started
     if (status.Get() == NodeStatus.Idle)
     {
         status.Set(NodeStatus.Joining);
         hints.Set(initialWorld);
     }
 }