From 3a673654b637220fa3f113ed19797524172a4b84 Mon Sep 17 00:00:00 2001 From: JoelKatz Date: Thu, 27 Dec 2012 16:54:11 -0800 Subject: [PATCH 1/3] Make sure clients get the initial load information. --- src/cpp/ripple/NetworkOPs.cpp | 3 +++ src/cpp/ripple/RPCHandler.cpp | 1 - 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/cpp/ripple/NetworkOPs.cpp b/src/cpp/ripple/NetworkOPs.cpp index d21e225bb..04553a1e8 100644 --- a/src/cpp/ripple/NetworkOPs.cpp +++ b/src/cpp/ripple/NetworkOPs.cpp @@ -1444,6 +1444,9 @@ bool NetworkOPs::subServer(InfoSub* ispListener, Json::Value& jvResult) getRand(uRandom.begin(), uRandom.size()); jvResult["random"] = uRandom.ToString(); + jvResult["server_status"] = mNetOps->strOperatingMode(); + jvObj["load_base"] = theApp->getFeeTrack().getLoadBase(); + jvObj["load_fee"] = theApp->getFeeTrack().getLoadFactor(); return mSubServer.insert(ispListener).second; } 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") { From 9f072fcac641eaa6e9827e351a4dd3e730e5995a Mon Sep 17 00:00:00 2001 From: JoelKatz Date: Thu, 27 Dec 2012 16:55:49 -0800 Subject: [PATCH 2/3] Fixes. --- src/cpp/ripple/NetworkOPs.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/cpp/ripple/NetworkOPs.cpp b/src/cpp/ripple/NetworkOPs.cpp index 04553a1e8..110479377 100644 --- a/src/cpp/ripple/NetworkOPs.cpp +++ b/src/cpp/ripple/NetworkOPs.cpp @@ -1443,10 +1443,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["server_status"] = mNetOps->strOperatingMode(); - jvObj["load_base"] = theApp->getFeeTrack().getLoadBase(); - jvObj["load_fee"] = theApp->getFeeTrack().getLoadFactor(); + 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; } From a169167030c0acd5374c30c2b28f6280a50167b5 Mon Sep 17 00:00:00 2001 From: JoelKatz Date: Thu, 27 Dec 2012 20:25:12 -0800 Subject: [PATCH 3/3] Fix a bug where a node doesn't get a chance to finish acquiring a TX set before all nodes forget it because they're done with it, leaving a node behind the consensus. --- src/cpp/ripple/LedgerConsensus.cpp | 4 +++- src/cpp/ripple/NetworkOPs.cpp | 21 +++++++++++++++++++++ src/cpp/ripple/NetworkOPs.h | 3 +++ 3 files changed, 27 insertions(+), 1 deletion(-) 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 110479377..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) { 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);