void ReplicatedLog::OnCatchupComplete(uint64_t paxosID_) { paxosID = paxosID_; acceptor.OnCatchupComplete(); // commits NewPaxosRound(); }
void ReplicatedLog::ProcessLearnChosen(uint64_t nodeID, uint64_t runID) { bool ownAppend; Buffer learnedValue; learnedValue.Write(acceptor.state.acceptedValue); #ifdef RLOG_DEBUG_MESSAGES Log_Debug("Round completed for paxosID = %U", paxosID); Log_Trace("+++ Value for paxosID = %U: %B +++", paxosID, &learnedValue); if (context->GetHighestPaxosID() > 0 && paxosID < context->GetHighestPaxosID() && !IsLeaseOwner()) { Log_Debug("Paxos-based catchup, highest seen paxosID is %U, currently at %U", context->GetHighestPaxosID(), paxosID); if (paxosID == (context->GetHighestPaxosID() - 1)) Log_Debug("Paxos-based catchup complete..."); } #endif if (context->GetHighestPaxosID() > 0 && paxosID < (context->GetHighestPaxosID() - 1)) context->GetDatabase()->Commit(); NewPaxosRound(); // increments paxosID, clears proposer, acceptor if (paxosID <= context->GetHighestPaxosID()) RequestChosen(nodeID); ownAppend = proposer.state.multi; if (nodeID == MY_NODEID && runID == REPLICATION_CONFIG->GetRunID() && context->IsLeaseOwner()) { if (!proposer.state.multi) { proposer.state.multi = true; context->OnIsLeader(); } proposer.state.multi = true; Log_Trace("Multi paxos enabled"); } else { proposer.state.multi = false; Log_Trace("Multi paxos disabled"); } if (BUFCMP(&learnedValue, &dummy)) OnAppendComplete(); else context->OnAppend(paxosID - 1, learnedValue, ownAppend); // new convention: QuorumContext::OnAppend() must call // ReplicatedLog::OnAppendComplete() // when it's done! }
void ReplicatedLog::OnAppendComplete() { waitingOnAppend = false; NewPaxosRound(); // increments paxosID, clears proposer, acceptor if (context->IsLeaseKnown() && paxosID <= context->GetHighestPaxosID()) RequestChosen(context->GetLeaseOwner()); if (paxosID < context->GetHighestPaxosID()) context->GetDatabase()->Commit(); if (!context->UseCommitChaining()) { acceptor.WriteState(); context->GetDatabase()->Commit(); } context->OnMessageProcessed(); TryAppendNextValue(); }