diff --git a/src/net_processing.h b/src/net_processing.h --- a/src/net_processing.h +++ b/src/net_processing.h @@ -116,6 +116,12 @@ int64_t nTimeReceived, const std::atomic &interruptMsgProc); + /** + * Retrieve unbroadcast transactions from the mempool and reattempt + * sending to peers + */ + void ReattemptInitialBroadcast(CScheduler &scheduler) const; + private: /** * Maybe disconnect a peer and discourage future connections from its diff --git a/src/net_processing.cpp b/src/net_processing.cpp --- a/src/net_processing.cpp +++ b/src/net_processing.cpp @@ -1069,6 +1069,21 @@ } } +void PeerLogicValidation::ReattemptInitialBroadcast( + CScheduler &scheduler) const { + std::set unbroadcast_txids = m_mempool.GetUnbroadcastTxs(); + + for (const TxId &txid : unbroadcast_txids) { + RelayTransaction(txid, m_connman); + } + + // schedule next run for 10-15 minutes in the future + const std::chrono::milliseconds delta = + std::chrono::minutes{10} + GetRandMillis(std::chrono::minutes{5}); + scheduler.scheduleFromNow([&] { ReattemptInitialBroadcast(scheduler); }, + delta); +} + void PeerLogicValidation::FinalizeNode(const Config &config, NodeId nodeid, bool &fUpdateConnectionTime) { fUpdateConnectionTime = false; @@ -1499,6 +1514,12 @@ return true; }, std::chrono::seconds{EXTRA_PEER_CHECK_INTERVAL}); + + // schedule next run for 10-15 minutes in the future + const std::chrono::milliseconds delta = + std::chrono::minutes{10} + GetRandMillis(std::chrono::minutes{5}); + scheduler.scheduleFromNow([&] { ReattemptInitialBroadcast(scheduler); }, + delta); } /**