Skip to content

Commit df589c7

Browse files
committed
governance: introduce task for relaying governance objects
1 parent 3811924 commit df589c7

File tree

11 files changed

+72
-60
lines changed

11 files changed

+72
-60
lines changed

src/dsnotificationinterface.cpp

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,15 +24,13 @@
2424
CDSNotificationInterface::CDSNotificationInterface(CConnman& connman,
2525
CMasternodeSync& mn_sync,
2626
CGovernanceManager& govman,
27-
PeerManager& peerman,
2827
const ChainstateManager& chainman,
2928
const std::unique_ptr<CDeterministicMNManager>& dmnman,
3029
const std::unique_ptr<LLMQContext>& llmq_ctx,
3130
const std::unique_ptr<CJContext>& cj_ctx)
3231
: m_connman(connman),
3332
m_mn_sync(mn_sync),
3433
m_govman(govman),
35-
m_peerman(peerman),
3634
m_chainman(chainman),
3735
m_dmnman(dmnman),
3836
m_llmq_ctx(llmq_ctx),
@@ -92,7 +90,7 @@ void CDSNotificationInterface::UpdatedBlockTip(const CBlockIndex *pindexNew, con
9290
m_llmq_ctx->qdkgsman->UpdatedBlockTip(pindexNew, fInitialDownload);
9391

9492
if (m_govman.IsValid()) {
95-
m_govman.UpdatedBlockTip(pindexNew, m_peerman);
93+
m_govman.UpdatedBlockTip(pindexNew);
9694
}
9795
}
9896

src/dsnotificationinterface.h

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@ class CDeterministicMNManager;
1212
class CGovernanceManager;
1313
class ChainstateManager;
1414
class CMasternodeSync;
15-
class PeerManager;
1615
struct CJContext;
1716
struct LLMQContext;
1817

@@ -22,7 +21,6 @@ class CDSNotificationInterface : public CValidationInterface
2221
explicit CDSNotificationInterface(CConnman& connman,
2322
CMasternodeSync& mn_sync,
2423
CGovernanceManager& govman,
25-
PeerManager& peerman,
2624
const ChainstateManager& chainman,
2725
const std::unique_ptr<CDeterministicMNManager>& dmnman,
2826
const std::unique_ptr<LLMQContext>& llmq_ctx,
@@ -50,7 +48,6 @@ class CDSNotificationInterface : public CValidationInterface
5048
CConnman& m_connman;
5149
CMasternodeSync& m_mn_sync;
5250
CGovernanceManager& m_govman;
53-
PeerManager& m_peerman;
5451
const ChainstateManager& m_chainman;
5552
const std::unique_ptr<CDeterministicMNManager>& m_dmnman;
5653
const std::unique_ptr<LLMQContext>& m_llmq_ctx;

src/governance/governance.cpp

Lines changed: 38 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
#include <spork.h>
2424
#include <timedata.h>
2525
#include <util/ranges.h>
26+
#include <util/thread.h>
2627
#include <util/time.h>
2728
#include <validation.h>
2829

@@ -87,6 +88,22 @@ CGovernanceManager::~CGovernanceManager()
8788
m_db->Store(*this);
8889
}
8990

91+
void CGovernanceManager::Schedule(CScheduler& scheduler, PeerManager& peerman)
92+
{
93+
assert(IsValid());
94+
95+
scheduler.scheduleEvery(
96+
[this, &peerman]() -> void {
97+
LOCK(cs_relay);
98+
for (const auto& inv : m_relay_invs) {
99+
peerman.RelayInv(inv);
100+
}
101+
m_relay_invs.clear();
102+
},
103+
// Tests need tighter timings to avoid timeouts, use more relaxed pacing otherwise
104+
Params().IsMockableChain() ? std::chrono::seconds{1} : std::chrono::seconds{5});
105+
}
106+
90107
bool CGovernanceManager::LoadCache(bool load_cache)
91108
{
92109
assert(m_db != nullptr);
@@ -98,18 +115,18 @@ bool CGovernanceManager::LoadCache(bool load_cache)
98115
return is_valid;
99116
}
100117

