From 414a9348a743ac49d07927d43e829fc7e8be5ec7 Mon Sep 17 00:00:00 2001 From: UdjinM6 Date: Thu, 5 Jan 2023 14:45:44 +0300 Subject: [PATCH 1/3] fix: resolve potential deadlock ``` POTENTIAL DEADLOCK DETECTED Previous lock order was: (2) 'cs_main' in governance/governance.cpp:1096 (in thread 'init') (1) 'cs' in governance/governance.cpp:1096 (in thread 'init') Current lock order is: (1) 'cs' in governance/governance.cpp:778 (in thread 'msghand') 'cs' in governance/object.cpp:104 (in thread 'msghand') (2) '::cs_main' in validation.cpp:117 (in thread 'msghand') ``` --- src/governance/governance.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/governance/governance.cpp b/src/governance/governance.cpp index 548a4ad1bab6..d89c220757f1 100644 --- a/src/governance/governance.cpp +++ b/src/governance/governance.cpp @@ -775,6 +775,9 @@ bool CGovernanceManager::MasternodeRateCheck(const CGovernanceObject& govobj, bo bool CGovernanceManager::ProcessVote(CNode* pfrom, const CGovernanceVote& vote, CGovernanceException& exception, CConnman& connman) { + // TODO: drop cs_main here when v19 activation is buried + // and CGovernanceVote::CheckSignature no longer needs to use ::ChainActive() + LOCK(cs_main); ENTER_CRITICAL_SECTION(cs) uint256 nHashVote = vote.GetHash(); uint256 nHashGovobj = vote.GetParentHash(); From a923adaa2f4d0241a2ff4b901344ba845d1607b4 Mon Sep 17 00:00:00 2001 From: UdjinM6 Date: Thu, 5 Jan 2023 20:07:20 +0300 Subject: [PATCH 2/3] fix: another one POTENTIAL DEADLOCK DETECTED Previous lock order was: (2) 'cs_main' in governance/governance.cpp:1099 (in thread 'init') (1) 'cs' in governance/governance.cpp:1099 (in thread 'init') Current lock order is: (1) 'cs' in governance/governance.cpp:584 (in thread 'msghand') (2) '::cs_main' in validation.cpp:117 (in thread 'msghand') --- src/governance/governance.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/governance/governance.cpp b/src/governance/governance.cpp index d89c220757f1..688517359e3f 100644 --- a/src/governance/governance.cpp +++ b/src/governance/governance.cpp @@ -581,7 +581,9 @@ void CGovernanceManager::SyncSingleObjVotes(CNode& peer, const uint256& nProp, c LogPrint(BCLog::GOBJECT, "CGovernanceManager::%s -- syncing single object to peer=%d, nProp = %s\n", __func__, peer.GetId(), nProp.ToString()); - LOCK(cs); + // TODO: drop cs_main here when v19 activation is buried + // and CGovernanceVote::CheckSignature no longer needs to use ::ChainActive() + LOCK2(cs_main, cs); // single valid object and its valid votes auto it = mapObjects.find(nProp); From 631e2285a3bb3d8316d3e47a78f9d46aa9d5b908 Mon Sep 17 00:00:00 2001 From: UdjinM6 Date: Fri, 6 Jan 2023 14:42:53 +0300 Subject: [PATCH 3/3] fix: yet another one --- src/governance/governance.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/governance/governance.cpp b/src/governance/governance.cpp index 688517359e3f..999485156c6a 100644 --- a/src/governance/governance.cpp +++ b/src/governance/governance.cpp @@ -1243,7 +1243,9 @@ void CGovernanceManager::RemoveInvalidVotes() return; } - LOCK(cs); + // TODO: drop cs_main here when v19 activation is buried + // and CGovernanceVote::CheckSignature no longer needs to use ::ChainActive() + LOCK2(cs_main, cs); auto curMNList = deterministicMNManager->GetListAtChainTip(); auto diff = lastMNListForVotingKeys->BuildDiff(curMNList);