Skip to content

Commit 19b9425

Browse files
committed
Do not send dash-specific requests to masternodes before we are fully connected
Open all masternode connections via CConnman::ThreadOpenMasternodeConnections only. Queue requests and process them after some timeout.
1 parent 054abdb commit 19b9425

File tree

7 files changed

+194
-95
lines changed

7 files changed

+194
-95
lines changed

src/masternodeman.cpp

Lines changed: 77 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -740,6 +740,48 @@ std::pair<CService, std::set<uint256> > CMasternodeMan::PopScheduledMnbRequestCo
740740
return std::make_pair(pairFront.first, setResult);
741741
}
742742

743+
void CMasternodeMan::ProcessQueuedMnbRequests(CConnman& connman)
744+
{
745+
std::pair<CService, std::set<uint256> > p = mnodeman.PopScheduledMnbRequestConnection();
746+
if (!(p.first == CService() || p.second.empty())) {
747+
if (connman.IsMasternodeOrDisconnectRequested(p.first)) return;
748+
mnbQueue.push_back(std::make_pair(GetTime(), p));
749+
connman.AddPendingMasternode(p.first);
750+
}
751+
752+
if (!mnbQueue.empty()) {
753+
// wait at least 5 seconds since we tried to open corresponding connection
754+
if (GetTime() - mnbQueue.front().first < 5) {
755+
return;
756+
}
757+
758+
auto request = mnbQueue.front().second;
759+
LogPrint("masternode", "%s -- processing mnb queue for addr=%s\n", __func__, request.first.ToString());
760+
761+
connman.ForNode(request.first, [&](CNode* pnode) {
762+
763+
// compile request vector
764+
std::vector<CInv> vToFetch;
765+
std::set<uint256>::iterator it = request.second.begin();
766+
while(it != request.second.end()) {
767+
if(*it != uint256()) {
768+
vToFetch.push_back(CInv(MSG_MASTERNODE_ANNOUNCE, *it));
769+
LogPrint("masternode", "-- asking for mnb %s from addr=%s\n", it->ToString(), pnode->addr.ToString());
770+
}
771+
++it;
772+
}
773+
774+
// ask for data
775+
CNetMsgMaker msgMaker(pnode->GetSendVersion());
776+
connman.PushMessage(pnode, msgMaker.Make(NetMsgType::GETDATA, vToFetch));
777+
return true;
778+
});
779+
780+
// drop it from the request queue regardless
781+
mnbQueue.pop_front();
782+
LogPrint("masternode", "%s -- mnb queue size: %d\n", __func__, mnbQueue.size());
783+
}
784+
}
743785

744786
void CMasternodeMan::ProcessMessage(CNode* pfrom, const std::string& strCommand, CDataStream& vRecv, CConnman& connman)
745787
{
@@ -1049,25 +1091,45 @@ bool CMasternodeMan::SendVerifyRequest(const CAddress& addr, const std::vector<C
10491091
return false;
10501092
}
10511093

1052-
connman.OpenMasternodeConnection(addr);
1053-
bool fSuccess = connman.ForNode(addr, CConnman::AllNodes, [&](CNode* pnode){
1054-
netfulfilledman.AddFulfilledRequest(addr, strprintf("%s", NetMsgType::MNVERIFY)+"-request");
1055-
// use random nonce, store it and require node to reply with correct one later
1056-
CMasternodeVerification mnv(addr, GetRandInt(999999), nCachedBlockHeight - 1);
1057-
mWeAskedForVerification[addr] = mnv;
1058-
LogPrintf("CMasternodeMan::SendVerifyRequest -- verifying node using nonce %d addr=%s\n", mnv.nonce, addr.ToString());
1059-
CNetMsgMaker msgMaker(pnode->GetSendVersion()); // TODO this gives a warning about version not being set (we should wait for VERSION exchange)
1060-
connman.PushMessage(pnode, msgMaker.Make(NetMsgType::MNVERIFY, mnv));
1061-
return true;
1062-
});
1063-
if (!fSuccess) {
1064-
LogPrintf("CMasternodeMan::SendVerifyRequest -- can't connect to node to verify it, addr=%s\n", addr.ToString());
1065-
return false;
1066-
}
1094+
if (connman.IsMasternodeOrDisconnectRequested(addr)) return false;
10671095

1096+
connman.AddPendingMasternode(addr);
1097+
// use random nonce, store it and require node to reply with correct one later
1098+
CMasternodeVerification mnv(addr, GetRandInt(999999), nCachedBlockHeight - 1);
1099+
LOCK(cs_mnvQueue);
1100+
mnvQueue.push_back(std::make_pair(GetTime(), std::make_pair(addr, mnv)));
1101+
LogPrintf("CMasternodeMan::SendVerifyRequest -- verifying node using nonce %d addr=%s\n", mnv.nonce, addr.ToString());
10681102
return true;
10691103
}
10701104