101-
void CGovernanceManager::RelayMessage(PeerManager& peerman, const CGovernanceObject& obj) const
118+
void CGovernanceManager::RelayObject(const CGovernanceObject& obj)
102119
{
103120
if (!m_mn_sync.IsSynced()) {
104121
LogPrint(BCLog::GOBJECT, "%s -- won't relay until fully synced\n", __func__);
105122
return;
106123
}
107124

108-
CInv inv(MSG_GOVERNANCE_OBJECT, obj.GetHash());
109-
peerman.RelayInv(inv);
125+
LOCK(cs_relay);
126+
m_relay_invs.emplace_back(MSG_GOVERNANCE_OBJECT, obj.GetHash());
110127
}
111128

112-
void CGovernanceManager::RelayMessage(PeerManager& peerman, const CGovernanceVote& vote) const
129+
void CGovernanceManager::RelayVote(const CGovernanceVote& vote)
113130
{
114131
if (!m_mn_sync.IsSynced()) {
115132
LogPrint(BCLog::GOBJECT, "%s -- won't relay until fully synced\n", __func__);
@@ -122,8 +139,8 @@ void CGovernanceManager::RelayMessage(PeerManager& peerman, const CGovernanceVot
122139
return;
123140
}
124141

125-
CInv inv(MSG_GOVERNANCE_OBJECT_VOTE, vote.GetHash());
126-
peerman.RelayInv(inv);
142+
LOCK(cs_relay);
143+
m_relay_invs.emplace_back(MSG_GOVERNANCE_OBJECT_VOTE, vote.GetHash());
127144
}
128145

129146
// Accessors for thread-safe access to maps
@@ -174,7 +191,7 @@ void CGovernanceManager::AddPostponedObject(const CGovernanceObject& govobj)
174191
mapPostponedObjects.insert(std::make_pair(govobj.GetHash(), govobj));
175192
}
176193

177-
MessageProcessingResult CGovernanceManager::ProcessMessage(CNode& peer, CConnman& connman, PeerManager& peerman, std::string_view msg_type, CDataStream& vRecv)
194+
MessageProcessingResult CGovernanceManager::ProcessMessage(CNode& peer, CConnman& connman, std::string_view msg_type, CDataStream& vRecv)
178195
{
179196
if (!IsValid()) return {};
180197
if (!m_mn_sync.IsBlockchainSynced()) return {};
@@ -267,7 +284,7 @@ MessageProcessingResult CGovernanceManager::ProcessMessage(CNode& peer, CConnman
267284
return ret;
268285
}
269286

270-
AddGovernanceObject(govobj, peerman, &peer);
287+
AddGovernanceObject(govobj, &peer);
271288
return ret;
272289
}
273290

