Fix a half-second race window during which a proposal could cause us to

enter the consensus process with the wrong last closed ledger.
This commit is contained in:
JoelKatz
2013-02-26 14:01:46 -08:00
parent 33dafca31a
commit bd3d28c2fa
2 changed files with 21 additions and 13 deletions

View File

@@ -630,11 +630,15 @@ void NetworkOPs::checkState(const boost::system::error_code& result)
mConsensus->timerEntry();
return;
}
tryStartConsensus();
if (mConsensus)
mConsensus->timerEntry();
}
// FIXME: Don't check unless last closed ledger is at least some seconds old
// If full or tracking, check only at wobble time!
void NetworkOPs::tryStartConsensus()
{
uint256 networkClosed;
bool ledgerChange = checkLastClosedLedger(peerList, networkClosed);
bool ledgerChange = checkLastClosedLedger(theApp->getConnectionPool().getPeerVector(), networkClosed);
if(networkClosed.isZero())
return;
@@ -668,8 +672,6 @@ void NetworkOPs::checkState(const boost::system::error_code& result)
if ((!mConsensus) && (mMode != omDISCONNECTED))
beginConsensus(networkClosed, mLedgerMaster->getCurrentLedger());
if (mConsensus)
mConsensus->timerEntry();
}
bool NetworkOPs::checkLastClosedLedger(const std::vector<Peer::pointer>& peerList, uint256& networkClosed)
@@ -877,16 +879,21 @@ bool NetworkOPs::haveConsensusObject()
{
if (mConsensus)
return true;
if (mMode != omFULL)
return false;
uint256 networkClosed;
std::vector<Peer::pointer> peerList = theApp->getConnectionPool().getPeerVector();
bool ledgerChange = checkLastClosedLedger(peerList, networkClosed);
if (!ledgerChange)
if ((mMode == omFULL) || (mMode == omTRACKING))
{
cLog(lsINFO) << "Beginning consensus due to peer action";
beginConsensus(networkClosed, mLedgerMaster->getCurrentLedger());
tryStartConsensus();
}
else
{ // we need to get into the consensus process
uint256 networkClosed;
std::vector<Peer::pointer> peerList = theApp->getConnectionPool().getPeerVector();
bool ledgerChange = checkLastClosedLedger(peerList, networkClosed);
if (!ledgerChange)
{
cLog(lsINFO) << "Beginning consensus due to peer action";
beginConsensus(networkClosed, mLedgerMaster->getCurrentLedger());
}
}
return mConsensus;
}

View File

@@ -258,6 +258,7 @@ public:
void switchLastClosedLedger(Ledger::pointer newLedger, bool duringConsensus); // Used for the "jump" case
bool checkLastClosedLedger(const std::vector<Peer::pointer>&, uint256& networkClosed);
int beginConsensus(const uint256& networkClosed, Ledger::ref closingLedger);
void tryStartConsensus();
void endConsensus(bool correctLCL);
void setStandAlone() { setMode(omFULL); }
void setStateTimer();