Skip to content

Commit

Permalink
Net: Fixed a race condition when disabling the network.
Browse files Browse the repository at this point in the history
This change addresses a race condition where setnetworkactive=false wouldn't always disconnect all peers.

Before this change, the following could happen:
1. Thread A -- Begins connecting to a node.
2. Thread B -- Sets kNetworkActive=false and disconnects connected nodes.
3. Thread A -- Finishes connecting and adds node to list of connected nodes.

The node that was connected from Thread A remains connected and active,
even though kNetworkActive=false.

To fix the race, disconnections when kNetworkActive=false are now handled in the main network loop.

fixes #13038
  • Loading branch information
lmanners committed Jun 21, 2018
1 parent 1c58250 commit 793290f
Showing 1 changed file with 11 additions and 8 deletions.
19 changes: 11 additions & 8 deletions src/net.cpp
Expand Up @@ -1163,6 +1163,17 @@ void CConnman::ThreadSocketHandler()
//
{
LOCK(cs_vNodes);

if (!fNetworkActive) {
// Disconnect any connected nodes
for (CNode* pnode : vNodes) {
if (!pnode->fDisconnect) {
LogPrint(BCLog::NET, "Network not active, dropping peer=%d\n", pnode->GetId());
pnode->fDisconnect = true;
}
}
}

// Disconnect unused nodes
std::vector<CNode*> vNodesCopy = vNodes;
for (CNode* pnode : vNodesCopy)
Expand Down Expand Up @@ -2198,14 +2209,6 @@ void CConnman::SetNetworkActive(bool active)

fNetworkActive = active;

if (!fNetworkActive) {
LOCK(cs_vNodes);
// Close sockets to all nodes
for (CNode* pnode : vNodes) {
pnode->CloseSocketDisconnect();
}
}

uiInterface.NotifyNetworkActiveChanged(fNetworkActive);
}

Expand Down

0 comments on commit 793290f

Please sign in to comment.