From 187130fe31067e881334df5f551526217b3bc0c0 Mon Sep 17 00:00:00 2001 From: JoelKatz Date: Tue, 10 Jul 2012 19:24:52 -0700 Subject: [PATCH] Properly sequence from one converge window to the next. --- src/LedgerConsensus.cpp | 11 ++++++++++- src/LedgerConsensus.h | 2 +- src/NetworkOPs.cpp | 11 ++++++++++- src/NetworkOPs.h | 11 +++++++++-- 4 files changed, 30 insertions(+), 5 deletions(-) diff --git a/src/LedgerConsensus.cpp b/src/LedgerConsensus.cpp index 0ba38d0b2f..4c037793f0 100644 --- a/src/LedgerConsensus.cpp +++ b/src/LedgerConsensus.cpp @@ -191,11 +191,13 @@ bool LCTransaction::updatePosition(int percentTime, bool proposing) LedgerConsensus::LedgerConsensus(const uint256& prevLCLHash, Ledger::pointer previousLedger, uint64 closeTime) : mState(lcsPRE_CLOSE), mCloseTime(closeTime), mPrevLedgerHash(prevLCLHash), mPreviousLedger(previousLedger), - mCurrentSeconds(0), mClosePercent(0), mPreviousProposers(0), mPreviousSeconds(LEDGER_MAX_INTERVAL) + mCurrentSeconds(0), mClosePercent(0) { mValSeed = theConfig.VALIDATION_SEED; Log(lsDEBUG) << "Creating consensus object"; Log(lsTRACE) << "LCL:" << previousLedger->getHash().GetHex() <<", ct=" << closeTime; + mPreviousProposers = theApp->getOPs().getPreviousProposers(); + mPreviousSeconds = theApp->getOPs().getPreviousSeconds(); if (previousLedger->getHash() != prevLCLHash) mHaveCorrectLCL = mProposing = mValidating = false; else if (mValSeed.isValid()) @@ -386,6 +388,12 @@ int LedgerConsensus::stateEstablish() int LedgerConsensus::stateFinished() { // we are processing the finished ledger // logic of calculating next ledger advances us out of this state + + // CHECKME: Should we count proposers that didn't converge to our consensus set? + int convergeTime = (boost::posix_time::second_clock::universal_time() - mConsensusStartTime).seconds(); + if (convergeTime <= 0) convergeTime = 1; + theApp->getOPs().newLCL(mPeerPositions.size(), convergeTime, mNewLedgerHash); + return 1; } @@ -793,6 +801,7 @@ void LedgerConsensus::accept(SHAMap::pointer set) applyTransactions(theApp->getMasterLedger().getCurrentLedger()->peekTransactionMap(), newOL, failedTransactions, false); theApp->getMasterLedger().pushLedger(newLCL, newOL); + mNewLedgerHash = newLCL->getHash(); mState = lcsACCEPTED; sl.unlock(); diff --git a/src/LedgerConsensus.h b/src/LedgerConsensus.h index c5072d806c..8909a5c53b 100644 --- a/src/LedgerConsensus.h +++ b/src/LedgerConsensus.h @@ -79,7 +79,7 @@ class LedgerConsensus : public boost::enable_shared_from_this protected: LCState mState; uint64 mCloseTime; // The wall time this ledger closed - uint256 mPrevLedgerHash; + uint256 mPrevLedgerHash, mNewLedgerHash; Ledger::pointer mPreviousLedger; LedgerProposal::pointer mOurPosition; NewcoinAddress mValSeed; diff --git a/src/NetworkOPs.cpp b/src/NetworkOPs.cpp index 228d9bfcfa..90c7858fe5 100644 --- a/src/NetworkOPs.cpp +++ b/src/NetworkOPs.cpp @@ -24,7 +24,8 @@ // there's a functional network. NetworkOPs::NetworkOPs(boost::asio::io_service& io_service, LedgerMaster* pLedgerMaster) : - mMode(omDISCONNECTED),mNetTimer(io_service), mLedgerMaster(pLedgerMaster) + mMode(omDISCONNECTED),mNetTimer(io_service), mLedgerMaster(pLedgerMaster), + mLastCloseProposers(0), mLastCloseConvergeTime(LEDGER_IDLE_INTERVAL) { } @@ -960,6 +961,14 @@ void NetworkOPs::unsubAccountTransaction(InfoSub* ispListener, const boost::unor } } +void NetworkOPs::newLCL(int proposers, int convergeTime, const uint256& ledgerHash) +{ + mLastCloseProposers = proposers; + mLastCloseConvergeTime = convergeTime; + mLastCloseHash = ledgerHash; +} + + #if 0 void NetworkOPs::subAccountChanges(InfoSub* ispListener, const uint256 uLedgerHash) { diff --git a/src/NetworkOPs.h b/src/NetworkOPs.h index 74e8a2469d..55f030a9a8 100644 --- a/src/NetworkOPs.h +++ b/src/NetworkOPs.h @@ -54,9 +54,13 @@ protected: void setMode(OperatingMode); - typedef boost::unordered_map > subInfoMapType; + typedef boost::unordered_map > subInfoMapType; typedef boost::unordered_map >::value_type subInfoMapValue; - typedef boost::unordered_map >::iterator subInfoMapIterator; + typedef boost::unordered_map >::iterator subInfoMapIterator; + + // last ledger close + int mLastCloseProposers, mLastCloseConvergeTime; + uint256 mLastCloseHash; // XXX Split into more locks. boost::interprocess::interprocess_upgradable_mutex mMonitorLock; @@ -163,6 +167,9 @@ public: int beginConsensus(const uint256& networkClosed, Ledger::pointer closingLedger); void endConsensus(); void setStateTimer(); + void newLCL(int proposers, int convergeTime, const uint256& ledgerHash); + int getPreviousProposers() { return mLastCloseProposers; } + int getPreviousSeconds() { return mLastCloseConvergeTime; } Json::Value getServerInfo(); // client information retrieval functions