@@ -301,7 +318,7 @@ MessageProcessingResult CGovernanceManager::ProcessMessage(CNode& peer, CConnman
301318
if (ProcessVote(&peer, vote, exception, connman)) {
302319
LogPrint(BCLog::GOBJECT, "MNGOVERNANCEOBJECTVOTE -- %s new\n", strHash);
303320
m_mn_sync.BumpAssetLastTime("MNGOVERNANCEOBJECTVOTE");
304-
RelayMessage(peerman, vote);
321+
RelayVote(vote);
305322
} else {
306323
LogPrint(BCLog::GOBJECT, "MNGOVERNANCEOBJECTVOTE -- Rejected vote, error = %s\n", exception.what());
307324
if ((exception.GetNodePenalty() != 0) && m_mn_sync.IsSynced()) {
@@ -316,7 +333,7 @@ MessageProcessingResult CGovernanceManager::ProcessMessage(CNode& peer, CConnman
316333
return {};
317334
}
318335

319-
void CGovernanceManager::CheckOrphanVotes(CGovernanceObject& govobj, PeerManager& peerman)
336+
void CGovernanceManager::CheckOrphanVotes(CGovernanceObject& govobj)
320337
{
321338
uint256 nHash = govobj.GetHash();
322339
std::vector<vote_time_pair_t> vecVotePairs;
@@ -333,7 +350,7 @@ void CGovernanceManager::CheckOrphanVotes(CGovernanceObject& govobj, PeerManager
333350
if (pairVote.second < nNow) {
334351
fRemove = true;
335352
} else if (govobj.ProcessVote(m_mn_metaman, *this, tip_mn_list, vote, e)) {
336-
RelayMessage(peerman, vote);
353+
RelayVote(vote);
337354
fRemove = true;
338355
}
339356
if (fRemove) {
@@ -342,7 +359,7 @@ void CGovernanceManager::CheckOrphanVotes(CGovernanceObject& govobj, PeerManager
342359
}
343360
}
344361

345-
void CGovernanceManager::AddGovernanceObject(CGovernanceObject& govobj, PeerManager& peerman, const CNode* pfrom)
362+
void CGovernanceManager::AddGovernanceObject(CGovernanceObject& govobj, const CNode* pfrom)
346363
{
347364
uint256 nHash = govobj.GetHash();
348365
std::string strHash = nHash.ToString();
@@ -387,7 +404,7 @@ void CGovernanceManager::AddGovernanceObject(CGovernanceObject& govobj, PeerMana
387404
}
388405

389406
LogPrint(BCLog::GOBJECT, "CGovernanceManager::AddGovernanceObject -- %s new, received from peer %s\n", strHash, pfrom ? pfrom->GetLogString() : "nullptr");
390-
RelayMessage(peerman, govobj);
407+
RelayObject(govobj);
391408

392409
// Update the rate buffer
393410
MasternodeRateUpdate(govobj);
@@ -396,7 +413,7 @@ void CGovernanceManager::AddGovernanceObject(CGovernanceObject& govobj, PeerMana
396413

397414
// WE MIGHT HAVE PENDING/ORPHAN VOTES FOR THIS OBJECT
398415

399-
CheckOrphanVotes(govobj, peerman);
416+
CheckOrphanVotes(govobj);
400417

401418
// SEND NOTIFICATION TO SCRIPT/ZMQ
402419
GetMainSignals().NotifyGovernanceObject(std::make_shared<const Governance::Object>(govobj.Object()), nHash.ToString());
@@ -878,11 +895,11 @@ bool CGovernanceManager::MasternodeRateCheck(const CGovernanceObject& govobj, bo
878895
return false;
879896
}
880897

881-
bool CGovernanceManager::ProcessVoteAndRelay(const CGovernanceVote& vote, CGovernanceException& exception, CConnman& connman, PeerManager& peerman)
898+
bool CGovernanceManager::ProcessVoteAndRelay(const CGovernanceVote& vote, CGovernanceException& exception, CConnman& connman)
882899
{
883900
bool fOK = ProcessVote(/*pfrom=*/nullptr, vote, exception, connman);
884901
if (fOK) {
885-
RelayMessage(peerman, vote);
902+
RelayVote(vote);
886903
}
887904
return fOK;
888905
}
@@ -940,7 +957,7 @@ bool CGovernanceManager::ProcessVote(CNode* pfrom, const CGovernanceVote& vote,
940957
return fOk;
941958
}
942959

943-
void CGovernanceManager::CheckPostponedObjects(PeerManager& peerman)
960+
void CGovernanceManager::CheckPostponedObjects()
944961
{
945962
if (!m_mn_sync.IsSynced()) return;
946963

@@ -957,7 +974,7 @@ void CGovernanceManager::CheckPostponedObjects(PeerManager& peerman)
957974
bool fMissingConfirmations;
958975
if (govobj.IsCollateralValid(m_chainman, strError, fMissingConfirmations)) {
959976
if (govobj.IsValidLocally(Assert(m_dmnman)->GetListAtChainTip(), m_chainman, strError, false)) {
960-
AddGovernanceObject(govobj, peerman);
977+
AddGovernanceObject(govobj);
961978
} else {
962979
LogPrint(BCLog::GOBJECT, "CGovernanceManager::CheckPostponedObjects -- %s invalid\n", nHash.ToString());
963980
}
@@ -990,7 +1007,7 @@ void CGovernanceManager::CheckPostponedObjects(PeerManager& peerman)
9901007
if (fValid) {
9911008
if (fReady) {
9921009
LogPrint(BCLog::GOBJECT, "CGovernanceManager::CheckPostponedObjects -- additional relay: hash = %s\n", govobj.GetHash().ToString());
993-
RelayMessage(peerman, govobj);
1010+
RelayObject(govobj);
9941011
} else {
9951012
it++;
9961013
continue;
@@ -1289,7 +1306,7 @@ UniValue CGovernanceManager::ToJson() const
12891306
return jsonObj;
12901307
}
12911308

1292-
void CGovernanceManager::UpdatedBlockTip(const CBlockIndex* pindex, PeerManager& peerman)
1309+
void CGovernanceManager::UpdatedBlockTip(const CBlockIndex* pindex)
12931310
{
12941311
// Note this gets called from ActivateBestChain without cs_main being held
12951312
// so it should be safe to lock our mutex here without risking a deadlock
@@ -1307,7 +1324,7 @@ void CGovernanceManager::UpdatedBlockTip(const CBlockIndex* pindex, PeerManager&
13071324
RemoveInvalidVotes();
13081325
}
13091326

1310-
CheckPostponedObjects(peerman);
1327+
CheckPostponedObjects();
13111328

13121329
ExecuteBestSuperblock(Assert(m_dmnman)->GetListAtChainTip(), pindex->nHeight);
13131330
}

src/governance/governance.h

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ template<typename T>
3131
class CFlatDB;
3232
class CInv;
3333
class CNode;
34+
class CScheduler;
3435
class PeerManager;
3536

3637
class CDeterministicMNList;
@@ -271,18 +272,23 @@ class CGovernanceManager : public GovernanceStore, public GovernanceSignerParent
271272
std::optional<uint256> votedFundingYesTriggerHash;
272273
std::map<uint256, std::shared_ptr<CSuperblock>> mapTrigger;
273274

275+
mutable Mutex cs_relay;
276+
std::vector<CInv> m_relay_invs GUARDED_BY(cs_relay);
277+
274278
public:
275279
explicit CGovernanceManager(CMasternodeMetaMan& mn_metaman, CNetFulfilledRequestManager& netfulfilledman,
276280
const ChainstateManager& chainman,
277281
const std::unique_ptr<CDeterministicMNManager>& dmnman, CMasternodeSync& mn_sync);
278282
~CGovernanceManager();
279283

284+
void Schedule(CScheduler& scheduler, PeerManager& peerman);
285+
280286
bool LoadCache(bool load_cache);
281287

282288
bool IsValid() const override { return is_valid; }
283289

284-
void RelayMessage(PeerManager& peerman, const CGovernanceObject& obj) const;
285-
void RelayMessage(PeerManager& peerman, const CGovernanceVote& vote) const;
290+
void RelayObject(const CGovernanceObject& obj);
291+
void RelayVote(const CGovernanceVote& vote);
286292

287293
/**
288294
* This is called by AlreadyHave in net_processing.cpp as part of the inventory
@@ -294,7 +300,7 @@ class CGovernanceManager : public GovernanceStore, public GovernanceSignerParent
294300
[[nodiscard]] MessageProcessingResult SyncSingleObjVotes(CNode& peer, const uint256& nProp, const CBloomFilter& filter, CConnman& connman);
295301
[[nodiscard]] MessageProcessingResult SyncObjects(CNode& peer, CConnman& connman) const;
296302

297-
[[nodiscard]] MessageProcessingResult ProcessMessage(CNode& peer, CConnman& connman, PeerManager& peerman, std::string_view msg_type, CDataStream& vRecv);
303+
[[nodiscard]] MessageProcessingResult ProcessMessage(CNode& peer, CConnman& connman, std::string_view msg_type, CDataStream& vRecv);
298304

299305
void DoMaintenance(CConnman& connman);
300306

@@ -307,13 +313,13 @@ class CGovernanceManager : public GovernanceStore, public GovernanceSignerParent
307313
std::vector<CGovernanceVote> GetCurrentVotes(const uint256& nParentHash, const COutPoint& mnCollateralOutpointFilter) const;
308314
void GetAllNewerThan(std::vector<CGovernanceObject>& objs, int64_t nMoreThanTime) const;
309315

310-
void AddGovernanceObject(CGovernanceObject& govobj, PeerManager& peerman, const CNode* pfrom = nullptr) override;
316+
void AddGovernanceObject(CGovernanceObject& govobj, const CNode* pfrom = nullptr) override;
311317

312318
void CheckAndRemove();
313319

314320
UniValue ToJson() const;
315321

316-
void UpdatedBlockTip(const CBlockIndex* pindex, PeerManager& peerman);
322+
void UpdatedBlockTip(const CBlockIndex* pindex);
317323
int64_t GetLastDiffTime() const { return nTimeLastDiff; }
318324
void UpdateLastDiffTime(int64_t nTimeIn) { nTimeLastDiff = nTimeIn; }
319325

@@ -338,9 +344,9 @@ class CGovernanceManager : public GovernanceStore, public GovernanceSignerParent
338344

339345
bool MasternodeRateCheck(const CGovernanceObject& govobj, bool fUpdateFailStatus, bool fForce, bool& fRateCheckBypassed);
340346

341-
bool ProcessVoteAndRelay(const CGovernanceVote& vote, CGovernanceException& exception, CConnman& connman, PeerManager& peerman) override;
347+
bool ProcessVoteAndRelay(const CGovernanceVote& vote, CGovernanceException& exception, CConnman& connman) override;
342348

343-
void CheckPostponedObjects(PeerManager& peerman);
349+
void CheckPostponedObjects();
344350

345351
bool AreRateChecksEnabled() const
346352
{
@@ -407,7 +413,7 @@ class CGovernanceManager : public GovernanceStore, public GovernanceSignerParent
407413
/// Called to indicate a requested object or vote has been received
408414
bool AcceptMessage(const uint256& nHash);
409415

410-
void CheckOrphanVotes(CGovernanceObject& govobj, PeerManager& peerman);
416+
void CheckOrphanVotes(CGovernanceObject& govobj);
411417

412418
void RebuildIndexes();
413419

src/governance/signing.cpp

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,12 +18,11 @@
1818
#include <algorithm>
1919

2020
GovernanceSigner::GovernanceSigner(CConnman& connman, CDeterministicMNManager& dmnman, GovernanceSignerParent& govman,
21-
PeerManager& peerman, const CActiveMasternodeManager& mn_activeman,
22-
const ChainstateManager& chainman, const CMasternodeSync& mn_sync) :
21+
const CActiveMasternodeManager& mn_activeman, const ChainstateManager& chainman,
22+
const CMasternodeSync& mn_sync) :
2323
m_connman{connman},
2424
m_dmnman{dmnman},
2525
m_govman{govman},
26-
m_peerman{peerman},
2726
m_mn_activeman{mn_activeman},
2827
m_chainman{chainman},
2928
m_mn_sync{mn_sync}
@@ -155,7 +154,7 @@ std::optional<const CGovernanceObject> GovernanceSigner::CreateGovernanceTrigger
155154
}
156155

157156
// The trigger we just created looks good, submit it
158-
m_govman.AddGovernanceObject(gov_sb, m_peerman);
157+
m_govman.AddGovernanceObject(gov_sb);
159158
return std::make_optional<CGovernanceObject>(gov_sb);
160159
}
161160

@@ -250,7 +249,7 @@ bool GovernanceSigner::VoteFundingTrigger(const uint256& nHash, const vote_outco
250249
vote.SetSignature(m_mn_activeman.SignBasic(vote.GetSignatureHash()));
251250

252251
CGovernanceException exception;
253-
if (!m_govman.ProcessVoteAndRelay(vote, exception, m_connman, m_peerman)) {
252+
if (!m_govman.ProcessVoteAndRelay(vote, exception, m_connman)) {
254253
LogPrint(BCLog::GOBJECT, "%s -- Vote FUNDING %d for trigger:%s failed:%s\n", __func__, outcome, nHash.ToString(), exception.what());
255254
return false;
256255
}

src/governance/signing.h

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,6 @@ class CGovernanceVote;
2424
class ChainstateManager;
2525
class CMasternodeSync;
2626
class CNode;
27-
class PeerManager;
2827
enum vote_outcome_enum_t : int;
2928

3029
class GovernanceSignerParent
@@ -35,13 +34,13 @@ class GovernanceSignerParent
3534
virtual bool IsValid() const = 0;
3635
virtual bool GetBestSuperblock(const CDeterministicMNList& tip_mn_list, std::shared_ptr<CSuperblock>& pSuperblockRet, int nBlockHeight) = 0;
3736
virtual bool MasternodeRateCheck(const CGovernanceObject& govobj, bool fUpdateFailStatus = false) = 0;
38-
virtual bool ProcessVoteAndRelay(const CGovernanceVote& vote, CGovernanceException& exception, CConnman& connman, PeerManager& peerman) = 0;
37+
virtual bool ProcessVoteAndRelay(const CGovernanceVote& vote, CGovernanceException& exception, CConnman& connman) = 0;
3938
virtual int GetCachedBlockHeight() const = 0;
4039
virtual CGovernanceObject* FindGovernanceObject(const uint256& nHash) = 0;
4140
virtual CGovernanceObject* FindGovernanceObjectByDataHash(const uint256& nDataHash) = 0;
4241
virtual std::vector<std::shared_ptr<CSuperblock>> GetActiveTriggers() const = 0;
4342
virtual std::vector<std::shared_ptr<const CGovernanceObject>> GetApprovedProposals(const CDeterministicMNList& tip_mn_list) = 0;
44-
virtual void AddGovernanceObject(CGovernanceObject& govobj, PeerManager& peerman, const CNode* pfrom = nullptr) = 0;
43+
virtual void AddGovernanceObject(CGovernanceObject& govobj, const CNode* pfrom = nullptr) = 0;
4544
};
4645

4746
class GovernanceSigner
@@ -50,7 +49,6 @@ class GovernanceSigner
5049
CConnman& m_connman;
5150
CDeterministicMNManager& m_dmnman;
5251
GovernanceSignerParent& m_govman;
53-
PeerManager& m_peerman;
5452
const CActiveMasternodeManager& m_mn_activeman;
5553
const ChainstateManager& m_chainman;
5654
const CMasternodeSync& m_mn_sync;
@@ -60,7 +58,7 @@ class GovernanceSigner
6058

6159
public:
6260
explicit GovernanceSigner(CConnman& connman, CDeterministicMNManager& dmnman, GovernanceSignerParent& govman,
63-
PeerManager& peerman, const CActiveMasternodeManager& mn_activeman,
61+
const CActiveMasternodeManager& mn_activeman,
6462
const ChainstateManager& chainman, const CMasternodeSync& mn_sync);
6563
~GovernanceSigner();
6664

0 commit comments

Comments
 (0)