From 42c7ec79650e9899b498fa760e0218cba32f4c56 Mon Sep 17 00:00:00 2001 From: JoelKatz Date: Mon, 18 Mar 2013 18:07:03 -0700 Subject: [PATCH 1/3] Make sure we maintain cluster connections. --- src/cpp/ripple/ConnectionPool.cpp | 24 ++++++++++++++++++++++-- src/cpp/ripple/ConnectionPool.h | 5 ++++- 2 files changed, 26 insertions(+), 3 deletions(-) diff --git a/src/cpp/ripple/ConnectionPool.cpp b/src/cpp/ripple/ConnectionPool.cpp index 89f0d5548..d17f38885 100644 --- a/src/cpp/ripple/ConnectionPool.cpp +++ b/src/cpp/ripple/ConnectionPool.cpp @@ -209,6 +209,12 @@ void ConnectionPool::policyEnforce() // Enforce policies. policyLowWater(); + if (((++mPhase) % 12) == 0) + { + cLog(lsTRACE) << "Making configured connections"; + makeConfigured(); + } + // Schedule next enforcement. mPolicyTimer.expires_at(boost::posix_time::second_clock::universal_time()+boost::posix_time::seconds(POLICY_INTERVAL_SECONDS)); mPolicyTimer.async_wait(boost::bind(&ConnectionPool::policyHandler, this, _1)); @@ -313,11 +319,11 @@ Peer::pointer ConnectionPool::peerConnect(const std::string& strIp, int iPort) if (ppResult) { ppResult->connect(strIp, iPort); - //cLog(lsINFO) << "Pool: Connecting: " << ADDRESS_SHARED(ppResult) << ": " << strIp << " " << iPort; + cLog(lsTRACE) << "Pool: Connecting: " << ADDRESS_SHARED(ppResult) << ": " << strIp << " " << iPort; } else { - //cLog(lsINFO) << "Pool: Already connected: " << strIp << " " << iPort; + cLog(lsTRACE) << "Pool: Already connected: " << strIp << " " << iPort; } return ppResult; @@ -623,6 +629,20 @@ void ConnectionPool::scanHandler(const boost::system::error_code& ecResult) } } +void ConnectionPool::makeConfigured() +{ + if (theConfig.RUN_STANDALONE) + return; + + BOOST_FOREACH(const std::string& strPeer, theConfig.IPS) + { + std::string strIP; + int iPort; + if (parseIpPort(strPeer, strIP, iPort)) + peerConnect(strIP, iPort); + } +} + // Scan ips as per db entries. void ConnectionPool::scanRefresh() { diff --git a/src/cpp/ripple/ConnectionPool.h b/src/cpp/ripple/ConnectionPool.h index 3d1e3d3a4..45ba2b6e9 100644 --- a/src/cpp/ripple/ConnectionPool.h +++ b/src/cpp/ripple/ConnectionPool.h @@ -18,6 +18,7 @@ class ConnectionPool private: boost::recursive_mutex mPeerLock; uint64 mLastPeer; + int mPhase; typedef std::pair naPeer; typedef std::pair pipPeer; @@ -59,7 +60,7 @@ private: public: ConnectionPool(boost::asio::io_service& io_service) : - mLastPeer(0), mScanTimer(io_service), mPolicyTimer(io_service) + mLastPeer(0), mPhase(0), mScanTimer(io_service), mPolicyTimer(io_service) { ; } // Begin enforcing connection policy. @@ -114,6 +115,8 @@ public: void policyLowWater(); void policyEnforce(); + // configured connections + void makeConfigured(); }; extern void splitIpPort(const std::string& strIpPort, std::string& strIp, int& iPort); From 1fdf27ca7220d0cf774c8d179f759116281ddf18 Mon Sep 17 00:00:00 2001 From: JoelKatz Date: Mon, 18 Mar 2013 21:18:07 -0700 Subject: [PATCH 2/3] Fix bug that causes ledger synching take much more CPU and memory than it should. --- src/cpp/ripple/SHAMapSync.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/cpp/ripple/SHAMapSync.cpp b/src/cpp/ripple/SHAMapSync.cpp index a06f3a471..8d36c8f34 100644 --- a/src/cpp/ripple/SHAMapSync.cpp +++ b/src/cpp/ripple/SHAMapSync.cpp @@ -41,7 +41,7 @@ void SHAMap::getMissingNodes(std::vector& nodeIDs, std::vector SHAMap::getNeededHashes(int max) stack.pop(); int base = rand() % 256; - bool have_all = false; + bool have_all = true; for (int ii = 0; ii < 16; ++ii) { // traverse in semi-random order int branch = (base + ii) % 16; From 5bc7e36df5d7a67ef8b403880f4061101706c513 Mon Sep 17 00:00:00 2001 From: JoelKatz Date: Mon, 18 Mar 2013 21:22:54 -0700 Subject: [PATCH 3/3] Fix the fix. --- src/cpp/ripple/SHAMapSync.cpp | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/cpp/ripple/SHAMapSync.cpp b/src/cpp/ripple/SHAMapSync.cpp index 8d36c8f34..13c482f21 100644 --- a/src/cpp/ripple/SHAMapSync.cpp +++ b/src/cpp/ripple/SHAMapSync.cpp @@ -72,14 +72,17 @@ void SHAMap::getMissingNodes(std::vector& nodeIDs, std::vectorisInner() && !d->isFullBelow()) // we might need children of this node + { + have_all = false; stack.push(d); + } } } if (have_all) @@ -124,7 +127,10 @@ std::vector SHAMap::getNeededHashes(int max) SHAMapTreeNode* d = getNodePointer(childID, childHash); assert(d); if (d->isInner() && !d->isFullBelow()) + { + have_all = false; stack.push(d); + } } catch (SHAMapMissingNode&) { // node is not in the map