From b84afb251291f72efaf46c8dc4860225ba30d88a Mon Sep 17 00:00:00 2001 From: Alexander Block Date: Mon, 22 Jan 2018 14:17:11 +0100 Subject: [PATCH] Allow to filter for fully connected nodes when calling CopyNodeVector (#1864) And use this where needed. This avoids warnings about unset version fields and is also generally a good thing (we really should only communicate with nodes we know are good) --- src/governance.cpp | 2 +- src/masternode-sync.cpp | 4 ++-- src/masternodeman.cpp | 2 +- src/net.cpp | 9 ++++++++- src/net.h | 1 + src/privatesend-client.cpp | 4 ++-- src/privatesend.cpp | 2 +- 7 files changed, 16 insertions(+), 8 deletions(-) diff --git a/src/governance.cpp b/src/governance.cpp index 86242a84a6045..0301756454726 100644 --- a/src/governance.cpp +++ b/src/governance.cpp @@ -1363,7 +1363,7 @@ void CGovernanceManager::UpdatedBlockTip(const CBlockIndex *pindex, CConnman& co void CGovernanceManager::RequestOrphanObjects(CConnman& connman) { - std::vector vNodesCopy = connman.CopyNodeVector(); + std::vector vNodesCopy = connman.CopyNodeVector(CConnman::FullyConnectedOnly); std::vector vecHashesFiltered; { diff --git a/src/masternode-sync.cpp b/src/masternode-sync.cpp index 3e921d5d1bb2b..aeecd8c3ec6ff 100644 --- a/src/masternode-sync.cpp +++ b/src/masternode-sync.cpp @@ -179,7 +179,7 @@ void CMasternodeSync::ProcessTick(CConnman& connman) // gradually request the rest of the votes after sync finished if(IsSynced()) { - std::vector vNodesCopy = connman.CopyNodeVector(); + std::vector vNodesCopy = connman.CopyNodeVector(CConnman::FullyConnectedOnly); governance.RequestGovernanceObjectVotes(vNodesCopy, connman); connman.ReleaseNodeVector(vNodesCopy); return; @@ -190,7 +190,7 @@ void CMasternodeSync::ProcessTick(CConnman& connman) LogPrintf("CMasternodeSync::ProcessTick -- nTick %d nRequestedMasternodeAssets %d nRequestedMasternodeAttempt %d nSyncProgress %f\n", nTick, nRequestedMasternodeAssets, nRequestedMasternodeAttempt, nSyncProgress); uiInterface.NotifyAdditionalDataSyncProgressChanged(nSyncProgress); - std::vector vNodesCopy = connman.CopyNodeVector(); + std::vector vNodesCopy = connman.CopyNodeVector(CConnman::FullyConnectedOnly); BOOST_FOREACH(CNode* pnode, vNodesCopy) { diff --git a/src/masternodeman.cpp b/src/masternodeman.cpp index cfa183d165043..b89284cf86dd9 100644 --- a/src/masternodeman.cpp +++ b/src/masternodeman.cpp @@ -1056,7 +1056,7 @@ bool CMasternodeMan::SendVerifyRequest(const CAddress& addr, const std::vectorGetSendVersion()); + CNetMsgMaker msgMaker(pnode->GetSendVersion()); // TODO this gives a warning about version not being set (we should wait for VERSION exchange) connman.PushMessage(pnode, msgMaker.Make(NetMsgType::MNVERIFY, mnv)); return true; }); diff --git a/src/net.cpp b/src/net.cpp index 49f5899d361df..b1f1ee14ccf21 100644 --- a/src/net.cpp +++ b/src/net.cpp @@ -2841,18 +2841,25 @@ int64_t PoissonNextSend(int64_t nNow, int average_interval_seconds) { return nNow + (int64_t)(log1p(GetRand(1ULL << 48) * -0.0000000000000035527136788 /* -1/2^48 */) * average_interval_seconds * -1000000.0 + 0.5); } -std::vector CConnman::CopyNodeVector() +std::vector CConnman::CopyNodeVector(std::function cond) { std::vector vecNodesCopy; LOCK(cs_vNodes); for(size_t i = 0; i < vNodes.size(); ++i) { CNode* pnode = vNodes[i]; + if (!cond(pnode)) + continue; pnode->AddRef(); vecNodesCopy.push_back(pnode); } return vecNodesCopy; } +std::vector CConnman::CopyNodeVector() +{ + return CopyNodeVector(AllNodes); +} + void CConnman::ReleaseNodeVector(const std::vector& vecNodes) { LOCK(cs_vNodes); diff --git a/src/net.h b/src/net.h index f32b1f36aa94f..606b7808f2835 100644 --- a/src/net.h +++ b/src/net.h @@ -303,6 +303,7 @@ class CConnman ForEachNodeThen(FullyConnectedOnly, pre, post); } + std::vector CopyNodeVector(std::function cond); std::vector CopyNodeVector(); void ReleaseNodeVector(const std::vector& vecNodes); diff --git a/src/privatesend-client.cpp b/src/privatesend-client.cpp index 4bc0b8348e4c3..5f62c0bbf354f 100644 --- a/src/privatesend-client.cpp +++ b/src/privatesend-client.cpp @@ -889,7 +889,7 @@ bool CPrivateSendClient::JoinExistingQueue(CAmount nBalanceNeedsAnonymized, CCon infoMixingMasternode = infoMn; nSessionDenom = dsq.nDenom; - CNetMsgMaker msgMaker(pnode->GetSendVersion()); + CNetMsgMaker msgMaker(pnode->GetSendVersion()); // TODO this gives a warning about version not being set (we should wait for VERSION exchange) connman.PushMessage(pnode, msgMaker.Make(NetMsgType::DSACCEPT, nSessionDenom, txMyCollateral)); LogPrintf("CPrivateSendClient::JoinExistingQueue -- connected (from queue), sending DSACCEPT: nSessionDenom: %d (%s), addr=%s\n", nSessionDenom, CPrivateSend::GetDenominationsToString(nSessionDenom), pnode->addr.ToString()); @@ -963,7 +963,7 @@ bool CPrivateSendClient::StartNewQueue(CAmount nValueMin, CAmount nBalanceNeedsA nSessionDenom = CPrivateSend::GetDenominationsByAmounts(vecAmounts); } - CNetMsgMaker msgMaker(pnode->GetSendVersion()); + CNetMsgMaker msgMaker(pnode->GetSendVersion()); // TODO this gives a warning about version not being set (we should wait for VERSION exchange) connman.PushMessage(pnode, msgMaker.Make(NetMsgType::DSACCEPT, nSessionDenom, txMyCollateral)); LogPrintf("CPrivateSendClient::StartNewQueue -- connected, sending DSACCEPT, nSessionDenom: %d (%s)\n", nSessionDenom, CPrivateSend::GetDenominationsToString(nSessionDenom)); diff --git a/src/privatesend.cpp b/src/privatesend.cpp index 845cfc6610ba1..065cebd02cf58 100644 --- a/src/privatesend.cpp +++ b/src/privatesend.cpp @@ -65,7 +65,7 @@ bool CDarksendQueue::CheckSignature(const CPubKey& pubKeyMasternode) bool CDarksendQueue::Relay(CConnman& connman) { - std::vector vNodesCopy = connman.CopyNodeVector(); + std::vector vNodesCopy = connman.CopyNodeVector(CConnman::FullyConnectedOnly); BOOST_FOREACH(CNode* pnode, vNodesCopy) { CNetMsgMaker msgMaker(pnode->GetSendVersion()); if (pnode->nVersion >= MIN_PRIVATESEND_PEER_PROTO_VERSION)