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"); }
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 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); }
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 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); }
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 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 :: 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; }
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 :: 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 :: 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"); }
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); }