Some asserts to catch some possible causes of the SHAMap destructor crash.

This commit is contained in:
JoelKatz
2013-03-09 17:13:59 -08:00
parent 89b9139c85
commit ed871e6bc2
3 changed files with 17 additions and 9 deletions

View File

@@ -788,6 +788,8 @@ int SHAMap::flushDirty(SHADirtyMap& map, int maxNodes, HashedObjectType t, uint3
// tLog(t == hotACCOUNT_NODE, lsDEBUG) << "STATE node write " << it->first;
s.erase();
it->second->addRaw(s, snfPREFIX);
#ifdef DEBUG
if (s.getSHA512Half() != it->second->getNodeHash())
{
cLog(lsFATAL) << *(it->second);
@@ -795,6 +797,8 @@ int SHAMap::flushDirty(SHADirtyMap& map, int maxNodes, HashedObjectType t, uint3
cLog(lsFATAL) << s.getSHA512Half() << " != " << it->second->getNodeHash();
assert(false);
}
#endif
theApp->getHashedObjectStore().store(t, seq, s.peekData(), it->second->getNodeHash());
if (flushed++ >= maxNodes)
return flushed;
@@ -805,6 +809,8 @@ int SHAMap::flushDirty(SHADirtyMap& map, int maxNodes, HashedObjectType t, uint3
boost::shared_ptr<SHAMap::SHADirtyMap> SHAMap::disarmDirty()
{ // stop saving dirty nodes
boost::recursive_mutex::scoped_lock sl(mLock);
boost::shared_ptr<SHADirtyMap> ret;
ret.swap(mDirtyNodes);
return ret;
@@ -812,7 +818,6 @@ boost::shared_ptr<SHAMap::SHADirtyMap> SHAMap::disarmDirty()
SHAMapTreeNode::pointer SHAMap::getNode(const SHAMapNode& nodeID)
{
boost::recursive_mutex::scoped_lock sl(mLock);
SHAMapTreeNode::pointer node = checkCacheNode(nodeID);
if (node)

View File

@@ -161,16 +161,12 @@ SHAMapTreeNode::SHAMapTreeNode(uint32 seq, const SHAMapNode& nodeID) : SHAMapNod
}
SHAMapTreeNode::SHAMapTreeNode(const SHAMapTreeNode& node, uint32 seq) : SHAMapNode(node),
mHash(node.mHash), mSeq(seq), mType(node.mType), mIsBranch(0), mFullBelow(false)
mHash(node.mHash), mSeq(seq), mType(node.mType), mIsBranch(node.mIsBranch), mFullBelow(false)
{
if (node.mItem)
mItem = boost::make_shared<SHAMapItem>(*node.mItem);
else
memcpy(mHashes, node.mHashes, sizeof(mHashes));
for (int i = 0; i < 16; ++i)
if (mHashes[i].isNonZero())
mIsBranch |= (1 << i);
}
SHAMapTreeNode::SHAMapTreeNode(const SHAMapNode& node, SHAMapItem::ref item, TNType type, uint32 seq) :

View File

@@ -61,6 +61,7 @@ void SHAMap::getMissingNodes(std::vector<SHAMapNode>& nodeIDs, std::vector<uint2
std::vector<unsigned char> nodeData;
if (filter->haveNode(childID, childHash, nodeData))
{
assert(mSeq >= 1);
SHAMapTreeNode::pointer ptr =
boost::make_shared<SHAMapTreeNode>(childID, nodeData, mSeq - 1, snfPREFIX, childHash);
cLog(lsTRACE) << "Got sync node from cache: " << *ptr;
@@ -204,7 +205,9 @@ SMAddNode SHAMap::addRootNode(const std::vector<unsigned char>& rootNode, SHANod
return SMAddNode::okay();
}
SHAMapTreeNode::pointer node = boost::make_shared<SHAMapTreeNode>(SHAMapNode(), rootNode, mSeq - 1, format, uint256());
assert(mSeq >= 1);
SHAMapTreeNode::pointer node =
boost::make_shared<SHAMapTreeNode>(SHAMapNode(), rootNode, mSeq - 1, format, uint256());
if (!node)
return SMAddNode::invalid();
@@ -242,7 +245,9 @@ SMAddNode SHAMap::addRootNode(const uint256& hash, const std::vector<unsigned ch
return SMAddNode::okay();
}
SHAMapTreeNode::pointer node = boost::make_shared<SHAMapTreeNode>(SHAMapNode(), rootNode, mSeq - 1, format, uint256());
assert(mSeq >= 1);
SHAMapTreeNode::pointer node =
boost::make_shared<SHAMapTreeNode>(SHAMapNode(), rootNode, mSeq - 1, format, uint256());
if (!node || node->getNodeHash() != hash)
return SMAddNode::invalid();
@@ -319,7 +324,9 @@ SMAddNode SHAMap::addKnownNode(const SHAMapNode& node, const std::vector<unsigne
return SMAddNode::invalid();
}
SHAMapTreeNode::pointer newNode = boost::make_shared<SHAMapTreeNode>(node, rawNode, mSeq - 1, snfWIRE, uint256());
assert(mSeq >= 1);
SHAMapTreeNode::pointer newNode =
boost::make_shared<SHAMapTreeNode>(node, rawNode, mSeq - 1, snfWIRE, uint256());
if (hash != newNode->getNodeHash()) // these aren't the droids we're looking for
return SMAddNode::invalid();