Skip to content

Commit ed463a6

Browse files
UdjinM6panleone
authored andcommitted
Do not hold cs_vNodes in CSigSharesManager::SendMessages() for too long (#2758)
1 parent cd1809f commit ed463a6

File tree

3 files changed

+37
-3
lines changed

3 files changed

+37
-3
lines changed

src/llmq/quorums_signing_shares.cpp

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1048,7 +1048,9 @@ bool CSigSharesManager::SendMessages()
10481048

10491049
bool didSend = false;
10501050

1051-
g_connman->ForEachNode([&](CNode* pnode) {
1051+
std::vector<CNode*> vNodesCopy = g_connman->CopyNodeVector(CConnman::FullyConnectedOnly);
1052+
1053+
for (auto& pnode : vNodesCopy) {
10521054
CNetMsgMaker msgMaker(pnode->GetSendVersion());
10531055

10541056
auto it1 = sigSessionAnnouncements.find(pnode->GetId());
@@ -1133,9 +1135,10 @@ bool CSigSharesManager::SendMessages()
11331135
didSend = true;
11341136
}
11351137
}
1138+
}
11361139

1137-
return true;
1138-
});
1140+
// looped through all nodes, release them
1141+
g_connman->ReleaseNodeVector(vNodesCopy);
11391142

11401143
return didSend;
11411144
}

src/net.cpp

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2791,6 +2791,33 @@ int64_t PoissonNextSend(int64_t nNow, int average_interval_seconds) {
27912791
return nNow + (int64_t)(log1p(GetRand(1ULL << 48) * -0.0000000000000035527136788 /* -1/2^48 */) * average_interval_seconds * -1000000.0 + 0.5);
27922792
}
27932793

2794+
std::vector<CNode*> CConnman::CopyNodeVector(std::function<bool(const CNode* pnode)> cond)
2795+
{
2796+
std::vector<CNode*> vecNodesCopy;
2797+
LOCK(cs_vNodes);
2798+
for (size_t i = 0; i < vNodes.size(); ++i) {
2799+
CNode* pnode = vNodes[i];
2800+
if (!cond(pnode))
2801+
continue;
2802+
pnode->AddRef();
2803+
vecNodesCopy.push_back(pnode);
2804+
}
2805+
return vecNodesCopy;
2806+
}
2807+
2808+
std::vector<CNode*> CConnman::CopyNodeVector()
2809+
{
2810+
return CopyNodeVector(AllNodes);
2811+
}
2812+
2813+
void CConnman::ReleaseNodeVector(const std::vector<CNode*>& vecNodes)
2814+
{
2815+
for (size_t i = 0; i < vecNodes.size(); ++i) {
2816+
CNode* pnode = vecNodes[i];
2817+
pnode->Release();
2818+
}
2819+
}
2820+
27942821
CSipHasher CConnman::GetDeterministicRandomizer(uint64_t id)
27952822
{
27962823
return CSipHasher(nSeed0, nSeed1).Write(id);

src/net.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -280,6 +280,10 @@ class CConnman
280280
post();
281281
};
282282

283+
std::vector<CNode*> CopyNodeVector(std::function<bool(const CNode* pnode)> cond);
284+
std::vector<CNode*> CopyNodeVector();
285+
void ReleaseNodeVector(const std::vector<CNode*>& vecNodes);
286+
283287
// Clears AskFor requests for every known peer
284288
void RemoveAskFor(const uint256& invHash, int invType);
285289

0 commit comments

Comments
 (0)