From 98130b524d3ac7e7e499c45c3d372e4b7ee07db3 Mon Sep 17 00:00:00 2001 From: JoelKatz Date: Thu, 25 Oct 2012 02:22:23 -0700 Subject: [PATCH] We didn't correctly store root nodes we acquired from the network. --- src/LedgerAcquire.cpp | 21 +++++++++++++++------ src/LedgerConsensus.cpp | 2 +- src/SHAMap.h | 6 ++++-- src/SHAMapSync.cpp | 23 ++++++++++++++++++----- 4 files changed, 38 insertions(+), 14 deletions(-) diff --git a/src/LedgerAcquire.cpp b/src/LedgerAcquire.cpp index 8ee5f83b4..f3bdaea9b 100644 --- a/src/LedgerAcquire.cpp +++ b/src/LedgerAcquire.cpp @@ -400,7 +400,7 @@ bool LedgerAcquire::takeTxNode(const std::list& nodeIDs, { if (nodeIDit->isRoot()) { - if (!mLedger->peekTransactionMap()->addRootNode(mLedger->getTransHash(), *nodeDatait, snfWIRE)) + if (!mLedger->peekTransactionMap()->addRootNode(mLedger->getTransHash(), *nodeDatait, snfWIRE, &tFilter)) return false; } else if (!mLedger->peekTransactionMap()->addKnownNode(*nodeIDit, *nodeDatait, &tFilter)) @@ -435,7 +435,8 @@ bool LedgerAcquire::takeAsNode(const std::list& nodeIDs, { if (nodeIDit->isRoot()) { - if (!mLedger->peekAccountStateMap()->addRootNode(mLedger->getAccountHash(), *nodeDatait, snfWIRE)) + if (!mLedger->peekAccountStateMap()->addRootNode(mLedger->getAccountHash(), + *nodeDatait, snfWIRE, &tFilter)) return false; } else if (!mLedger->peekAccountStateMap()->addKnownNode(*nodeIDit, *nodeDatait, &tFilter)) @@ -458,14 +459,22 @@ bool LedgerAcquire::takeAsNode(const std::list& nodeIDs, bool LedgerAcquire::takeAsRootNode(const std::vector& data) { - if (!mHaveBase) return false; - return mLedger->peekAccountStateMap()->addRootNode(mLedger->getAccountHash(), data, snfWIRE); + if (!mHaveBase) + return false; + AccountStateSF tFilter(mLedger->getHash(), mLedger->getLedgerSeq()); + if (!mLedger->peekAccountStateMap()->addRootNode(mLedger->getAccountHash(), data, snfWIRE, &tFilter)) + return false; + return true; } bool LedgerAcquire::takeTxRootNode(const std::vector& data) { - if (!mHaveBase) return false; - return mLedger->peekTransactionMap()->addRootNode(mLedger->getTransHash(), data, snfWIRE); + if (!mHaveBase) + return false; + TransactionStateSF tFilter(mLedger->getHash(), mLedger->getLedgerSeq()); + if (!mLedger->peekTransactionMap()->addRootNode(mLedger->getTransHash(), data, snfWIRE, &tFilter)) + return false; + return true; } LedgerAcquire::pointer LedgerAcquireMaster::findCreate(const uint256& hash) diff --git a/src/LedgerConsensus.cpp b/src/LedgerConsensus.cpp index 4848dc3f6..9617fcde0 100644 --- a/src/LedgerConsensus.cpp +++ b/src/LedgerConsensus.cpp @@ -114,7 +114,7 @@ bool TransactionAcquire::takeNodes(const std::list& nodeIDs, cLog(lsWARNING) << "Got root TXS node, already have it"; return false; } - if (!mMap->addRootNode(getHash(), *nodeDatait, snfWIRE)) + if (!mMap->addRootNode(getHash(), *nodeDatait, snfWIRE, NULL)) return false; else mHaveRoot = true; diff --git a/src/SHAMap.h b/src/SHAMap.h index c41406d36..6973f6ce3 100644 --- a/src/SHAMap.h +++ b/src/SHAMap.h @@ -368,8 +368,10 @@ public: bool getNodeFat(const SHAMapNode& node, std::vector& nodeIDs, std::list >& rawNode, bool fatRoot, bool fatLeaves); bool getRootNode(Serializer& s, SHANodeFormat format); - bool addRootNode(const uint256& hash, const std::vector& rootNode, SHANodeFormat format); - bool addRootNode(const std::vector& rootNode, SHANodeFormat format); + bool addRootNode(const uint256& hash, const std::vector& rootNode, SHANodeFormat format, + SHAMapSyncFilter* filter); + bool addRootNode(const std::vector& rootNode, SHANodeFormat format, + SHAMapSyncFilter* filter); bool addKnownNode(const SHAMapNode& nodeID, const std::vector& rawNode, SHAMapSyncFilter* filter); diff --git a/src/SHAMapSync.cpp b/src/SHAMapSync.cpp index 4c051b3d6..b8202fb96 100644 --- a/src/SHAMapSync.cpp +++ b/src/SHAMapSync.cpp @@ -131,7 +131,7 @@ bool SHAMap::getRootNode(Serializer& s, SHANodeFormat format) return true; } -bool SHAMap::addRootNode(const std::vector& rootNode, SHANodeFormat format) +bool SHAMap::addRootNode(const std::vector& rootNode, SHANodeFormat format, SHAMapSyncFilter* filter) { boost::recursive_mutex::scoped_lock sl(mLock); @@ -154,16 +154,23 @@ bool SHAMap::addRootNode(const std::vector& rootNode, SHANodeForm root = node; mTNByID[*root] = root; - if (!root->getNodeHash()) + if (root->getNodeHash().isZero()) { root->setFullBelow(); clearSynching(); } + else if (filter) + { + Serializer s; + root->addRaw(s, snfPREFIX); + filter->gotNode(*root, root->getNodeHash(), s.peekData(), root->getType()); + } return true; } -bool SHAMap::addRootNode(const uint256& hash, const std::vector& rootNode, SHANodeFormat format) +bool SHAMap::addRootNode(const uint256& hash, const std::vector& rootNode, SHANodeFormat format, + SHAMapSyncFilter* filter) { boost::recursive_mutex::scoped_lock sl(mLock); @@ -184,11 +191,17 @@ bool SHAMap::addRootNode(const uint256& hash, const std::vector& returnNode(root, true); root = node; mTNByID[*root] = root; - if (!root->getNodeHash()) + if (root->getNodeHash().isZero()) { root->setFullBelow(); clearSynching(); } + else if (filter) + { + Serializer s; + root->addRaw(s, snfPREFIX); + filter->gotNode(*root, root->getNodeHash(), s.peekData(), root->getType()); + } return true; } @@ -458,7 +471,7 @@ BOOST_AUTO_TEST_CASE( SHAMapSync_test ) cLog(lsFATAL) << "Didn't get root node " << gotNodes.size(); BOOST_FAIL("NodeSize"); } - if (!destination.addRootNode(*gotNodes.begin(), snfWIRE)) + if (!destination.addRootNode(*gotNodes.begin(), snfWIRE, NULL)) { cLog(lsFATAL) << "AddRootNode fails"; BOOST_FAIL("AddRootNode");