From 8afbc33706841ac3d6a05c9e4f477babad028100 Mon Sep 17 00:00:00 2001 From: JoelKatz Date: Mon, 14 Jan 2013 02:12:30 -0800 Subject: [PATCH] Some LedgerAcquire improvements. --- src/cpp/ripple/LedgerAcquire.cpp | 74 +++++++++++++++++++++++++++++--- src/cpp/ripple/LedgerAcquire.h | 6 ++- 2 files changed, 72 insertions(+), 8 deletions(-) diff --git a/src/cpp/ripple/LedgerAcquire.cpp b/src/cpp/ripple/LedgerAcquire.cpp index 7af4122b2a..b54cf0dfbc 100644 --- a/src/cpp/ripple/LedgerAcquire.cpp +++ b/src/cpp/ripple/LedgerAcquire.cpp @@ -18,7 +18,7 @@ DECLARE_INSTANCE(LedgerAcquire); #define TRUST_NETWORK PeerSet::PeerSet(const uint256& hash, int interval) : mHash(hash), mTimerInterval(interval), mTimeouts(0), - mComplete(false), mFailed(false), mProgress(true), mTimer(theApp->getIOService()) + mComplete(false), mFailed(false), mProgress(true), mAggressive(true), mTimer(theApp->getIOService()) { mLastAction = time(NULL); assert((mTimerInterval > 10) && (mTimerInterval < 30000)); @@ -94,9 +94,18 @@ bool LedgerAcquire::tryLocal() { // return value: true = no more work to do HashedObject::pointer node = theApp->getHashedObjectStore().retrieve(mHash); if (!node) - return false; - - mLedger = boost::make_shared(strCopy(node->getData()), true); + { + mLedger = theApp->getLedgerMaster().getLedgerByHash(mHash); + if (!mLedger) + { + cLog(lsDEBUG) << "root ledger node not local"; + return false; + } + } + else + { + mLedger = boost::make_shared(strCopy(node->getData()), true); + } if (mLedger->getHash() != mHash) { // We know for a fact the ledger can never be acquired cLog(lsWARNING) << mHash << " cannot be a ledger"; @@ -106,15 +115,22 @@ bool LedgerAcquire::tryLocal() mHaveBase = true; if (!mLedger->getTransHash()) + { + cLog(lsDEBUG) << "No TXNs to fetch"; mHaveTransactions = true; + } else { try { mLedger->peekTransactionMap()->fetchRoot(mLedger->getTransHash()); + cLog(lsDEBUG) << "Got root txn map locally"; std::vector h = mLedger->peekTransactionMap()->getNeededHashes(1); if (h.empty()) + { + cLog(lsDEBUG) << "Had full txn map locally"; mHaveTransactions = true; + } } catch (SHAMapMissingNode&) { @@ -128,9 +144,13 @@ bool LedgerAcquire::tryLocal() try { mLedger->peekAccountStateMap()->fetchRoot(mLedger->getAccountHash()); + cLog(lsDEBUG) << "Got root AS map locally"; std::vector h = mLedger->peekAccountStateMap()->getNeededHashes(1); if (h.empty()) + { + cLog(lsDEBUG) << "Had full AS map locally"; mHaveState = true; + } } catch (SHAMapMissingNode&) { @@ -138,7 +158,10 @@ bool LedgerAcquire::tryLocal() } if (mHaveTransactions && mHaveState) + { + cLog(lsDEBUG) << "Had everything locally"; mComplete = true; + } return mComplete; } @@ -158,6 +181,7 @@ void LedgerAcquire::onTimer(bool progress) if (!progress) { + mAggressive = true; cLog(lsDEBUG) << "No progress for ledger " << mHash; if (!getPeerCount()) addPeers(); @@ -328,6 +352,7 @@ void LedgerAcquire::trigger(Peer::ref peer) mHaveBase = true; mHaveTransactions = true; mHaveState = true; + mComplete = true; } } } @@ -374,7 +399,8 @@ void LedgerAcquire::trigger(Peer::ref peer) } else { - filterNodes(nodeIDs, nodeHashes, mRecentTXNodes, 128, !isProgress()); + if (!mAggressive) + filterNodes(nodeIDs, nodeHashes, mRecentTXNodes, 128, !isProgress()); if (!nodeIDs.empty()) { tmGL.set_itype(ripple::liTX_NODE); @@ -421,7 +447,8 @@ void LedgerAcquire::trigger(Peer::ref peer) } else { - filterNodes(nodeIDs, nodeHashes, mRecentASNodes, 128, !isProgress()); + if (!mAggressive) + filterNodes(nodeIDs, nodeHashes, mRecentASNodes, 128, !isProgress()); if (!nodeIDs.empty()) { tmGL.set_itype(ripple::liAS_NODE); @@ -693,6 +720,8 @@ LedgerAcquire::pointer LedgerAcquireMaster::findCreate(const uint256& hash) ptr->addPeers(); ptr->setTimer(); // Cannot call in constructor } + else + cLog(lsINFO) << "LedgerAcquireMaster acquiring ledger we already have"; return ptr; } @@ -732,6 +761,39 @@ std::vector LedgerAcquire::getNeededHashes() return ret; } +Json::Value LedgerAcquire::getJson(int) +{ + Json::Value ret(Json::objectValue); + ret["hash"] = mHash.GetHex(); + if (mComplete) + ret["complete"] = true; + if (mFailed) + ret["failed"] = true; + ret["have_base"] = mHaveBase; + ret["have_state"] = mHaveState; + ret["have_transactions"] = mHaveTransactions; + if (mAborted) + ret["aborted"] = true; + ret["timeouts"] = getTimeouts(); + if (mHaveBase && !mHaveState) + { + Json::Value hv(Json::arrayValue); + std::vector v = mLedger->peekAccountStateMap()->getNeededHashes(16); + BOOST_FOREACH(const uint256& h, v) + hv.append(h.GetHex()); + ret["needed_state_hashes"] = hv; + } + if (mHaveBase && !mHaveTransactions) + { + Json::Value hv(Json::arrayValue); + std::vector v = mLedger->peekTransactionMap()->getNeededHashes(16); + BOOST_FOREACH(const uint256& h, v) + hv.append(h.GetHex()); + ret["needed_transaction_hashes"] = hv; + } + return ret; +} + bool LedgerAcquireMaster::hasLedger(const uint256& hash) { assert(hash.isNonZero()); diff --git a/src/cpp/ripple/LedgerAcquire.h b/src/cpp/ripple/LedgerAcquire.h index 805c84c092..0f2c6abd26 100644 --- a/src/cpp/ripple/LedgerAcquire.h +++ b/src/cpp/ripple/LedgerAcquire.h @@ -31,7 +31,7 @@ class PeerSet protected: uint256 mHash; int mTimerInterval, mTimeouts; - bool mComplete, mFailed, mProgress; + bool mComplete, mFailed, mProgress, mAggressive; time_t mLastAction; boost::recursive_mutex mLock; @@ -51,7 +51,7 @@ public: int getTimeouts() const { return mTimeouts; } bool isActive(); - void progress() { mProgress = true; } + void progress() { mProgress = true; mAggressive = false; } bool isProgress() { return mProgress; } void touch() { mLastAction = time(NULL); } time_t getLastAction() { return mLastAction; } @@ -129,6 +129,8 @@ public: static void filterNodes(std::vector& nodeIDs, std::vector& nodeHashes, std::set& recentNodes, int max, bool aggressive); + + Json::Value getJson(int); }; class LedgerAcquireMaster