diff --git a/src/cpp/ripple/LedgerConsensus.cpp b/src/cpp/ripple/LedgerConsensus.cpp index 9524c4c2a..063326912 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 d21e225bb..270779883 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) { @@ -1443,7 +1464,10 @@ bool NetworkOPs::subServer(InfoSub* ispListener, Json::Value& jvResult) jvResult["stand_alone"] = theConfig.RUN_STANDALONE; getRand(uRandom.begin(), uRandom.size()); - jvResult["random"] = uRandom.ToString(); + jvResult["random"] = uRandom.ToString(); + jvResult["server_status"] = strOperatingMode(); + jvResult["load_base"] = theApp->getFeeTrack().getLoadBase(); + jvResult["load_fee"] = theApp->getFeeTrack().getLoadFactor(); return mSubServer.insert(ispListener).second; } diff --git a/src/cpp/ripple/NetworkOPs.h b/src/cpp/ripple/NetworkOPs.h index fcf77caa9..b3bd97f40 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); diff --git a/src/cpp/ripple/RPCHandler.cpp b/src/cpp/ripple/RPCHandler.cpp index 280ad703e..25deb2cfa 100644 --- a/src/cpp/ripple/RPCHandler.cpp +++ b/src/cpp/ripple/RPCHandler.cpp @@ -2151,7 +2151,6 @@ Json::Value RPCHandler::doSubscribe(Json::Value jvRequest) if(streamName=="server") { mNetOps->subServer(mInfoSub, jvResult); - jvResult["server_status"] = mNetOps->strOperatingMode(); } else if(streamName=="ledger") {