void PaxosProposer::OnProposeResponse(PaxosMessage& imsg) { PaxosMessage omsg; Log_Trace("msg.nodeID = %u", imsg.nodeID); if (!state.proposing || imsg.proposalID != state.proposalID) return; if (imsg.type == PAXOS_PROPOSE_REJECTED) { Log_Debug("Propose rejected, quorumID: %U", context->GetQuorumID()); vote->RegisterRejected(imsg.nodeID); } else vote->RegisterAccepted(imsg.nodeID); if (vote->IsRejected()) { StopProposing(); EventLoop::Add(&restartTimeout); } else if (vote->IsAccepted()) { // a majority have accepted our proposal, we have consensus StopProposing(); omsg.LearnProposal(context->GetPaxosID(), MY_NODEID, state.proposalID); BroadcastMessage(omsg); state.learnSent = true; } }
void PaxosProposer::OnProposeResponse(PaxosMessage& imsg) { PaxosMessage omsg; Log_Trace("msg.nodeID = %u", imsg.nodeID); if (!state.proposing || imsg.proposalID != state.proposalID) return; if (imsg.type == PAXOS_PROPOSE_REJECTED) { Log_Debug("Propose rejected"); vote->RegisterRejected(imsg.nodeID); } else vote->RegisterAccepted(imsg.nodeID); // see if we have enough positive replies to advance if (vote->IsAccepted()) { // a majority have accepted our proposal, we have consensus StopProposing(); omsg.LearnProposal(context->GetPaxosID(), MY_NODEID, state.proposalID); BroadcastMessage(omsg); } else if (vote->IsComplete()) StartPreparing(); }