diff --git a/src/avalanche/peermanager.h b/src/avalanche/peermanager.h --- a/src/avalanche/peermanager.h +++ b/src/avalanche/peermanager.h @@ -175,6 +175,10 @@ /** * Proof and Peer related API. */ + bool exists(const ProofId &proofid) const { + return getProof(proofid) != nullptr; + } + template void forEachPeer(Callable &&func) const { for (const auto &p : peers) { func(p); @@ -191,7 +195,7 @@ */ void addUnbroadcastProof(const ProofId &proofid); void removeUnbroadcastProof(const ProofId &proofid); - void broadcastProofs(const CConnman &connman); + auto getUnbroadcastProofs() const { return m_unbroadcast_proofids; } /**************************************************** * Functions which are public for testing purposes. * diff --git a/src/avalanche/peermanager.cpp b/src/avalanche/peermanager.cpp --- a/src/avalanche/peermanager.cpp +++ b/src/avalanche/peermanager.cpp @@ -6,7 +6,6 @@ #include #include -#include // For RelayProof #include #include // For ChainstateActive() @@ -485,17 +484,4 @@ m_unbroadcast_proofids.erase(proofid); } -void PeerManager::broadcastProofs(const CConnman &connman) { - // For some reason SaltedProofIdHasher prevents the set from being swappable - auto previous_unbroadcasted_proofids = std::move(m_unbroadcast_proofids); - m_unbroadcast_proofids.clear(); - - for (auto &proofid : previous_unbroadcasted_proofids) { - if (getProof(proofid)) { - m_unbroadcast_proofids.insert(proofid); - RelayProof(proofid, connman); - } - } -} - } // namespace avalanche diff --git a/src/avalanche/processor.h b/src/avalanche/processor.h --- a/src/avalanche/processor.h +++ b/src/avalanche/processor.h @@ -307,7 +307,6 @@ void addUnbroadcastProof(const ProofId &proofid); void removeUnbroadcastProof(const ProofId &proofid); - void broadcastProofs(); private: void runEventLoop(); diff --git a/src/avalanche/processor.cpp b/src/avalanche/processor.cpp --- a/src/avalanche/processor.cpp +++ b/src/avalanche/processor.cpp @@ -770,9 +770,4 @@ peerManager->removeUnbroadcastProof(proofid); } -void Processor::broadcastProofs() { - LOCK(cs_peerManager); - peerManager->broadcastProofs(*connman); -} - } // namespace avalanche diff --git a/src/net_processing.cpp b/src/net_processing.cpp --- a/src/net_processing.cpp +++ b/src/net_processing.cpp @@ -7,6 +7,7 @@ #include #include +#include #include #include #include @@ -1096,7 +1097,19 @@ } if (g_avalanche && isAvalancheEnabled(gArgs)) { - g_avalanche->broadcastProofs(); + g_avalanche->withPeerManager([&](avalanche::PeerManager &pm) { + auto unbroadcasted_proofids = pm.getUnbroadcastProofs(); + + for (const auto &proofid : unbroadcasted_proofids) { + // Sanity check: all unbroadcast proofs should exist in the + // peermanager + if (pm.exists(proofid)) { + RelayProof(proofid, m_connman); + } else { + pm.removeUnbroadcastProof(proofid); + } + } + }); } // Schedule next run for 10-15 minutes in the future.