Skip to content

Commit 035a841

Browse files
committed
Try to properly disconnect and delete nodes on shutdown
1 parent 5b4fe43 commit 035a841

File tree

2 files changed

+28
-20
lines changed

2 files changed

+28
-20
lines changed

src/net.cpp

Lines changed: 27 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1240,28 +1240,24 @@ void CConnman::AcceptConnection(const ListenSocket& hListenSocket) {
12401240
}
12411241
}
12421242

1243-
void CConnman::ThreadSocketHandler()
1244-
{
1245-
unsigned int nPrevNodeCount = 0;
1246-
while (!interruptNet)
1243+
void CConnman::DisconnectAndDeleteNodes(bool fDisconectAll)
12471244
{
12481245
//
12491246
// Disconnect nodes
12501247
//
12511248
{
12521249
LOCK(cs_vNodes);
1253-
// Disconnect unused nodes
12541250
std::vector<CNode*> vNodesCopy = vNodes;
12551251
for (CNode* pnode : vNodesCopy)
12561252
{
1257-
if (pnode->fDisconnect)
1253+
if (pnode->fDisconnect || fDisconectAll)
12581254
{
12591255
if (fLogIPs) {
1260-
LogPrintf("ThreadSocketHandler -- removing node: peer=%d addr=%s nRefCount=%d fInbound=%d fMasternode=%d\n",
1261-
pnode->GetId(), pnode->addr.ToString(), pnode->GetRefCount(), pnode->fInbound, pnode->fMasternode);
1256+
LogPrintf("%s -- removing node: peer=%d addr=%s nRefCount=%d fInbound=%d fMasternode=%d\n",
1257+
__func__, pnode->GetId(), pnode->addr.ToString(), pnode->GetRefCount(), pnode->fInbound, pnode->fMasternode);
12621258
} else {
1263-
LogPrintf("ThreadSocketHandler -- removing node: peer=%d nRefCount=%d fInbound=%d fMasternode=%d\n",
1264-
pnode->GetId(), pnode->GetRefCount(), pnode->fInbound, pnode->fMasternode);
1259+
LogPrintf("%s -- removing node: peer=%d nRefCount=%d fInbound=%d fMasternode=%d\n",
1260+
__func__, pnode->GetId(), pnode->GetRefCount(), pnode->fInbound, pnode->fMasternode);
12651261
}
12661262

12671263
// remove from vNodes
@@ -1280,7 +1276,6 @@ void CConnman::ThreadSocketHandler()
12801276
}
12811277
}
12821278
}
1283-
{
12841279
// Delete disconnected nodes
12851280
std::list<CNode*> vNodesDisconnectedCopy = vNodesDisconnected;
12861281
for (CNode* pnode : vNodesDisconnectedCopy)
@@ -1304,6 +1299,15 @@ void CConnman::ThreadSocketHandler()
13041299
}
13051300
}
13061301
}
1302+
1303+
void CConnman::ThreadSocketHandler()
1304+
{
1305+
unsigned int nPrevNodeCount = 0;
1306+
while (!interruptNet)
1307+
{
1308+
// Disconnect unused nodes
1309+
DisconnectAndDeleteNodes(false);
1310+
13071311
size_t vNodesSize;
13081312
{
13091313
LOCK(cs_vNodes);
@@ -2735,21 +2739,24 @@ void CConnman::Stop()
27352739
fAddressesInitialized = false;
27362740
}
27372741

2742+
// Try to disconnect and delete all nodes
2743+
// TODO: it looks like smth is holding nodes sometimes not releasing references properly,
2744+
// so we only try a few times here (cause otherwise we might end up waiting forever).
2745+
for (int i = 0; i < 10; ++i) {
2746+
DisconnectAndDeleteNodes(true);
2747+
if (vNodesDisconnected.empty()) {
2748+
// All nodes were disconected and deleted, no need to loop any further
2749+
break;
2750+
}
2751+
MilliSleep(100);
2752+
}
2753+
27382754
// Close sockets
2739-
for (CNode* pnode : vNodes)
2740-
pnode->CloseSocketDisconnect();
27412755
for (ListenSocket& hListenSocket : vhListenSocket)
27422756
if (hListenSocket.socket != INVALID_SOCKET)
27432757
if (!CloseSocket(hListenSocket.socket))
27442758
LogPrintf("CloseSocket(hListenSocket) failed with error %s\n", NetworkErrorString(WSAGetLastError()));
27452759

2746-
// clean up some globals (to help leak detection)
2747-
for (CNode *pnode : vNodes) {
2748-
DeleteNode(pnode);
2749-
}
2750-
for (CNode *pnode : vNodesDisconnected) {
2751-
DeleteNode(pnode);
2752-
}
27532760
vNodes.clear();
27542761
vNodesDisconnected.clear();
27552762
vhListenSocket.clear();

src/net.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -470,6 +470,7 @@ class CConnman
470470
void ThreadOpenConnections(std::vector<std::string> connect);
471471
void ThreadMessageHandler();
472472
void AcceptConnection(const ListenSocket& hListenSocket);
473+
void DisconnectAndDeleteNodes(bool fDisconectAll);
473474
void ThreadSocketHandler();
474475
void ThreadDNSAddressSeed();
475476
void ThreadOpenMasternodeConnections();

0 commit comments

Comments
 (0)