diff --git a/src/cpp/ripple/SHAMap.cpp b/src/cpp/ripple/SHAMap.cpp index 22995fdee..e2108ba55 100644 --- a/src/cpp/ripple/SHAMap.cpp +++ b/src/cpp/ripple/SHAMap.cpp @@ -15,6 +15,10 @@ #include "SHAMap.h" #include "Application.h" +#ifndef STATE_MAP_BUCKETS +#define STATE_MAP_BUCKETS 1024 +#endif + SETUP_LOG(); DECLARE_INSTANCE(SHAMap); @@ -52,6 +56,8 @@ std::size_t hash_value(const uint160& u) SHAMap::SHAMap(SHAMapType t, uint32 seq) : mSeq(seq), mState(smsModifying), mType(t) { + if (t == smtSTATE) + mTNByID.rehash(STATE_MAP_BUCKETS); root = boost::make_shared(mSeq, SHAMapNode(0, uint256())); root->makeInner(); mTNByID[*root] = root; @@ -59,6 +65,8 @@ SHAMap::SHAMap(SHAMapType t, uint32 seq) : mSeq(seq), mState(smsModifying), mTyp SHAMap::SHAMap(SHAMapType t, const uint256& hash) : mSeq(1), mState(smsSynching), mType(t) { // FIXME: Need to acquire root node + if (t == smtSTATE) + mTNByID.rehash(STATE_MAP_BUCKETS); root = boost::make_shared(mSeq, SHAMapNode(0, uint256())); root->makeInner(); mTNByID[*root] = root; @@ -729,7 +737,7 @@ SHAMapTreeNode::pointer SHAMap::fetchNodeExternal(const SHAMapNode& id, const ui try { SHAMapTreeNode::pointer ret = - boost::make_shared(id, obj->getData(), mSeq, snfPREFIX, hash); + boost::make_shared(id, obj->getData(), mSeq, snfPREFIX, hash, true); if (id != *ret) { cLog(lsFATAL) << "id:" << id << ", got:" << *ret; diff --git a/src/cpp/ripple/SHAMap.h b/src/cpp/ripple/SHAMap.h index 30ad9e52d..d241f1843 100644 --- a/src/cpp/ripple/SHAMap.h +++ b/src/cpp/ripple/SHAMap.h @@ -187,7 +187,7 @@ public: // raw node functions SHAMapTreeNode(const SHAMapNode& id, const std::vector& data, uint32 seq, - SHANodeFormat format, const uint256& hash); + SHANodeFormat format, const uint256& hash, bool hashValid); void addRaw(Serializer &, SHANodeFormat format); virtual bool isPopulated() const { return true; } diff --git a/src/cpp/ripple/SHAMapNodes.cpp b/src/cpp/ripple/SHAMapNodes.cpp index ace6a10e1..6989e8092 100644 --- a/src/cpp/ripple/SHAMapNodes.cpp +++ b/src/cpp/ripple/SHAMapNodes.cpp @@ -177,7 +177,7 @@ SHAMapTreeNode::SHAMapTreeNode(const SHAMapNode& node, SHAMapItem::ref item, TNT } SHAMapTreeNode::SHAMapTreeNode(const SHAMapNode& id, const std::vector& rawNode, uint32 seq, - SHANodeFormat format, const uint256& hash) : + SHANodeFormat format, const uint256& hash, bool hashValid) : SHAMapNode(id), mSeq(seq), mType(tnERROR), mIsBranch(0), mFullBelow(false) { if (format == snfWIRE) @@ -317,9 +317,7 @@ SHAMapTreeNode::SHAMapTreeNode(const SHAMapNode& id, const std::vector& nodeIDs, std::vector& hashes, int max, SHAMapSyncFilter* filter) { @@ -63,7 +65,7 @@ void SHAMap::getMissingNodes(std::vector& nodeIDs, std::vector= 1); SHAMapTreeNode::pointer ptr = - boost::make_shared(childID, nodeData, mSeq - 1, snfPREFIX, childHash); + boost::make_shared(childID, nodeData, mSeq - 1, snfPREFIX, childHash, true); cLog(lsTRACE) << "Got sync node from cache: " << *ptr; mTNByID[*ptr] = ptr; d = ptr.get(); @@ -213,7 +215,7 @@ SMAddNode SHAMap::addRootNode(const std::vector& rootNode, SHANod assert(mSeq >= 1); SHAMapTreeNode::pointer node = - boost::make_shared(SHAMapNode(), rootNode, mSeq - 1, format, uint256()); + boost::make_shared(SHAMapNode(), rootNode, mSeq - 1, format, uZero, false); if (!node) return SMAddNode::invalid(); @@ -253,7 +255,7 @@ SMAddNode SHAMap::addRootNode(const uint256& hash, const std::vector= 1); SHAMapTreeNode::pointer node = - boost::make_shared(SHAMapNode(), rootNode, mSeq - 1, format, uint256()); + boost::make_shared(SHAMapNode(), rootNode, mSeq - 1, format, uZero, false); if (!node || node->getNodeHash() != hash) return SMAddNode::invalid(); @@ -332,7 +334,7 @@ SMAddNode SHAMap::addKnownNode(const SHAMapNode& node, const std::vector= 1); SHAMapTreeNode::pointer newNode = - boost::make_shared(node, rawNode, mSeq - 1, snfWIRE, uint256()); + boost::make_shared(node, rawNode, mSeq - 1, snfWIRE, uZero, false); if (hash != newNode->getNodeHash()) // these aren't the droids we're looking for return SMAddNode::invalid();