From f666003977aad4852bc2da8af85cd9b215f0e08d Mon Sep 17 00:00:00 2001 From: JoelKatz Date: Fri, 4 Jan 2013 20:42:31 -0800 Subject: [PATCH] TMGetObjectByHash needs to know the object type. --- src/cpp/ripple/LedgerAcquire.cpp | 32 +++++++++++++++++++++++++++----- src/cpp/ripple/LedgerAcquire.h | 3 ++- src/cpp/ripple/SHAMap.h | 2 +- src/cpp/ripple/SHAMapSync.cpp | 8 +++++--- 4 files changed, 35 insertions(+), 10 deletions(-) diff --git a/src/cpp/ripple/LedgerAcquire.cpp b/src/cpp/ripple/LedgerAcquire.cpp index 6bd537ab94..dcaff39f35 100644 --- a/src/cpp/ripple/LedgerAcquire.cpp +++ b/src/cpp/ripple/LedgerAcquire.cpp @@ -226,8 +226,22 @@ void LedgerAcquire::trigger(Peer::ref peer) ripple::TMGetLedger tmGL; tmGL.set_ledgerhash(mHash.begin(), mHash.size()); if (getTimeouts() != 0) + { tmGL.set_querytype(ripple::qtINDIRECT); +#if 0 + if (!isProgress()) + { + std::vector< std::pair > need = getNeededHashes(); + if (!need.empty()) + { + ripple::TMGetObjectByHash tmBH; + tmBH. + } + } +#endif + } + if (!mHaveBase) { tmGL.set_itype(ripple::liBASE); @@ -531,18 +545,26 @@ LedgerAcquire::pointer LedgerAcquireMaster::find(const uint256& hash) return LedgerAcquire::pointer(); } -std::vector LedgerAcquire::getNeededHashes() +std::vector< std::pair > LedgerAcquire::getNeededHashes() { - std::vector ret; + std::vector< std::pair > ret; if (!mHaveBase) { - ret.push_back(mHash); + ret.push_back(std::make_pair(ripple::TMGetObjectByHash::otLEDGER, mHash)); return ret; } if (!mHaveState) - mLedger->peekAccountStateMap()->getNeededHashes(ret, 16); + { + std::vector v = mLedger->peekAccountStateMap()->getNeededHashes(16); + BOOST_FOREACH(const uint256& h, v) + ret.push_back(std::make_pair(ripple::TMGetObjectByHash::otSTATE_NODE, h)); + } if (!mHaveTransactions) - mLedger->peekTransactionMap()->getNeededHashes(ret, 16); + { + std::vector v = mLedger->peekTransactionMap()->getNeededHashes(16); + BOOST_FOREACH(const uint256& h, v) + ret.push_back(std::make_pair(ripple::TMGetObjectByHash::otTRANSACTION_NODE, h)); + } return ret; } diff --git a/src/cpp/ripple/LedgerAcquire.h b/src/cpp/ripple/LedgerAcquire.h index 7799766076..da79bb308c 100644 --- a/src/cpp/ripple/LedgerAcquire.h +++ b/src/cpp/ripple/LedgerAcquire.h @@ -44,6 +44,7 @@ public: int getTimeouts() const { return mTimeouts; } void progress() { mProgress = true; } + bool isProgress() { return mProgress; } void peerHas(Peer::ref); void badPeer(Peer::ref); @@ -109,7 +110,7 @@ public: bool tryLocal(); void addPeers(); - std::vector getNeededHashes(); + std::vector< std::pair > getNeededHashes(); }; class LedgerAcquireMaster diff --git a/src/cpp/ripple/SHAMap.h b/src/cpp/ripple/SHAMap.h index 6071603f58..2c1a444afe 100644 --- a/src/cpp/ripple/SHAMap.h +++ b/src/cpp/ripple/SHAMap.h @@ -413,7 +413,7 @@ public: bool getNodeFat(const SHAMapNode& node, std::vector& nodeIDs, std::list >& rawNode, bool fatRoot, bool fatLeaves); bool getRootNode(Serializer& s, SHANodeFormat format); - void getNeededHashes(std::vector& hashes, int max); + std::vector getNeededHashes(int max); SMAddNode addRootNode(const uint256& hash, const std::vector& rootNode, SHANodeFormat format, SHAMapSyncFilter* filter); SMAddNode addRootNode(const std::vector& rootNode, SHANodeFormat format, diff --git a/src/cpp/ripple/SHAMapSync.cpp b/src/cpp/ripple/SHAMapSync.cpp index eb5e11b23c..4ac682fe8e 100644 --- a/src/cpp/ripple/SHAMapSync.cpp +++ b/src/cpp/ripple/SHAMapSync.cpp @@ -91,8 +91,9 @@ void SHAMap::getMissingNodes(std::vector& nodeIDs, std::vector& ret, int max) +std::vector SHAMap::getNeededHashes(int max) { + std::vector ret; boost::recursive_mutex::scoped_lock sl(mLock); assert(root->isValid()); @@ -100,7 +101,7 @@ void SHAMap::getNeededHashes(std::vector& ret, int max) if (root->isFullBelow() || !root->isInner()) { clearSynching(); - return; + return ret; } std::stack stack; @@ -133,13 +134,14 @@ void SHAMap::getNeededHashes(std::vector& ret, int max) have_all = false; ret.push_back(childHash); if (--max <= 0) - return; + return ret; } } } if (have_all) node->setFullBelow(); } + return ret; } bool SHAMap::getNodeFat(const SHAMapNode& wanted, std::vector& nodeIDs,