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