Begin fixing consensus without having the full consensus LCL.

This commit is contained in:
JoelKatz
2012-06-21 17:37:27 -07:00
parent 69bbe599a2
commit dda06d989d
4 changed files with 31 additions and 19 deletions

View File

@@ -308,13 +308,8 @@ void NetworkOPs::checkState(const boost::system::error_code& result)
// FIXME: Don't check unless last closed ledger is at least some seconds old
// If full or tracking, check only at wobble time!
if (checkLastClosedLedger(peerList))
{
// FIXME: if connected, go to ledger close process if it's time, marking that we have
// the wrong LCL
setStateTimer(3);
return;
}
uint256 networkClosed;
bool ledgerChange = checkLastClosedLedger(peerList, networkClosed);
// WRITEME: Unless we are in omFULL and in the process of doing a consensus,
// we must count how many nodes share our LCL, how many nodes disagree with our LCL,
@@ -322,13 +317,13 @@ void NetworkOPs::checkState(const boost::system::error_code& result)
// there shouldn't be a newer LCL. We need this information to do the next three
// tests.
if (mMode == omCONNECTED)
if ((mMode == omCONNECTED) && !ledgerChange)
{ // count number of peers that agree with us and UNL nodes whose validations we have for LCL
// if the ledger is good enough, go to omTRACKING - TODO
setMode(omTRACKING);
}
if (mMode == omTRACKING)
if ((mMode == omTRACKING) && !ledgerChange)
{
// check if the ledger is good enough to go to omFULL
// Note: Do not go to omFULL if we don't have the previous ledger
@@ -348,13 +343,13 @@ void NetworkOPs::checkState(const boost::system::error_code& result)
int secondsToClose = theApp->getMasterLedger().getCurrentLedger()->getCloseTimeNC() -
theApp->getOPs().getNetworkTimeNC();
if ((!mConsensus) && (secondsToClose < LEDGER_WOBBLE_TIME)) // pre close wobble
beginConsensus(theApp->getMasterLedger().getCurrentLedger());
beginConsensus(networkClosed, theApp->getMasterLedger().getCurrentLedger());
if (mConsensus)
setStateTimer(mConsensus->timerEntry());
else setStateTimer(4);
}
bool NetworkOPs::checkLastClosedLedger(const std::vector<Peer::pointer>& peerList)
bool NetworkOPs::checkLastClosedLedger(const std::vector<Peer::pointer>& peerList, uint256& networkClosed)
{ // Returns true if there's an *abnormal* ledger issue, normal changing in TRACKING mode should return false
// Do we have sufficient validations for our last closed ledger? Or do sufficient nodes
// agree? And do we have no better ledger available?
@@ -372,8 +367,8 @@ bool NetworkOPs::checkLastClosedLedger(const std::vector<Peer::pointer>& peerLis
ledgers[it->first].trustedValidations += it->second;
}
Ledger::pointer currentClosed = mLedgerMaster->getClosedLedger();
uint256 closedLedger = currentClosed->getHash();
Ledger::pointer ourClosed = mLedgerMaster->getClosedLedger();
uint256 closedLedger = ourClosed->getHash();
ValidationCount& ourVC = ledgers[closedLedger];
++ourVC.nodesUsing;
ourVC.highNode = theApp->getWallet().getNodePublic();
@@ -414,14 +409,16 @@ bool NetworkOPs::checkLastClosedLedger(const std::vector<Peer::pointer>& peerLis
switchLedgers = true;
}
}
networkClosed = closedLedger;
if (!switchLedgers)
return false;
Log(lsWARNING) << "We are not running on the consensus ledger";
Log(lsINFO) << "Our LCL " << currentClosed->getHash().GetHex();
Log(lsINFO) << "Our LCL " << ourClosed->getHash().GetHex();
Log(lsINFO) << "Net LCL " << closedLedger.GetHex();
if ((mMode == omTRACKING) || (mMode == omFULL)) setMode(omCONNECTED);
Ledger::pointer consensus = mLedgerMaster->getLedgerByHash(closedLedger);
if (!consensus)
{
@@ -490,7 +487,7 @@ void NetworkOPs::switchLastClosedLedger(Ledger::pointer newLedger)
theApp->getConnectionPool().relayMessage(NULL, packet);
}
int NetworkOPs::beginConsensus(Ledger::pointer closingLedger)
int NetworkOPs::beginConsensus(const uint256& networkClosed, Ledger::pointer closingLedger)
{
Log(lsINFO) << "Ledger close time for ledger " << closingLedger->getLedgerSeq() ;
Log(lsINFO) << " LCL is " << closingLedger->getParentHash().GetHex();
@@ -509,7 +506,7 @@ int NetworkOPs::beginConsensus(Ledger::pointer closingLedger)
if (!!mConsensus) mConsensus->abort();
prevLedger->setImmutable();
mConsensus = boost::make_shared<LedgerConsensus>(
prevLedger->getHash(), // FIXME: Only do this if the previous ledger is the consensus previous ledger
networkClosed,
prevLedger, theApp->getMasterLedger().getCurrentLedger()->getCloseTimeNC());
Log(lsDEBUG) << "Pre-close time, initiating consensus engine";