diff --git a/SHAMap.cpp b/SHAMap.cpp index d945220dfa..902ee01e6a 100644 --- a/SHAMap.cpp +++ b/SHAMap.cpp @@ -9,7 +9,7 @@ #include "BitcoinUtil.h" #include "SHAMap.h" -SHAMap::SHAMap(uint32 seq) : mSeq(seq), mImmutable(false), mSynching(false) +SHAMap::SHAMap(uint32 seq) : mSeq(seq), mState(Modifying) { root=boost::make_shared(SHAMapNode(0, uint256()), mSeq); root->makeInner(); @@ -36,7 +36,7 @@ std::stack SHAMap::getStack(const uint256& id, bool inc node=getNode(node->getChildNodeID(branch), hash, false); if(!node) { - if(mSynching) return stack; + if(isSynching()) return stack; throw SHAMapException(MissingNode); } } @@ -51,7 +51,7 @@ void SHAMap::dirtyUp(std::stack& stack, const uint256& { // walk the tree up from through the inner nodes to the root // update linking hashes and add nodes to dirty list - assert(!mImmutable && !mSynching); + assert(mState!=Synching && mState!=Immutable); while(!stack.empty()) { diff --git a/SHAMap.h b/SHAMap.h index ad4c665edf..51d1611eb9 100644 --- a/SHAMap.h +++ b/SHAMap.h @@ -208,6 +208,15 @@ enum SHAMapException InvalidMap=3, }; +enum SHAMapState +{ + Modifying=0, // Objects can be added and removed (like an open ledger) + Immutable=1, // Map cannot be changed (like a closed ledger) + Synching=2, // Map's hash is locked in, valid nodes can be added (like a peer's closing ledger) + Floating=3, // Map is free to change hash (like a synching open ledger) + Invalid=4, // Map is known not to be valid (usually synching a corrupt ledger) +}; + class SHAMap { public: @@ -223,7 +232,7 @@ private: SHAMapTreeNode::pointer root; - bool mImmutable, mSynching; + SHAMapState mState; protected: @@ -288,11 +297,13 @@ public: bool addKnownNode(const SHAMapNode& nodeID, const std::vector& rawNode); // status functions - void setImmutable(void) { mImmutable=true; } - void clearImmutable(void) { mImmutable=false; } - bool isSynching(void) const { return mSynching; } - void setSynching(void) { mSynching=true; } - void clearSynching(void) { mSynching=false; } + void setImmutable(void) { assert(mState!=Invalid); mState=Immutable; } + void clearImmutable(void) { mState=Modifying; } + bool isSynching(void) const { return mState==Floating || mState==Synching; } + void setSynching(void) { mState=Synching; } + void setFloating(void) { mState=Floating; } + void clearSynching(void) { mState=Modifying; } + bool isValid(void) { return mState!=Invalid; } // caution: otherMap must be accessed only by this function // return value: true=successfully completed, false=too different diff --git a/SHAMapSync.cpp b/SHAMapSync.cpp index b3ca77bd63..e4ecf150e4 100644 --- a/SHAMapSync.cpp +++ b/SHAMapSync.cpp @@ -166,7 +166,7 @@ bool SHAMap::addRootNode(const uint256& hash, const std::vector& bool SHAMap::addKnownNode(const SHAMapNode& node, const std::vector& rawNode) { // return value: true=okay, false=error assert(!node.isRoot()); - assert(mSynching); + if(!isSynching()) return false; boost::recursive_mutex::scoped_lock sl(mLock); @@ -363,17 +363,15 @@ bool SHAMap::syncTest() // add random data to the source map - int items=1000000; + int items=10000; for(int i=0; i