Merge #13212: Net: Fixed a race condition when disabling the network.
793290f940
Net: Fixed a race condition when disabling the network. (lmanners)
Pull request description:
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
Tree-SHA512: 6d0b7a78ae956358e796efcc034cb532c2e0d824a52ae822a3899eefc7df76327519d1f2d77362c9fddf34ef860abd095d7490d7cc02d0ba7543bf1e8c8f2535
This commit is contained in:
commit
a6f00ce66f
1 changed files with 11 additions and 8 deletions
19
src/net.cpp
19
src/net.cpp
|
@ -1163,6 +1163,17 @@ void CConnman::ThreadSocketHandler()
|
||||||
//
|
//
|
||||||
{
|
{
|
||||||
LOCK(cs_vNodes);
|
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
|
// Disconnect unused nodes
|
||||||
std::vector<CNode*> vNodesCopy = vNodes;
|
std::vector<CNode*> vNodesCopy = vNodes;
|
||||||
for (CNode* pnode : vNodesCopy)
|
for (CNode* pnode : vNodesCopy)
|
||||||
|
@ -2198,14 +2209,6 @@ void CConnman::SetNetworkActive(bool active)
|
||||||
|
|
||||||
fNetworkActive = active;
|
fNetworkActive = active;
|
||||||
|
|
||||||
if (!fNetworkActive) {
|
|
||||||
LOCK(cs_vNodes);
|
|
||||||
// Close sockets to all nodes
|
|
||||||
for (CNode* pnode : vNodes) {
|
|
||||||
pnode->CloseSocketDisconnect();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
uiInterface.NotifyNetworkActiveChanged(fNetworkActive);
|
uiInterface.NotifyNetworkActiveChanged(fNetworkActive);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue