diff --git a/src/governance/governance.cpp b/src/governance/governance.cpp index d64b63414939..671d9ec29ef9 100644 --- a/src/governance/governance.cpp +++ b/src/governance/governance.cpp @@ -15,7 +15,6 @@ #include #include #include -#include #include #include #include @@ -63,12 +62,11 @@ GovernanceStore::GovernanceStore() : { } -CGovernanceManager::CGovernanceManager(CMasternodeMetaMan& mn_metaman, CNetFulfilledRequestManager& netfulfilledman, +CGovernanceManager::CGovernanceManager(CMasternodeMetaMan& mn_metaman, const ChainstateManager& chainman, const std::unique_ptr& dmnman, CMasternodeSync& mn_sync) : m_db{std::make_unique("governance.dat", "magicGovernanceCache")}, m_mn_metaman{mn_metaman}, - m_netfulfilledman{netfulfilledman}, m_chainman{chainman}, m_dmnman{dmnman}, m_mn_sync{mn_sync}, @@ -649,18 +647,9 @@ MessageProcessingResult CGovernanceManager::SyncSingleObjVotes(CNode& peer, cons MessageProcessingResult CGovernanceManager::SyncObjects(CNode& peer, CConnman& connman) const { LOCK(cs_store); - assert(m_netfulfilledman.IsValid()); - // do not provide any data until our node is synced if (!m_mn_sync.IsSynced()) return {}; - if (m_netfulfilledman.HasFulfilledRequest(peer.addr, NetMsgType::MNGOVERNANCESYNC)) { - // Asking for the whole list multiple times in a short period of time is no good - LogPrint(BCLog::GOBJECT, "CGovernanceManager::%s -- peer already asked me for the list\n", __func__); - return MisbehavingError{20}; - } - m_netfulfilledman.AddFulfilledRequest(peer.addr, NetMsgType::MNGOVERNANCESYNC); - // SYNC GOVERNANCE OBJECTS WITH OTHER CLIENT LogPrint(BCLog::GOBJECT, "CGovernanceManager::%s -- syncing all objects to peer=%d\n", __func__, peer.GetId()); diff --git a/src/governance/governance.h b/src/governance/governance.h index 9236b8bdf086..a8d5f324acbc 100644 --- a/src/governance/governance.h +++ b/src/governance/governance.h @@ -41,7 +41,6 @@ class CGovernanceObject; class CGovernanceVote; class CMasternodeMetaMan; class CMasternodeSync; -class CNetFulfilledRequestManager; class CSporkManager; class CSuperblock; @@ -252,7 +251,6 @@ class CGovernanceManager : public GovernanceStore, public GovernanceSignerParent bool is_valid{false}; CMasternodeMetaMan& m_mn_metaman; - CNetFulfilledRequestManager& m_netfulfilledman; const ChainstateManager& m_chainman; const std::unique_ptr& m_dmnman; CMasternodeSync& m_mn_sync; @@ -274,7 +272,7 @@ class CGovernanceManager : public GovernanceStore, public GovernanceSignerParent CGovernanceManager() = delete; CGovernanceManager(const CGovernanceManager&) = delete; CGovernanceManager& operator=(const CGovernanceManager&) = delete; - explicit CGovernanceManager(CMasternodeMetaMan& mn_metaman, CNetFulfilledRequestManager& netfulfilledman, + explicit CGovernanceManager(CMasternodeMetaMan& mn_metaman, const ChainstateManager& chainman, const std::unique_ptr& dmnman, CMasternodeSync& mn_sync); ~CGovernanceManager(); diff --git a/src/governance/net_governance.cpp b/src/governance/net_governance.cpp index 63ca68f85671..560f26fdc5ec 100644 --- a/src/governance/net_governance.cpp +++ b/src/governance/net_governance.cpp @@ -10,6 +10,7 @@ #include #include #include +#include #include class CConnman; @@ -61,7 +62,15 @@ void NetGovernance::ProcessMessage(CNode& peer, const std::string& msg_type, CDa LogPrint(BCLog::GOBJECT, "MNGOVERNANCESYNC -- syncing governance objects to our peer %s\n", peer.GetLogString()); if (nProp == uint256()) { - m_peer_manager->PeerPostProcessMessage(m_gov_manager.SyncObjects(peer, m_connman)); + assert(m_netfulfilledman.IsValid()); + if (!m_netfulfilledman.HasFulfilledRequest(peer.addr, NetMsgType::MNGOVERNANCESYNC)) { + m_netfulfilledman.AddFulfilledRequest(peer.addr, NetMsgType::MNGOVERNANCESYNC); + m_peer_manager->PeerPostProcessMessage(m_gov_manager.SyncObjects(peer, m_connman)); + } else { + // Asking for the whole list multiple times in a short period of time is no good + LogPrint(BCLog::GOBJECT, "MNGOVERNANCESYNC -- peer already asked me for the list\n"); + m_peer_manager->PeerMisbehaving(peer.GetId(), 20); + } } else { m_peer_manager->PeerPostProcessMessage(m_gov_manager.SyncSingleObjVotes(peer, nProp, filter, m_connman)); } diff --git a/src/governance/net_governance.h b/src/governance/net_governance.h index bfa14bb05939..6d226f5f8f53 100644 --- a/src/governance/net_governance.h +++ b/src/governance/net_governance.h @@ -9,15 +9,17 @@ class CGovernanceManager; class CMasternodeSync; +class CNetFulfilledRequestManager; class NetGovernance final : public NetHandler { public: - NetGovernance(PeerManagerInternal* peer_manager, CGovernanceManager& gov_manager, CMasternodeSync& node_sync, + NetGovernance(PeerManagerInternal* peer_manager, CGovernanceManager& gov_manager, CMasternodeSync& node_sync, CNetFulfilledRequestManager& netfulfilledman, CConnman& connman) : NetHandler(peer_manager), m_gov_manager(gov_manager), m_node_sync(node_sync), + m_netfulfilledman(netfulfilledman), m_connman(connman) { } @@ -28,6 +30,7 @@ class NetGovernance final : public NetHandler private: CGovernanceManager& m_gov_manager; CMasternodeSync& m_node_sync; + CNetFulfilledRequestManager& m_netfulfilledman; CConnman& m_connman; }; diff --git a/src/init.cpp b/src/init.cpp index 6e79ed5b0d21..312b38486423 100644 --- a/src/init.cpp +++ b/src/init.cpp @@ -1983,7 +1983,7 @@ bool AppInitMain(NodeContext& node, interfaces::BlockAndHeaderTipInfo* tip_info) */ node.mn_sync = std::make_unique(std::make_unique(*node.connman, *node.netfulfilledman)); - node.govman = std::make_unique(*node.mn_metaman, *node.netfulfilledman, *node.chainman, node.dmnman, *node.mn_sync); + node.govman = std::make_unique(*node.mn_metaman, *node.chainman, node.dmnman, *node.mn_sync); const bool fReset = fReindex; bilingual_str strLoadError; @@ -2259,7 +2259,7 @@ bool AppInitMain(NodeContext& node, interfaces::BlockAndHeaderTipInfo* tip_info) } return InitError(strprintf(_("Failed to clear governance cache at %s"), file_path)); } - node.peerman->AddExtraHandler(std::make_unique(node.peerman.get(), *node.govman, *node.mn_sync, *node.connman)); + node.peerman->AddExtraHandler(std::make_unique(node.peerman.get(), *node.govman, *node.mn_sync, *node.netfulfilledman, *node.connman)); } node.peerman->AddExtraHandler(std::make_unique(node.peerman.get(), *node.govman, *node.mn_sync, *node.connman, *node.netfulfilledman)); diff --git a/src/test/util/setup_common.cpp b/src/test/util/setup_common.cpp index 5c1aa4543124..2d758f1afc5f 100644 --- a/src/test/util/setup_common.cpp +++ b/src/test/util/setup_common.cpp @@ -286,7 +286,7 @@ ChainTestingSetup::ChainTestingSetup(const std::string& chainName, const std::ve m_node.mnhf_manager = std::make_unique(*m_node.evodb, *m_node.chainman); m_node.mn_sync = std::make_unique(std::make_unique(*m_node.connman, *m_node.netfulfilledman)); - m_node.govman = std::make_unique(*m_node.mn_metaman, *m_node.netfulfilledman, *m_node.chainman, m_node.dmnman, *m_node.mn_sync); + m_node.govman = std::make_unique(*m_node.mn_metaman, *m_node.chainman, m_node.dmnman, *m_node.mn_sync); // Start script-checking threads. Set g_parallel_script_checks to true so they are used. constexpr int script_check_threads = 2;