1105+
void CMasternodeMan::ProcessQueuedMnvRequests(CConnman& connman)
1106+
{
1107+
LOCK(cs_mnvQueue);
1108+
1109+
if (!mnvQueue.empty()) {
1110+
// wait at least 5 seconds since we tried to open corresponding connection
1111+
if (GetTime() - mnvQueue.front().first < 5) {
1112+
return;
1113+
}
1114+
1115+
auto request = mnvQueue.front().second;
1116+
LogPrint("masternode", "CMasternodeMan::%s -- processing mnv queue for addr=%s\n", __func__, request.first.ToString());
1117+
1118+
connman.ForNode(request.first, [&](CNode* pnode) {
1119+
netfulfilledman.AddFulfilledRequest(pnode->addr, strprintf("%s", NetMsgType::MNVERIFY)+"-request");
1120+
// use random nonce, store it and require node to reply with correct one later
1121+
mWeAskedForVerification[pnode->addr] = request.second;
1122+
LogPrint("masternode", "-- verifying node using nonce %d addr=%s\n", request.second.nonce, pnode->addr.ToString());
1123+
CNetMsgMaker msgMaker(pnode->GetSendVersion()); // TODO this gives a warning about version not being set (we should wait for VERSION exchange)
1124+
connman.PushMessage(pnode, msgMaker.Make(NetMsgType::MNVERIFY, request.second));
1125+
return true;
1126+
});
1127+
1128+
mnvQueue.pop_front();
1129+
LogPrint("masternode", "CMasternodeMan::%s -- mnv queue size: %d\n", __func__, mnvQueue.size());
1130+
}
1131+
}
1132+
10711133
void CMasternodeMan::SendVerifyReply(CNode* pnode, CMasternodeVerification& mnv, CConnman& connman)
10721134
{
10731135
// only masternodes can sign this, why would someone ask regular node?

src/masternodeman.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,9 @@ class CMasternodeMan
6363
std::map<uint256, std::pair< int64_t, std::set<CNetAddr> > > mMnbRecoveryRequests;
6464
std::map<uint256, std::vector<CMasternodeBroadcast> > mMnbRecoveryGoodReplies;
6565
std::list< std::pair<CService, uint256> > listScheduledMnbRequestConnections;
66+
std::deque<std::pair<int64_t, std::pair<CService, std::set<uint256> > > > mnbQueue;
67+
std::deque<std::pair<int64_t, std::pair<CService, CMasternodeVerification > > > mnvQueue;
68+
CCriticalSection cs_mnvQueue;
6669

6770
/// Set when masternodes are added, cleared when CGovernanceManager is notified
6871
bool fMasternodesAdded;
@@ -180,12 +183,14 @@ class CMasternodeMan
180183

181184
void ProcessMasternodeConnections(CConnman& connman);
182185
std::pair<CService, std::set<uint256> > PopScheduledMnbRequestConnection();
186+
void ProcessQueuedMnbRequests(CConnman& connman);
183187

184188
void ProcessMessage(CNode* pfrom, const std::string& strCommand, CDataStream& vRecv, CConnman& connman);
185189

186190
void DoFullVerificationStep(CConnman& connman);
187191
void CheckSameAddr();
188192
bool SendVerifyRequest(const CAddress& addr, const std::vector<CMasternode*>& vSortedByAddr, CConnman& connman);
193+
void ProcessQueuedMnvRequests(CConnman& connman);
189194
void SendVerifyReply(CNode* pnode, CMasternodeVerification& mnv, CConnman& connman);
190195
void ProcessVerifyReply(CNode* pnode, CMasternodeVerification& mnv);
191196
void ProcessVerifyBroadcast(CNode* pnode, const CMasternodeVerification& mnv);

src/net.cpp

Lines changed: 30 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1900,7 +1900,7 @@ void CConnman::ThreadOpenAddedConnections()
19001900
}
19011901
}
19021902

