From 6a9b5ccd7d738ebd294c65400ceafa1f484f8611 Mon Sep 17 00:00:00 2001 From: JoelKatz Date: Fri, 29 Jun 2012 23:19:29 -0700 Subject: [PATCH 1/4] Support STN_ARF_UNKNOWN for contexts where the format of a node is not known. Format is auto-detected. --- src/SHAMap.h | 7 ++++--- src/SHAMapNodes.cpp | 8 ++++++++ 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/src/SHAMap.h b/src/SHAMap.h index 2e1af1dcaf..64eec583a8 100644 --- a/src/SHAMap.h +++ b/src/SHAMap.h @@ -157,11 +157,12 @@ public: SHAMapTreeNode(const SHAMapTreeNode& node, uint32 seq); // copy node from older tree SHAMapTreeNode(const SHAMapNode& nodeID, SHAMapItem::pointer item, TNType type, uint32 seq); - // raw node functions - SHAMapTreeNode(const SHAMapNode& id, const std::vector& contents, uint32 seq, int format); - +#define STN_ARF_UNKNOWN 0 #define STN_ARF_PREFIXED 1 #define STN_ARF_WIRE 2 + + // raw node functions + SHAMapTreeNode(const SHAMapNode& id, const std::vector& contents, uint32 seq, int format); void addRaw(Serializer &, int format); virtual bool isPopulated() const { return true; } diff --git a/src/SHAMapNodes.cpp b/src/SHAMapNodes.cpp index dbdc8ee109..3a9c682414 100644 --- a/src/SHAMapNodes.cpp +++ b/src/SHAMapNodes.cpp @@ -192,6 +192,14 @@ SHAMapTreeNode::SHAMapTreeNode(const SHAMapNode& node, SHAMapItem::pointer item, SHAMapTreeNode::SHAMapTreeNode(const SHAMapNode& id, const std::vector& rawNode, uint32 seq, int format) : SHAMapNode(id), mSeq(seq), mType(tnERROR), mFullBelow(false) { + if (format == STN_ARF_UNKNOWN) + { + if ((rawNode.size() < 4) || (rawNode[0] < 10)) + format = STN_ARF_WIRE; + else + format = STN_ARF_PREFIXED; + } + if (format == STN_ARF_WIRE) { Serializer s(rawNode); From ce14aa81914db875e4e047e98b81c50c0987cfb3 Mon Sep 17 00:00:00 2001 From: JoelKatz Date: Fri, 29 Jun 2012 23:19:56 -0700 Subject: [PATCH 2/4] Make 'addRootNode' support both prefixed and wire formats. Fix getMissingNodes to retrieve from the node store in prefixed format. --- src/SHAMapSync.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/SHAMapSync.cpp b/src/SHAMapSync.cpp index b9a29210c3..538ebfdb35 100644 --- a/src/SHAMapSync.cpp +++ b/src/SHAMapSync.cpp @@ -58,7 +58,7 @@ void SHAMap::getMissingNodes(std::vector& nodeIDs, std::vector nodeData; if (filter->haveNode(childID, childHash, nodeData)) { - d = boost::make_shared(childID, nodeData, mSeq, STN_ARF_WIRE); + d = boost::make_shared(childID, nodeData, mSeq, STN_ARF_PREFIXED); if (childHash != d->getNodeHash()) { Log(lsERROR) << "Wrong hash from cached object"; @@ -133,7 +133,7 @@ bool SHAMap::addRootNode(const std::vector& rootNode) return true; } - SHAMapTreeNode::pointer node = boost::make_shared(SHAMapNode(), rootNode, 0, STN_ARF_WIRE); + SHAMapTreeNode::pointer node = boost::make_shared(SHAMapNode(), rootNode, 0, STN_ARF_UNKNOWN); if (!node) return false; #ifdef DEBUG @@ -165,7 +165,7 @@ bool SHAMap::addRootNode(const uint256& hash, const std::vector& return true; } - SHAMapTreeNode::pointer node = boost::make_shared(SHAMapNode(), rootNode, 0, STN_ARF_WIRE); + SHAMapTreeNode::pointer node = boost::make_shared(SHAMapNode(), rootNode, 0, STN_ARF_UNKNOWN); if (!node) return false; if (node->getNodeHash() != hash) From 0627ae22da7e8241a4d9903895ce017b840577d6 Mon Sep 17 00:00:00 2001 From: JoelKatz Date: Fri, 29 Jun 2012 23:32:26 -0700 Subject: [PATCH 3/4] A better fix. Take the format as a parameter in addRootNode. --- src/LedgerAcquire.cpp | 4 ++-- src/SHAMap.h | 5 ++--- src/SHAMapNodes.cpp | 8 -------- src/SHAMapSync.cpp | 10 +++++----- 4 files changed, 9 insertions(+), 18 deletions(-) diff --git a/src/LedgerAcquire.cpp b/src/LedgerAcquire.cpp index 7a0892b523..8049ddfbd0 100644 --- a/src/LedgerAcquire.cpp +++ b/src/LedgerAcquire.cpp @@ -326,7 +326,7 @@ bool LedgerAcquire::takeTxNode(const std::list& nodeIDs, { if (nodeIDit->isRoot()) { - if (!mLedger->peekTransactionMap()->addRootNode(mLedger->getTransHash(), *nodeDatait)) + if (!mLedger->peekTransactionMap()->addRootNode(mLedger->getTransHash(), *nodeDatait, STN_ARF_WIRE)) return false; } else if (!mLedger->peekTransactionMap()->addKnownNode(*nodeIDit, *nodeDatait, &tFilter)) @@ -358,7 +358,7 @@ bool LedgerAcquire::takeAsNode(const std::list& nodeIDs, { if (nodeIDit->isRoot()) { - if (!mLedger->peekAccountStateMap()->addRootNode(mLedger->getAccountHash(), *nodeDatait)) + if (!mLedger->peekAccountStateMap()->addRootNode(mLedger->getAccountHash(), *nodeDatait, STN_ARF_WIRE)) return false; } else if (!mLedger->peekAccountStateMap()->addKnownNode(*nodeIDit, *nodeDatait, &tFilter)) diff --git a/src/SHAMap.h b/src/SHAMap.h index 64eec583a8..f0083dd277 100644 --- a/src/SHAMap.h +++ b/src/SHAMap.h @@ -157,7 +157,6 @@ public: SHAMapTreeNode(const SHAMapTreeNode& node, uint32 seq); // copy node from older tree SHAMapTreeNode(const SHAMapNode& nodeID, SHAMapItem::pointer item, TNType type, uint32 seq); -#define STN_ARF_UNKNOWN 0 #define STN_ARF_PREFIXED 1 #define STN_ARF_WIRE 2 @@ -324,8 +323,8 @@ public: SHAMapSyncFilter* filter); bool getNodeFat(const SHAMapNode& node, std::vector& nodeIDs, std::list >& rawNode, bool fatLeaves); - bool addRootNode(const uint256& hash, const std::vector& rootNode); - bool addRootNode(const std::vector& rootNode); + bool addRootNode(const uint256& hash, const std::vector& rootNode, int format); + bool addRootNode(const std::vector& rootNode, int format); bool addKnownNode(const SHAMapNode& nodeID, const std::vector& rawNode, SHAMapSyncFilter* filter); diff --git a/src/SHAMapNodes.cpp b/src/SHAMapNodes.cpp index 3a9c682414..dbdc8ee109 100644 --- a/src/SHAMapNodes.cpp +++ b/src/SHAMapNodes.cpp @@ -192,14 +192,6 @@ SHAMapTreeNode::SHAMapTreeNode(const SHAMapNode& node, SHAMapItem::pointer item, SHAMapTreeNode::SHAMapTreeNode(const SHAMapNode& id, const std::vector& rawNode, uint32 seq, int format) : SHAMapNode(id), mSeq(seq), mType(tnERROR), mFullBelow(false) { - if (format == STN_ARF_UNKNOWN) - { - if ((rawNode.size() < 4) || (rawNode[0] < 10)) - format = STN_ARF_WIRE; - else - format = STN_ARF_PREFIXED; - } - if (format == STN_ARF_WIRE) { Serializer s(rawNode); diff --git a/src/SHAMapSync.cpp b/src/SHAMapSync.cpp index 538ebfdb35..548008a68b 100644 --- a/src/SHAMapSync.cpp +++ b/src/SHAMapSync.cpp @@ -122,7 +122,7 @@ bool SHAMap::getNodeFat(const SHAMapNode& wanted, std::vector& nodeI return true; } -bool SHAMap::addRootNode(const std::vector& rootNode) +bool SHAMap::addRootNode(const std::vector& rootNode, int format) { boost::recursive_mutex::scoped_lock sl(mLock); @@ -133,7 +133,7 @@ bool SHAMap::addRootNode(const std::vector& rootNode) return true; } - SHAMapTreeNode::pointer node = boost::make_shared(SHAMapNode(), rootNode, 0, STN_ARF_UNKNOWN); + SHAMapTreeNode::pointer node = boost::make_shared(SHAMapNode(), rootNode, 0, format); if (!node) return false; #ifdef DEBUG @@ -153,7 +153,7 @@ bool SHAMap::addRootNode(const std::vector& rootNode) return true; } -bool SHAMap::addRootNode(const uint256& hash, const std::vector& rootNode) +bool SHAMap::addRootNode(const uint256& hash, const std::vector& rootNode, int format) { boost::recursive_mutex::scoped_lock sl(mLock); @@ -165,7 +165,7 @@ bool SHAMap::addRootNode(const uint256& hash, const std::vector& return true; } - SHAMapTreeNode::pointer node = boost::make_shared(SHAMapNode(), rootNode, 0, STN_ARF_UNKNOWN); + SHAMapTreeNode::pointer node = boost::make_shared(SHAMapNode(), rootNode, 0, format); if (!node) return false; if (node->getNodeHash() != hash) @@ -447,7 +447,7 @@ BOOST_AUTO_TEST_CASE( SHAMapSync_test ) Log(lsFATAL) << "Didn't get root node " << gotNodes.size(); BOOST_FAIL("NodeSize"); } - if (!destination.addRootNode(*gotNodes.begin())) + if (!destination.addRootNode(*gotNodes.begin(), STN_ARF_WIRE)) { Log(lsFATAL) << "AddRootNode fails"; BOOST_FAIL("AddRootNode"); From c1d01348f88c6e8e1ba1bb6b7b6088e04b12b6d4 Mon Sep 17 00:00:00 2001 From: JoelKatz Date: Fri, 29 Jun 2012 23:33:12 -0700 Subject: [PATCH 4/4] Add root node in wire format. --- src/LedgerConsensus.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/LedgerConsensus.cpp b/src/LedgerConsensus.cpp index 8da8844529..755b74c2c4 100644 --- a/src/LedgerConsensus.cpp +++ b/src/LedgerConsensus.cpp @@ -101,7 +101,7 @@ bool TransactionAcquire::takeNodes(const std::list& nodeIDs, Log(lsWARNING) << "Got root TXS node, already have it"; return false; } - if (!mMap->addRootNode(getHash(), *nodeDatait)) + if (!mMap->addRootNode(getHash(), *nodeDatait, STN_ARF_WIRE)) return false; else mHaveRoot = true; }