Exemple #1
0
 private void storeDecision(ProposalDecision decision, ReplicaState state)
 {
     if (!state.DecisionsBySlotId.ContainsKey(decision.SlotNumber))
     {
         state.DecisionsBySlotId.Add(decision.SlotNumber, decision.Command);
     }
 }
Exemple #2
0
        private ClientRequest cleanProposal(ProposalDecision decision, ReplicaState state)
        {
            ClientRequest request = state.ProposalsRequestsBySlotId[decision.SlotNumber];

            state.ProposalsRequestsBySlotId.Remove(decision.SlotNumber);
            return(request);
        }
Exemple #3
0
        public void Execute(MessageStrategyExecuteArg <IMessage> obj)
        {
            if (!(obj.Message is ProposalDecision))
            {
                throw new MessageStrategyException("This strategy shouldn't be invoked with this message type");
            }

            ProposalDecision decision = obj.Message as ProposalDecision;
            ReplicaState     state    = obj.RoleState as ReplicaState;

            storeDecision(decision, state);
            if (proposalHasBeenApproved(decision, state))
            {
                ClientRequest clientRequest = cleanProposal(decision, state);
                OnDecisionApproved?.Invoke(this, clientRequest);
            }
            else
            {
                ClientRequest clientRequest = null;
                if (replicaIsProposalEmitter(decision, state))
                {
                    temporaryRemoveClientPendingResponseUntilNextRetry(decision, state);
                    clientRequest = cleanProposal(decision, state);
                }

                OnDecisionRejected?.Invoke(this, clientRequest);
            }
        }
Exemple #4
0
        private void notifyAllReplicasOfElectedValue(VoteResponse message)
        {
            ProposalDecision decision = new ProposalDecision(message);

            decision.Command = this.currentState.ProposalsBySlotId[message.SlotNumber];
            foreach (MessageSender replica in this.currentState.Replicas)
            {
                this.MessageBroker.SendMessage(replica.UniqueId, decision);
            }
        }
Exemple #5
0
 private bool proposalHasBeenApproved(ProposalDecision decision, ReplicaState state)
 {
     return(state.ProposalsRequestsBySlotId.ContainsKey(decision.SlotNumber) &&
            state.DecisionsBySlotId.ContainsKey(decision.SlotNumber) &&
            state.ProposalsRequestsBySlotId[decision.SlotNumber].Command == state.DecisionsBySlotId[decision.SlotNumber]);
 }
Exemple #6
0
 private void temporaryRemoveClientPendingResponseUntilNextRetry(ProposalDecision decision, ReplicaState state)
 {
     state.ClientsPendingResponseBySlotId.Remove(decision.SlotNumber);
 }
Exemple #7
0
 private bool replicaIsProposalEmitter(ProposalDecision decision, ReplicaState state)
 {
     return(state.ProposalsRequestsBySlotId.ContainsKey(decision.SlotNumber));
 }