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::ProcessLearnChosen(uint64_t nodeID, uint64_t runID) { bool ownAppend; uint64_t now; Buffer learnedValue; learnedValue.Write(acceptor.state.acceptedValue); if (lastLearnChosenTime > 0) { now = EventLoop::Now(); if (now > lastLearnChosenTime) { // byte / msec = kbyte / sec replicationThroughput = learnedValue.GetLength() / (now - lastLearnChosenTime); // convert to byte / sec replicationThroughput *= 1000; } } lastLearnChosenTime = EventLoop::Now(); #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()) { 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(); waitingOnAppend = true; ownAppend = proposer.state.multi; if (nodeID == MY_NODEID && runID == REPLICATION_CONFIG->GetRunID() && context->IsLeaseOwner()) { proposer.state.multi = true; if (!ownAppend) context->OnIsLeader(); Log_Trace("Multi paxos enabled"); } else { proposer.state.multi = false; Log_Trace("Multi paxos disabled"); } ownAppend &= proposer.state.multi; if (BUFCMP(&learnedValue, &dummy)) OnAppendComplete(); else { context->OnAppend(paxosID, learnedValue, ownAppend); // QuorumContext::OnAppend() must call ReplicatedLog::OnAppendComplete() } }