1903-
void CConnman::ThreadMnbRequestConnections()
1903+
void CConnman::ThreadOpenMasternodeConnections()
19041904
{
19051905
// Connecting to specific addresses, no masternode connections available
19061906
if (IsArgSet("-connect") && mapMultiArgs.at("-connect").size() > 0)
@@ -1915,34 +1915,22 @@ void CConnman::ThreadMnbRequestConnections()
19151915
if (interruptNet)
19161916
return;
19171917

1918-
std::pair<CService, std::set<uint256> > p = mnodeman.PopScheduledMnbRequestConnection();
1919-
if(p.first == CService() || p.second.empty()) continue;
1920-
1921-
// compile request vector
1922-
std::vector<CInv> vToFetch;
1923-
std::set<uint256>::iterator it = p.second.begin();
1924-
while(it != p.second.end()) {
1925-
if(*it != uint256()) {
1926-
vToFetch.push_back(CInv(MSG_MASTERNODE_ANNOUNCE, *it));
1927-
LogPrint("masternode", "ThreadMnbRequestConnections -- asking for mnb %s from addr=%s\n", it->ToString(), p.first.ToString());
1918+
LOCK(cs_vPendingMasternodes);
1919+
std::vector<CService>::iterator it = vPendingMasternodes.begin();
1920+
while (it != vPendingMasternodes.end()) {
1921+
if (!IsMasternodeOrDisconnectRequested(*it)) {
1922+
OpenMasternodeConnection(CAddress(*it, NODE_NETWORK));
1923+
// should be in the list now if connection was opened
1924+
ForNode(*it, CConnman::AllNodes, [&](CNode* pnode) {
1925+
if (pnode->fDisconnect) {
1926+
return false;
1927+
}
1928+
grant.MoveTo(pnode->grantMasternodeOutbound);
1929+
return true;
1930+
});
19281931
}
1929-
++it;
1932+
it = vPendingMasternodes.erase(it);
19301933
}
1931-
1932-
CAddress addr(p.first, NODE_NETWORK);
1933-
OpenMasternodeConnection(addr);
1934-
1935-
ForNode(addr, CConnman::AllNodes, [&](CNode* pnode) {
1936-
if (pnode->fDisconnect) return false;
1937-
1938-
grant.MoveTo(pnode->grantMasternodeOutbound);
1939-
1940-
// ask for data
1941-
CNetMsgMaker msgMaker(pnode->GetSendVersion());
1942-
PushMessage(pnode, msgMaker.Make(NetMsgType::GETDATA, vToFetch));
1943-
1944-
return true;
1945-
});
19461934
}
19471935
}
19481936

@@ -2333,7 +2321,7 @@ bool CConnman::Start(CScheduler& scheduler, std::string& strNodeError, Options c
23332321
threadOpenConnections = std::thread(&TraceThread<std::function<void()> >, "opencon", std::function<void()>(std::bind(&CConnman::ThreadOpenConnections, this)));
23342322

23352323
// Initiate masternode connections
2336-
threadMnbRequestConnections = std::thread(&TraceThread<std::function<void()> >, "mnbcon", std::function<void()>(std::bind(&CConnman::ThreadMnbRequestConnections, this)));
2324+
threadOpenMasternodeConnections = std::thread(&TraceThread<std::function<void()> >, "mncon", std::function<void()>(std::bind(&CConnman::ThreadOpenMasternodeConnections, this)));
23372325

23382326
// Process messages
23392327
threadMessageHandler = std::thread(&TraceThread<std::function<void()> >, "msghand", std::function<void()>(std::bind(&CConnman::ThreadMessageHandler, this)));
@@ -2387,8 +2375,8 @@ void CConnman::Stop()
23872375
{
23882376
if (threadMessageHandler.joinable())
23892377
threadMessageHandler.join();
2390-
if (threadMnbRequestConnections.joinable())
2391-
threadMnbRequestConnections.join();
2378+
if (threadOpenMasternodeConnections.joinable())
2379+
threadOpenMasternodeConnections.join();
23922380
if (threadOpenConnections.joinable())
23932381
threadOpenConnections.join();
23942382
if (threadOpenAddedConnections.joinable())
@@ -2508,6 +2496,18 @@ bool CConnman::RemoveAddedNode(const std::string& strNode)
25082496
return false;
25092497
}
25102498

2499+
bool CConnman::AddPendingMasternode(const CService& service)
2500+
{
2501+
LOCK(cs_vPendingMasternodes);
2502+
for(std::vector<CService>::const_iterator it = vPendingMasternodes.begin(); it != vPendingMasternodes.end(); ++it) {
2503+
if (service == *it)
2504+
return false;
2505+
}
2506+
2507+
vPendingMasternodes.push_back(service);
2508+
return true;
2509+
}
2510+
25112511
size_t CConnman::GetNodeCount(NumConnections flags)
25122512
{
25132513
LOCK(cs_vNodes);

src/net.h

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -348,6 +348,7 @@ class CConnman
348348

349349
bool AddNode(const std::string& node);
350350
bool RemoveAddedNode(const std::string& node);
351+
bool AddPendingMasternode(const CService& addr);
351352
std::vector<AddedNodeInfo> GetAddedNodeInfo();
352353

353354
size_t GetNodeCount(NumConnections num);
@@ -409,7 +410,7 @@ class CConnman
409410
void AcceptConnection(const ListenSocket& hListenSocket);
410411
void ThreadSocketHandler();
411412
void ThreadDNSAddressSeed();
412-
void ThreadMnbRequestConnections();
413+
void ThreadOpenMasternodeConnections();
413414

414415
uint64_t CalculateKeyedNetGroup(const CAddress& ad) const;
415416

@@ -475,6 +476,8 @@ class CConnman
475476
CCriticalSection cs_vOneShots;
476477
std::vector<std::string> vAddedNodes;
477478
CCriticalSection cs_vAddedNodes;
479+
std::vector<CService> vPendingMasternodes;
480+
CCriticalSection cs_vPendingMasternodes;
478481
std::vector<CNode*> vNodes;
479482
std::list<CNode*> vNodesDisconnected;
480483
mutable CCriticalSection cs_vNodes;
@@ -512,7 +515,7 @@ class CConnman
512515
std::thread threadSocketHandler;
513516
std::thread threadOpenAddedConnections;
514517
std::thread threadOpenConnections;
515-
std::thread threadMnbRequestConnections;
518+
std::thread threadOpenMasternodeConnections;
516519
std::thread threadMessageHandler;
517520
};
518521
extern std::unique_ptr<CConnman> g_connman;

0 commit comments

Comments
 (0)