diff --git a/src/ripple/shamap/impl/SHAMapSync.cpp b/src/ripple/shamap/impl/SHAMapSync.cpp index 6171a2a73..bc4eb8a2e 100644 --- a/src/ripple/shamap/impl/SHAMapSync.cpp +++ b/src/ripple/shamap/impl/SHAMapSync.cpp @@ -169,7 +169,11 @@ void SHAMap::getMissingNodes (std::vector& nodeIDs, std::vectorgetChildHash (branch); - if (! backed_ || ! f_.fullbelow().touch_if_exists (childHash)) + if (missingHashes.count (childHash) != 0) + { + fullBelow = false; + } + else if (! backed_ || ! f_.fullbelow().touch_if_exists (childHash)) { SHAMapNodeID childID = nodeID.getChildNodeID (branch); bool pending = false; @@ -179,14 +183,11 @@ void SHAMap::getMissingNodes (std::vector& nodeIDs, std::vector& nodeIDs, std::vector (after - before); + auto const count = deferredReads.size (); // Process all deferred reads + int hits = 0; for (auto const& node : deferredReads) { auto parent = std::get<0>(node); @@ -251,20 +259,31 @@ void SHAMap::getMissingNodes (std::vector& nodeIDs, std::vector nodePtr = fetchNodeNT (nodeID, nodeHash, filter); if (nodePtr) { + ++hits; if (backed_) canonicalize (nodeHash, nodePtr); parent->canonicalizeChild (branch, nodePtr); } - else if (missingHashes.insert (nodeHash).second) + else if ((max > 0) && (missingHashes.insert (nodeHash).second)) { nodeIDs.push_back (nodeID); hashes.push_back (nodeHash); - if (--max <= 0) - return; + --max; } } + auto const process_time = std::chrono::duration_cast + (std::chrono::steady_clock::now() - after); + + if ((count > 50) || (elapsed.count() > 50)) + journal_.debug << "getMissingNodes reads " << + count << " nodes (" << hits << " hits) in " + << elapsed.count() << " + " << process_time.count() << " ms"; + + if (max <= 0) + return; + } if (nodeIDs.empty ())