Example #1
0
void ReplicatedLog::OnCatchupComplete(uint64_t paxosID_)
{
    paxosID = paxosID_;

    acceptor.OnCatchupComplete(); // commits

    NewPaxosRound();
}
Example #2
0
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!
}
Example #3
0
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();
}