Пример #1
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!
}
Пример #2
0
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()
    }
}