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+
90107bool 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}
0 commit comments