void Proposer :: Prepare(const bool bNeedNewBallot) { PLGHead("START Now.InstanceID %lu MyNodeID %lu State.ProposalID %lu State.ValueLen %zu", GetInstanceID(), m_poConfig->GetMyNodeID(), m_oProposerState.GetProposalID(), m_oProposerState.GetValue().size()); BP->GetProposerBP()->Prepare(); m_oTimeStat.Point(); ExitAccept(); m_bIsPreparing = true; m_bCanSkipPrepare = false; m_bWasRejectBySomeone = false; m_oProposerState.ResetHighestOtherPreAcceptBallot(); if (bNeedNewBallot) { m_oProposerState.NewPrepare(); } PaxosMsg oPaxosMsg; oPaxosMsg.set_msgtype(MsgType_PaxosPrepare); oPaxosMsg.set_instanceid(GetInstanceID()); oPaxosMsg.set_nodeid(m_poConfig->GetMyNodeID()); oPaxosMsg.set_proposalid(m_oProposerState.GetProposalID()); m_oMsgCounter.StartNewRound(); AddPrepareTimer(); PLGHead("END OK"); BroadcastMessage(oPaxosMsg); }
void Learner :: OnSendLearnValue_Ack(const PaxosMsg & oPaxosMsg) { BP->GetLearnerBP()->OnSendLearnValue_Ack(); PLGHead("Msg.Ack.Instanceid %lu Msg.from_nodeid %lu", oPaxosMsg.instanceid(), oPaxosMsg.nodeid()); m_oLearnerSender.Ack(oPaxosMsg.instanceid(), oPaxosMsg.nodeid()); }
void Proposer :: OnExpiredAcceptReply(const PaxosMsg & oPaxosMsg) { if (oPaxosMsg.rejectbypromiseid() != 0) { PLGDebug("[Expired Accept Reply Reject] RejectByPromiseID %lu", oPaxosMsg.rejectbypromiseid()); m_bWasRejectBySomeone = true; m_oProposerState.SetOtherProposalID(oPaxosMsg.rejectbypromiseid()); } }
int Learner :: SendLearnValue( const nodeid_t iSendNodeID, const uint64_t llLearnInstanceID, const BallotNumber & oLearnedBallot, const std::string & sLearnedValue, const uint32_t iChecksum, const bool bNeedAck) { BP->GetLearnerBP()->SendLearnValue(); PaxosMsg oPaxosMsg; oPaxosMsg.set_msgtype(MsgType_PaxosLearner_SendLearnValue); oPaxosMsg.set_instanceid(llLearnInstanceID); oPaxosMsg.set_nodeid(m_poConfig->GetMyNodeID()); oPaxosMsg.set_proposalnodeid(oLearnedBallot.m_llNodeID); oPaxosMsg.set_proposalid(oLearnedBallot.m_llProposalID); oPaxosMsg.set_value(sLearnedValue); oPaxosMsg.set_lastchecksum(iChecksum); if (bNeedAck) { oPaxosMsg.set_flag(PaxosMsgFlagType_SendLearnValue_NeedAck); } return SendMessage(iSendNodeID, oPaxosMsg, Message_SendType_TCP); }
void Proposer :: OnAcceptReply(const PaxosMsg & oPaxosMsg) { PLGHead("START Msg.ProposalID %lu State.ProposalID %lu Msg.from_nodeid %lu RejectByPromiseID %lu", oPaxosMsg.proposalid(), m_oProposerState.GetProposalID(), oPaxosMsg.nodeid(), oPaxosMsg.rejectbypromiseid()); BP->GetProposerBP()->OnAcceptReply(); if (!m_bIsAccepting) { //PLGErr("Not proposing, skip this msg"); BP->GetProposerBP()->OnAcceptReplyButNotAccepting(); return; } if (oPaxosMsg.proposalid() != m_oProposerState.GetProposalID()) { //PLGErr("ProposalID not same, skip this msg"); BP->GetProposerBP()->OnAcceptReplyNotSameProposalIDMsg(); return; } m_oMsgCounter.AddReceive(oPaxosMsg.nodeid()); if (oPaxosMsg.rejectbypromiseid() == 0) { PLGDebug("[Accept]"); m_oMsgCounter.AddPromiseOrAccept(oPaxosMsg.nodeid()); } else { PLGDebug("[Reject]"); m_oMsgCounter.AddReject(oPaxosMsg.nodeid()); m_bWasRejectBySomeone = true; m_oProposerState.SetOtherProposalID(oPaxosMsg.rejectbypromiseid()); } if (m_oMsgCounter.IsPassedOnThisRound()) { int iUseTimeMs = m_oTimeStat.Point(); BP->GetProposerBP()->AcceptPass(iUseTimeMs); PLGImp("[Pass] Start send learn, usetime %dms", iUseTimeMs); ExitAccept(); m_poLearner->ProposerSendSuccess(GetInstanceID(), m_oProposerState.GetProposalID()); } else if (m_oMsgCounter.IsRejectedOnThisRound() || m_oMsgCounter.IsAllReceiveOnThisRound()) { BP->GetProposerBP()->AcceptNotPass(); PLGImp("[Not pass] wait 30ms and Restart prepare"); AddAcceptTimer(OtherUtils::FastRand() % 30 + 10); } PLGHead("END"); }
void Learner :: OnAskforCheckpoint(const PaxosMsg & oPaxosMsg) { CheckpointSender * poCheckpointSender = GetNewCheckpointSender(oPaxosMsg.nodeid()); if (poCheckpointSender != nullptr) { poCheckpointSender->start(); PLGHead("new checkpoint sender started, send to nodeid %lu", oPaxosMsg.nodeid()); } else { PLGErr("Checkpoint Sender is running"); } }
void Learner :: SendNowInstanceID(const uint64_t llInstanceID, const nodeid_t iSendNodeID) { BP->GetLearnerBP()->SendNowInstanceID(); PaxosMsg oPaxosMsg; oPaxosMsg.set_instanceid(llInstanceID); oPaxosMsg.set_nodeid(m_poConfig->GetMyNodeID()); oPaxosMsg.set_msgtype(MsgType_PaxosLearner_SendNowInstanceID); oPaxosMsg.set_nowinstanceid(GetInstanceID()); oPaxosMsg.set_minchoseninstanceid(m_poCheckpointMgr->GetMinChosenInstanceID()); if ((GetInstanceID() - llInstanceID) > 50) { //instanceid too close not need to send vsm/master checkpoint. string sSystemVariablesCPBuffer; int ret = m_poConfig->GetSystemVSM()->GetCheckpointBuffer(sSystemVariablesCPBuffer); if (ret == 0) { oPaxosMsg.set_systemvariables(sSystemVariablesCPBuffer); } string sMasterVariablesCPBuffer; if (m_poConfig->GetMasterSM() != nullptr) { int ret = m_poConfig->GetMasterSM()->GetCheckpointBuffer(sMasterVariablesCPBuffer); if (ret == 0) { oPaxosMsg.set_mastervariables(sMasterVariablesCPBuffer); } } } SendMessage(iSendNodeID, oPaxosMsg); }
TEST(Proposer, OnAcceptReply_Reject) { ProposerBuilder ob; MockProposerBP & oProposerBP = ob.oMockBreakpoint.m_oMockProposerBP; ob.poProposer->m_oProposerState.m_llProposalID = 100; ob.poProposer->m_bIsAccepting = true; ob.poProposer->m_oProposerState.m_sValue = "abc"; PaxosMsg oPaxosMsg; oPaxosMsg.set_proposalid(100); //first call oPaxosMsg.set_rejectbypromiseid(101); oPaxosMsg.set_nodeid(2); ob.poProposer->OnAcceptReply(oPaxosMsg); EXPECT_TRUE(ob.poProposer->m_bWasRejectBySomeone == true); //second call oPaxosMsg.set_rejectbypromiseid(0); oPaxosMsg.set_nodeid(GetMyNode().GetNodeID()); ob.poProposer->OnAcceptReply(oPaxosMsg); //third call oPaxosMsg.set_rejectbypromiseid(102); oPaxosMsg.set_nodeid(3); EXPECT_CALL(oProposerBP, AcceptNotPass()).Times(1); ob.poProposer->OnAcceptReply(oPaxosMsg); EXPECT_TRUE(ob.poProposer->m_bCanSkipPrepare == false); EXPECT_TRUE(ob.poProposer->m_oProposerState.m_sValue == "abc"); }
void Learner :: OnComfirmAskForLearn(const PaxosMsg & oPaxosMsg) { BP->GetLearnerBP()->OnComfirmAskForLearn(); PLGHead("START Msg.InstanceID %lu Msg.from_nodeid %lu", oPaxosMsg.instanceid(), oPaxosMsg.nodeid()); if (!m_oLearnerSender.Comfirm(oPaxosMsg.instanceid(), oPaxosMsg.nodeid())) { BP->GetLearnerBP()->OnComfirmAskForLearnGetLockFail(); PLGErr("LearnerSender comfirm fail, maybe is lag msg"); return; } PLGImp("OK, success comfirm"); }
void Proposer :: Accept() { PLGHead("START ProposalID %lu ValueSize %zu ValueLen %zu", m_oProposerState.GetProposalID(), m_oProposerState.GetValue().size(), m_oProposerState.GetValue().size()); BP->GetProposerBP()->Accept(); m_oTimeStat.Point(); ExitPrepare(); m_bIsAccepting = true; PaxosMsg oPaxosMsg; oPaxosMsg.set_msgtype(MsgType_PaxosAccept); oPaxosMsg.set_instanceid(GetInstanceID()); oPaxosMsg.set_nodeid(m_poConfig->GetMyNodeID()); oPaxosMsg.set_proposalid(m_oProposerState.GetProposalID()); oPaxosMsg.set_value(m_oProposerState.GetValue()); oPaxosMsg.set_lastchecksum(GetLastChecksum()); m_oMsgCounter.StartNewRound(); AddAcceptTimer(); PLGHead("END"); BroadcastMessage(oPaxosMsg, BroadcastMessage_Type_RunSelf_Final); }
void Learner :: ComfirmAskForLearn(const nodeid_t iSendNodeID) { BP->GetLearnerBP()->ComfirmAskForLearn(); PLGHead("START"); PaxosMsg oPaxosMsg; oPaxosMsg.set_instanceid(GetInstanceID()); oPaxosMsg.set_nodeid(m_poConfig->GetMyNodeID()); oPaxosMsg.set_msgtype(MsgType_PaxosLearner_ComfirmAskforLearn); PLGHead("END InstanceID %lu MyNodeID %lu", GetInstanceID(), oPaxosMsg.nodeid()); SendMessage(iSendNodeID, oPaxosMsg); m_bIsIMLearning = true; }
TEST(Proposer, OnAcceptReply_Skip) { ProposerBuilder ob; MockProposerBP & oProposerBP = ob.oMockBreakpoint.m_oMockProposerBP; ob.poProposer->m_oProposerState.m_llProposalID = 100; PaxosMsg oPaxosMsg; //first call EXPECT_CALL(oProposerBP, OnAcceptReplyButNotAccepting()).Times(1); ob.poProposer->m_bIsAccepting = false; ob.poProposer->OnAcceptReply(oPaxosMsg); //second call EXPECT_CALL(oProposerBP, OnAcceptReplyNotSameProposalIDMsg()).Times(1); oPaxosMsg.set_proposalid(102); ob.poProposer->m_bIsAccepting = true; ob.poProposer->OnAcceptReply(oPaxosMsg); }
void Learner :: AskforCheckpoint(const nodeid_t iSendNodeID) { PLGHead("START"); int ret = m_poCheckpointMgr->PrepareForAskforCheckpoint(iSendNodeID); if (ret != 0) { return; } PaxosMsg oPaxosMsg; oPaxosMsg.set_instanceid(GetInstanceID()); oPaxosMsg.set_nodeid(m_poConfig->GetMyNodeID()); oPaxosMsg.set_msgtype(MsgType_PaxosLearner_AskforCheckpoint); PLGHead("END InstanceID %lu MyNodeID %lu", GetInstanceID(), oPaxosMsg.nodeid()); SendMessage(iSendNodeID, oPaxosMsg); }
void Learner :: SendLearnValue_Ack(const nodeid_t iSendNodeID) { PLGHead("START LastAck.Instanceid %lu Now.Instanceid %lu", m_llLastAckInstanceID, GetInstanceID()); if (GetInstanceID() < m_llLastAckInstanceID + SENDLEARNVALUE_ACK_LEAD) { PLGImp("No need to ack"); return; } BP->GetLearnerBP()->SendLearnValue_Ack(); m_llLastAckInstanceID = GetInstanceID(); PaxosMsg oPaxosMsg; oPaxosMsg.set_instanceid(GetInstanceID()); oPaxosMsg.set_msgtype(MsgType_PaxosLearner_SendLearnValue_Ack); oPaxosMsg.set_nodeid(m_poConfig->GetMyNodeID()); SendMessage(iSendNodeID, oPaxosMsg); PLGHead("End. ok"); }
int Base :: PackMsg(const PaxosMsg & oPaxosMsg, std::string & sBuffer) { std::string sBodyBuffer; bool bSucc = oPaxosMsg.SerializeToString(&sBodyBuffer); if (!bSucc) { PLGErr("PaxosMsg.SerializeToString fail, skip this msg"); return -1; } int iCmd = MsgCmd_PaxosMsg; PackBaseMsg(sBodyBuffer, iCmd, sBuffer); return 0; }
void Learner :: OnProposerSendSuccess(const PaxosMsg & oPaxosMsg) { BP->GetLearnerBP()->OnProposerSendSuccess(); PLGHead("START Msg.InstanceID %lu Now.InstanceID %lu Msg.ProposalID %lu State.AcceptedID %lu " "State.AcceptedNodeID %lu, Msg.from_nodeid %lu", oPaxosMsg.instanceid(), GetInstanceID(), oPaxosMsg.proposalid(), m_poAcceptor->GetAcceptorState()->GetAcceptedBallot().m_llProposalID, m_poAcceptor->GetAcceptorState()->GetAcceptedBallot().m_llNodeID, oPaxosMsg.nodeid()); if (oPaxosMsg.instanceid() != GetInstanceID()) { //Instance id not same, that means not in the same instance, ignord. PLGDebug("InstanceID not same, skip msg"); return; } if (m_poAcceptor->GetAcceptorState()->GetAcceptedBallot().isnull()) { //Not accept any yet. BP->GetLearnerBP()->OnProposerSendSuccessNotAcceptYet(); PLGDebug("I haven't accpeted any proposal"); return; } BallotNumber oBallot(oPaxosMsg.proposalid(), oPaxosMsg.nodeid()); if (m_poAcceptor->GetAcceptorState()->GetAcceptedBallot() != oBallot) { //Proposalid not same, this accept value maybe not chosen value. PLGDebug("ProposalBallot not same to AcceptedBallot"); BP->GetLearnerBP()->OnProposerSendSuccessBallotNotSame(); return; } //learn value. m_oLearnerState.LearnValueWithoutWrite( oPaxosMsg.instanceid(), m_poAcceptor->GetAcceptorState()->GetAcceptedValue(), m_poAcceptor->GetAcceptorState()->GetChecksum()); BP->GetLearnerBP()->OnProposerSendSuccessSuccessLearn(); PLGHead("END Learn value OK, value %zu", m_poAcceptor->GetAcceptorState()->GetAcceptedValue().size()); TransmitToFollower(); }
void Learner :: TransmitToFollower() { if (m_poConfig->GetMyFollowerCount() == 0) { return; } PaxosMsg oPaxosMsg; oPaxosMsg.set_msgtype(MsgType_PaxosLearner_SendLearnValue); oPaxosMsg.set_instanceid(GetInstanceID()); oPaxosMsg.set_nodeid(m_poConfig->GetMyNodeID()); oPaxosMsg.set_proposalnodeid(m_poAcceptor->GetAcceptorState()->GetAcceptedBallot().m_llNodeID); oPaxosMsg.set_proposalid(m_poAcceptor->GetAcceptorState()->GetAcceptedBallot().m_llProposalID); oPaxosMsg.set_value(m_poAcceptor->GetAcceptorState()->GetAcceptedValue()); oPaxosMsg.set_lastchecksum(GetLastChecksum()); BroadcastMessageToFollower(oPaxosMsg, Message_SendType_TCP); PLGHead("ok"); }
void Learner :: ProposerSendSuccess( const uint64_t llLearnInstanceID, const uint64_t llProposalID) { BP->GetLearnerBP()->ProposerSendSuccess(); PaxosMsg oPaxosMsg; oPaxosMsg.set_msgtype(MsgType_PaxosLearner_ProposerSendSuccess); oPaxosMsg.set_instanceid(llLearnInstanceID); oPaxosMsg.set_nodeid(m_poConfig->GetMyNodeID()); oPaxosMsg.set_proposalid(llProposalID); oPaxosMsg.set_lastchecksum(GetLastChecksum()); //run self first BroadcastMessage(oPaxosMsg, BroadcastMessage_Type_RunSelf_First); }
void Learner :: AskforLearn() { BP->GetLearnerBP()->AskforLearn(); PLGHead("START"); PaxosMsg oPaxosMsg; oPaxosMsg.set_instanceid(GetInstanceID()); oPaxosMsg.set_nodeid(m_poConfig->GetMyNodeID()); oPaxosMsg.set_msgtype(MsgType_PaxosLearner_AskforLearn); if (m_poConfig->IsIMFollower()) { //this is not proposal nodeid, just use this val to bring followto nodeid info. oPaxosMsg.set_proposalnodeid(m_poConfig->GetFollowToNodeID()); } PLGHead("END InstanceID %lu MyNodeID %lu", oPaxosMsg.instanceid(), oPaxosMsg.nodeid()); BroadcastMessage(oPaxosMsg, BroadcastMessage_Type_RunSelf_None, Message_SendType_TCP); BroadcastMessageToTempNode(oPaxosMsg, Message_SendType_UDP); }
TEST(Proposer, OnPrepareReply_Pass) { ProposerBuilder ob; MockProposerBP & oProposerBP = ob.oMockBreakpoint.m_oMockProposerBP; ob.poProposer->m_oProposerState.m_llProposalID = 100; ob.poProposer->m_bIsPreparing = true; ob.poProposer->m_oProposerState.m_sValue = "abc"; PaxosMsg oPaxosMsg; oPaxosMsg.set_proposalid(100); //first call oPaxosMsg.set_preacceptid(95); oPaxosMsg.set_preacceptnodeid(GetMyNode().GetNodeID()); oPaxosMsg.set_nodeid(GetMyNode().GetNodeID()); oPaxosMsg.set_value("hello paxos"); ob.poProposer->OnPrepareReply(oPaxosMsg); EXPECT_TRUE(ob.poProposer->m_oProposerState.m_sValue == "hello paxos"); //second call oPaxosMsg.set_rejectbypromiseid(101); oPaxosMsg.set_nodeid(2); ob.poProposer->OnPrepareReply(oPaxosMsg); //third call oPaxosMsg.set_rejectbypromiseid(0); oPaxosMsg.set_preacceptid(98); oPaxosMsg.set_preacceptnodeid(3); oPaxosMsg.set_nodeid(3); oPaxosMsg.set_value("hello world"); EXPECT_CALL(oProposerBP, PreparePass(_)).Times(1); ob.poProposer->OnPrepareReply(oPaxosMsg); EXPECT_TRUE(ob.poProposer->m_bCanSkipPrepare == true); EXPECT_TRUE(ob.poProposer->m_bIsAccepting == true); EXPECT_TRUE(ob.poProposer->m_oProposerState.m_sValue == "hello world"); }
void Proposer :: OnPrepareReply(const PaxosMsg & oPaxosMsg) { PLGHead("START Msg.ProposalID %lu State.ProposalID %lu Msg.from_nodeid %lu RejectByPromiseID %lu", oPaxosMsg.proposalid(), m_oProposerState.GetProposalID(), oPaxosMsg.nodeid(), oPaxosMsg.rejectbypromiseid()); BP->GetProposerBP()->OnPrepareReply(); if (!m_bIsPreparing) { BP->GetProposerBP()->OnPrepareReplyButNotPreparing(); //PLGErr("Not preparing, skip this msg"); return; } if (oPaxosMsg.proposalid() != m_oProposerState.GetProposalID()) { BP->GetProposerBP()->OnPrepareReplyNotSameProposalIDMsg(); //PLGErr("ProposalID not same, skip this msg"); return; } m_oMsgCounter.AddReceive(oPaxosMsg.nodeid()); if (oPaxosMsg.rejectbypromiseid() == 0) { BallotNumber oBallot(oPaxosMsg.preacceptid(), oPaxosMsg.preacceptnodeid()); PLGDebug("[Promise] PreAcceptedID %lu PreAcceptedNodeID %lu ValueSize %zu", oPaxosMsg.preacceptid(), oPaxosMsg.preacceptnodeid(), oPaxosMsg.value().size()); m_oMsgCounter.AddPromiseOrAccept(oPaxosMsg.nodeid()); m_oProposerState.AddPreAcceptValue(oBallot, oPaxosMsg.value()); } else { PLGDebug("[Reject] RejectByPromiseID %lu", oPaxosMsg.rejectbypromiseid()); m_oMsgCounter.AddReject(oPaxosMsg.nodeid()); m_bWasRejectBySomeone = true; m_oProposerState.SetOtherProposalID(oPaxosMsg.rejectbypromiseid()); } if (m_oMsgCounter.IsPassedOnThisRound()) { int iUseTimeMs = m_oTimeStat.Point(); BP->GetProposerBP()->PreparePass(iUseTimeMs); PLGImp("[Pass] start accept, usetime %dms", iUseTimeMs); m_bCanSkipPrepare = true; Accept(); } else if (m_oMsgCounter.IsRejectedOnThisRound() || m_oMsgCounter.IsAllReceiveOnThisRound()) { BP->GetProposerBP()->PrepareNotPass(); PLGImp("[Not Pass] wait 30ms and restart prepare"); AddPrepareTimer(OtherUtils::FastRand() % 30 + 10); } PLGHead("END"); }
void Learner :: OnAskforLearn(const PaxosMsg & oPaxosMsg) { BP->GetLearnerBP()->OnAskforLearn(); PLGHead("START Msg.InstanceID %lu Now.InstanceID %lu Msg.from_nodeid %lu MinChosenInstanceID %lu", oPaxosMsg.instanceid(), GetInstanceID(), oPaxosMsg.nodeid(), m_poCheckpointMgr->GetMinChosenInstanceID()); SetSeenInstanceID(oPaxosMsg.instanceid(), oPaxosMsg.nodeid()); if (oPaxosMsg.proposalnodeid() == m_poConfig->GetMyNodeID()) { //Found a node follow me. PLImp("Found a node %lu follow me.", oPaxosMsg.nodeid()); m_poConfig->AddFollowerNode(oPaxosMsg.nodeid()); } if (oPaxosMsg.instanceid() >= GetInstanceID()) { return; } if (oPaxosMsg.instanceid() >= m_poCheckpointMgr->GetMinChosenInstanceID()) { if (!m_oLearnerSender.Prepare(oPaxosMsg.instanceid(), oPaxosMsg.nodeid())) { BP->GetLearnerBP()->OnAskforLearnGetLockFail(); PLGErr("LearnerSender working for others."); if (oPaxosMsg.instanceid() == (GetInstanceID() - 1)) { PLGImp("InstanceID only difference one, just send this value to other."); //send one value AcceptorStateData oState; int ret = m_oPaxosLog.ReadState(m_poConfig->GetMyGroupIdx(), oPaxosMsg.instanceid(), oState); if (ret == 0) { BallotNumber oBallot(oState.acceptedid(), oState.acceptednodeid()); SendLearnValue(oPaxosMsg.nodeid(), oPaxosMsg.instanceid(), oBallot, oState.acceptedvalue(), 0); } } return; } } SendNowInstanceID(oPaxosMsg.instanceid(), oPaxosMsg.nodeid()); }
void Learner :: OnSendNowInstanceID(const PaxosMsg & oPaxosMsg) { BP->GetLearnerBP()->OnSendNowInstanceID(); PLGHead("START Msg.InstanceID %lu Now.InstanceID %lu Msg.from_nodeid %lu Msg.MaxInstanceID %lu systemvariables_size %zu mastervariables_size %zu", oPaxosMsg.instanceid(), GetInstanceID(), oPaxosMsg.nodeid(), oPaxosMsg.nowinstanceid(), oPaxosMsg.systemvariables().size(), oPaxosMsg.mastervariables().size()); SetSeenInstanceID(oPaxosMsg.nowinstanceid(), oPaxosMsg.nodeid()); bool bSystemVariablesChange = false; int ret = m_poConfig->GetSystemVSM()->UpdateByCheckpoint(oPaxosMsg.systemvariables(), bSystemVariablesChange); if (ret == 0 && bSystemVariablesChange) { PLGHead("SystemVariables changed!, all thing need to reflesh, so skip this msg"); return; } bool bMasterVariablesChange = false; if (m_poConfig->GetMasterSM() != nullptr) { ret = m_poConfig->GetMasterSM()->UpdateByCheckpoint(oPaxosMsg.mastervariables(), bMasterVariablesChange); if (ret == 0 && bMasterVariablesChange) { PLGHead("MasterVariables changed!"); } } if (oPaxosMsg.instanceid() != GetInstanceID()) { PLGErr("Lag msg, skip"); return; } if (oPaxosMsg.nowinstanceid() <= GetInstanceID()) { PLGErr("Lag msg, skip"); return; } if (oPaxosMsg.minchoseninstanceid() > GetInstanceID()) { BP->GetCheckpointBP()->NeedAskforCheckpoint(); PLGHead("my instanceid %lu small than other's minchoseninstanceid %lu, other nodeid %lu", GetInstanceID(), oPaxosMsg.minchoseninstanceid(), oPaxosMsg.nodeid()); AskforCheckpoint(oPaxosMsg.nodeid()); } else if (!m_bIsIMLearning) { ComfirmAskForLearn(oPaxosMsg.nodeid()); } }
void Learner :: OnSendLearnValue(const PaxosMsg & oPaxosMsg) { BP->GetLearnerBP()->OnSendLearnValue(); PLGHead("START Msg.InstanceID %lu Now.InstanceID %lu Msg.ballot_proposalid %lu Msg.ballot_nodeid %lu Msg.ValueSize %zu", oPaxosMsg.instanceid(), GetInstanceID(), oPaxosMsg.proposalid(), oPaxosMsg.nodeid(), oPaxosMsg.value().size()); if (oPaxosMsg.instanceid() > GetInstanceID()) { PLGDebug("[Latest Msg] i can't learn"); return; } else if (oPaxosMsg.instanceid() < GetInstanceID()) { PLGDebug("[Lag Msg] no need to learn"); return; } //learn value BallotNumber oBallot(oPaxosMsg.proposalid(), oPaxosMsg.proposalnodeid()); int ret = m_oLearnerState.LearnValue(oPaxosMsg.instanceid(), oBallot, oPaxosMsg.value(), GetLastChecksum()); if (ret != 0) { PLGErr("LearnState.LearnValue fail, ret %d", ret); return; } PLGHead("END LearnValue OK, proposalid %lu proposalid_nodeid %lu valueLen %zu", oPaxosMsg.proposalid(), oPaxosMsg.nodeid(), oPaxosMsg.value().size()); if (oPaxosMsg.flag() == PaxosMsgFlagType_SendLearnValue_NeedAck) { //every time' when receive valid need ack learn value, reset noop timeout. Reset_AskforLearn_Noop(); SendLearnValue_Ack(oPaxosMsg.nodeid()); } }