diff --git a/src/cpp/ripple/LedgerConsensus.cpp b/src/cpp/ripple/LedgerConsensus.cpp index 9524c4c2a0..0633269129 100644 --- a/src/cpp/ripple/LedgerConsensus.cpp +++ b/src/cpp/ripple/LedgerConsensus.cpp @@ -827,7 +827,6 @@ SHAMap::pointer LedgerConsensus::getTransactionTree(const uint256& hash, bool do SHAMap::pointer currentMap = theApp->getLedgerMaster().getCurrentLedger()->peekTransactionMap(); if (currentMap->getHash() == hash) { - cLog(lsINFO) << "node proposes our open transaction set"; currentMap = currentMap->snapShot(false); mapComplete(hash, currentMap, false); return currentMap; @@ -1193,6 +1192,9 @@ uint32 LedgerConsensus::roundCloseTime(uint32 closeTime) void LedgerConsensus::accept(SHAMap::ref set, LoadEvent::pointer) { + if (set->getHash().isNonZero()) + theApp->getOPs().takePosition(mPreviousLedger->getLedgerSeq(), set); + boost::recursive_mutex::scoped_lock masterLock(theApp->getMasterLock()); assert(set->getHash() == mOurPosition->getCurrentHash()); diff --git a/src/cpp/ripple/NetworkOPs.cpp b/src/cpp/ripple/NetworkOPs.cpp index 1104793776..2707798830 100644 --- a/src/cpp/ripple/NetworkOPs.cpp +++ b/src/cpp/ripple/NetworkOPs.cpp @@ -906,11 +906,32 @@ void NetworkOPs::processTrustedProposal(LedgerProposal::pointer proposal, SHAMap::pointer NetworkOPs::getTXMap(const uint256& hash) { + std::map >::iterator it = mRecentPositions.find(hash); + if (it != mRecentPositions.end()) + return it->second.second; if (!haveConsensusObject()) return SHAMap::pointer(); return mConsensus->getTransactionTree(hash, false); } +void NetworkOPs::takePosition(int seq, SHAMap::ref position) +{ + mRecentPositions[position->getHash()] = std::make_pair(seq, position); + if (mRecentPositions.size() > 4) + { + std::map >::iterator it = mRecentPositions.begin(); + while (it != mRecentPositions.end()) + { + if (it->second.first < (seq - 2)) + { + mRecentPositions.erase(it); + return; + } + ++it; + } + } +} + SMAddNode NetworkOPs::gotTXData(const boost::shared_ptr& peer, const uint256& hash, const std::list& nodeIDs, const std::list< std::vector >& nodeData) { diff --git a/src/cpp/ripple/NetworkOPs.h b/src/cpp/ripple/NetworkOPs.h index fcf77caa90..b3bd97f405 100644 --- a/src/cpp/ripple/NetworkOPs.h +++ b/src/cpp/ripple/NetworkOPs.h @@ -88,6 +88,8 @@ protected: uint32 mLastValidationTime; SerializedValidation::pointer mLastValidation; + // Recent positions taken + std::map > mRecentPositions; // XXX Split into more locks. boost::recursive_mutex mMonitorLock; @@ -209,6 +211,7 @@ public: SMAddNode gotTXData(const boost::shared_ptr& peer, const uint256& hash, const std::list& nodeIDs, const std::list< std::vector >& nodeData); bool recvValidation(const SerializedValidation::pointer& val); + void takePosition(int seq, SHAMap::ref position); SHAMap::pointer getTXMap(const uint256& hash); bool hasTXSet(const boost::shared_ptr& peer, const uint256& set, ripple::TxSetStatus status); void mapComplete(const uint256& hash, SHAMap::ref map);