diff --git a/src/cpp/ripple/LedgerAcquire.cpp b/src/cpp/ripple/LedgerAcquire.cpp index bd8a4d7647..d4ca0027a0 100644 --- a/src/cpp/ripple/LedgerAcquire.cpp +++ b/src/cpp/ripple/LedgerAcquire.cpp @@ -109,7 +109,7 @@ LedgerAcquire::LedgerAcquire(const uint256& hash, uint32 seq) : PeerSet(hash, LE void LedgerAcquire::checkLocal() { boost::recursive_mutex::scoped_lock sl(mLock); - if (mComplete) + if (isDone()) return; if (tryLocal()) @@ -456,7 +456,8 @@ void LedgerAcquire::trigger(Peer::ref peer) std::vector nodeHashes; nodeIDs.reserve(256); nodeHashes.reserve(256); - mLedger->peekTransactionMap()->getMissingNodes(nodeIDs, nodeHashes, 256, NULL); + TransactionStateSF filter(mSeq); + mLedger->peekTransactionMap()->getMissingNodes(nodeIDs, nodeHashes, 256, &filter); if (nodeIDs.empty()) { if (!mLedger->peekTransactionMap()->isValid()) @@ -503,7 +504,8 @@ void LedgerAcquire::trigger(Peer::ref peer) std::vector nodeHashes; nodeIDs.reserve(256); nodeHashes.reserve(256); - mLedger->peekAccountStateMap()->getMissingNodes(nodeIDs, nodeHashes, 256, NULL); + TransactionStateSF filter(mSeq); + mLedger->peekAccountStateMap()->getMissingNodes(nodeIDs, nodeHashes, 256, &filter); if (nodeIDs.empty()) { if (!mLedger->peekAccountStateMap()->isValid()) diff --git a/src/cpp/ripple/LedgerMaster.cpp b/src/cpp/ripple/LedgerMaster.cpp index c8f5472ac5..6d2cd820f1 100644 --- a/src/cpp/ripple/LedgerMaster.cpp +++ b/src/cpp/ripple/LedgerMaster.cpp @@ -265,7 +265,7 @@ bool LedgerMaster::acquireMissingLedger(Ledger::ref origLedger, const uint256& l { typedef std::pair u_pair; std::vector vec = origLedger->getLedgerHashes(); - BOOST_FOREACH(const u_pair& it, vec) + BOOST_REVERSE_FOREACH(const u_pair& it, vec) { if ((fetchCount < fetchMax) && (it.first < ledgerSeq) && !mCompleteLedgers.hasValue(it.first) && !theApp->getMasterLedgerAcquire().find(it.second)) @@ -277,7 +277,8 @@ bool LedgerMaster::acquireMissingLedger(Ledger::ref origLedger, const uint256& l setFullLedger(acq->getLedger()); mLedgerHistory.addAcceptedLedger(acq->getLedger(), false); } - else ++fetchCount; + else + ++fetchCount; } } } diff --git a/src/cpp/ripple/NetworkOPs.cpp b/src/cpp/ripple/NetworkOPs.cpp index 4a2fea52e5..4d660cdc48 100644 --- a/src/cpp/ripple/NetworkOPs.cpp +++ b/src/cpp/ripple/NetworkOPs.cpp @@ -2094,7 +2094,7 @@ bool NetworkOPs::getFetchPack(const uint256& hash, std::vector& d bool NetworkOPs::shouldFetchPack() { uint32 now = getNetworkTimeNC(); - if (mLastFetchPack == now) + if ((mLastFetchPack == now) || ((mLastFetchPack + 1) == now)) return false; mFetchPack.sweep(); if (mFetchPack.getCacheSize() > 384) diff --git a/src/cpp/ripple/SHAMap.cpp b/src/cpp/ripple/SHAMap.cpp index 2dd8a9f850..2eb19e1a7e 100644 --- a/src/cpp/ripple/SHAMap.cpp +++ b/src/cpp/ripple/SHAMap.cpp @@ -733,6 +733,8 @@ SHAMapTreeNode::pointer SHAMap::fetchNodeExternal(const SHAMapNode& id, const ui void SHAMap::fetchRoot(const uint256& hash, SHAMapSyncFilter* filter) { + if (hash == root->getNodeHash()) + return; if (sLog(lsTRACE)) { if (mType == smtTRANSACTION) diff --git a/src/cpp/ripple/SHAMapSync.cpp b/src/cpp/ripple/SHAMapSync.cpp index 8fa26b7ec7..feb655f27c 100644 --- a/src/cpp/ripple/SHAMapSync.cpp +++ b/src/cpp/ripple/SHAMapSync.cpp @@ -136,13 +136,13 @@ std::vector SHAMap::getNeededHashes(int max, SHAMapSyncFilter* filter) if (!node->isEmptyBranch(branch)) { const uint256& childHash = node->getChildHash(branch); - SHAMapNode childID = node->getChildNodeID(branch); if (!fullBelowCache.isPresent(childHash)) { + SHAMapNode childID = node->getChildNodeID(branch); SHAMapTreeNode* d = NULL; try { - d = getNodePointer(node->getChildNodeID(branch), childHash); + d = getNodePointer(childID, childHash); assert(d); } catch (SHAMapMissingNode&)