From e6991eabab76c961a2060466d1566c39d4b1e022 Mon Sep 17 00:00:00 2001 From: UdjinM6 Date: Sun, 7 Apr 2019 21:36:01 +0300 Subject: [PATCH 1/3] Fix crash in RemoveInvalidVotes() Caused by lock not being held while accessing lastMNListForVotingKeys when RemoveInvalidVotes() is called from DoMaintenance() and UpdatedBlockTip() at the same time. --- src/governance.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/governance.cpp b/src/governance.cpp index 7017231a6f372..364aec02136fd 100644 --- a/src/governance.cpp +++ b/src/governance.cpp @@ -1330,11 +1330,11 @@ void CGovernanceManager::CleanOrphanObjects() void CGovernanceManager::RemoveInvalidVotes() { + LOCK(cs); + auto curMNList = deterministicMNManager->GetListAtChainTip(); auto diff = lastMNListForVotingKeys.BuildDiff(curMNList); - LOCK(cs); - std::vector changedKeyMNs; for (const auto& p : diff.updatedMNs) { auto oldDmn = lastMNListForVotingKeys.GetMN(p.first); From 4206ec843590848816cce3441f182bb80fc9aded Mon Sep 17 00:00:00 2001 From: UdjinM6 Date: Sun, 7 Apr 2019 21:45:15 +0300 Subject: [PATCH 2/3] No need to call RemoveInvalidVotes() from DoMaintenance() MN list only changes on new blocks and we already call RemoveInvalidVotes() from UpdatedBlockTip() --- src/governance.cpp | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/governance.cpp b/src/governance.cpp index 364aec02136fd..4c5396d354ef5 100644 --- a/src/governance.cpp +++ b/src/governance.cpp @@ -557,10 +557,6 @@ void CGovernanceManager::DoMaintenance(CConnman& connman) { if (fLiteMode || !masternodeSync.IsSynced() || ShutdownRequested()) return; - if (deterministicMNManager->IsDIP3Enforced()) { - RemoveInvalidVotes(); - } - // CHECK OBJECTS WE'VE ASKED FOR, REMOVE OLD ENTRIES CleanOrphanObjects(); From add7eb9d350ceb93dcaed614766c1179e805d41f Mon Sep 17 00:00:00 2001 From: UdjinM6 Date: Sun, 7 Apr 2019 21:50:47 +0300 Subject: [PATCH 3/3] No need to call RemoveInvalidVotes() until we are fully synced --- src/governance.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/governance.cpp b/src/governance.cpp index 4c5396d354ef5..5ce8ac5ee48e9 100644 --- a/src/governance.cpp +++ b/src/governance.cpp @@ -1326,6 +1326,10 @@ void CGovernanceManager::CleanOrphanObjects() void CGovernanceManager::RemoveInvalidVotes() { + if (!masternodeSync.IsSynced()) { + return; + } + LOCK(cs); auto curMNList = deterministicMNManager->GetListAtChainTip();