0
0
Fork 0
mirror of https://github.com/bitcoin/bitcoin.git synced 2025-02-10 10:52:31 -05:00

Add wtxid to mempool unbroadcast tracking

This commit is contained in:
Amiti Uttarwar 2020-04-30 18:20:01 -07:00 committed by Suhas Daftuar
parent 2b4b90aa8f
commit c7eb6b4f1f
4 changed files with 24 additions and 18 deletions

View file

@ -830,14 +830,14 @@ void PeerLogicValidation::InitializeNode(CNode *pnode) {
void PeerLogicValidation::ReattemptInitialBroadcast(CScheduler& scheduler) const void PeerLogicValidation::ReattemptInitialBroadcast(CScheduler& scheduler) const
{ {
std::set<uint256> unbroadcast_txids = m_mempool.GetUnbroadcastTxs(); std::map<uint256, uint256> unbroadcast_txids = m_mempool.GetUnbroadcastTxs();
for (const uint256& txid : unbroadcast_txids) { for (const auto& elem : unbroadcast_txids) {
// Sanity check: all unbroadcast txns should exist in the mempool // Sanity check: all unbroadcast txns should exist in the mempool
if (m_mempool.exists(txid)) { if (m_mempool.exists(elem.first)) {
RelayTransaction(txid, *connman); RelayTransaction(elem.first, *connman);
} else { } else {
m_mempool.RemoveUnbroadcastTx(txid, true); m_mempool.RemoveUnbroadcastTx(elem.first, true);
} }
} }

View file

@ -80,7 +80,7 @@ TransactionError BroadcastTransaction(NodeContext& node, const CTransactionRef t
if (relay) { if (relay) {
// the mempool tracks locally submitted transactions to make a // the mempool tracks locally submitted transactions to make a
// best-effort of initial broadcast // best-effort of initial broadcast
node.mempool->AddUnbroadcastTx(hashTx); node.mempool->AddUnbroadcastTx(hashTx, tx->GetWitnessHash());
RelayTransaction(hashTx, *node.connman); RelayTransaction(hashTx, *node.connman);
} }

View file

@ -573,8 +573,11 @@ private:
std::vector<indexed_transaction_set::const_iterator> GetSortedDepthAndScore() const EXCLUSIVE_LOCKS_REQUIRED(cs); std::vector<indexed_transaction_set::const_iterator> GetSortedDepthAndScore() const EXCLUSIVE_LOCKS_REQUIRED(cs);
/** track locally submitted transactions to periodically retry initial broadcast */ /**
std::set<uint256> m_unbroadcast_txids GUARDED_BY(cs); * track locally submitted transactions to periodically retry initial broadcast
* map of txid -> wtxid
*/
std::map<uint256, uint256> m_unbroadcast_txids GUARDED_BY(cs);
public: public:
indirectmap<COutPoint, const CTransaction*> mapNextTx GUARDED_BY(cs); indirectmap<COutPoint, const CTransaction*> mapNextTx GUARDED_BY(cs);
@ -734,11 +737,11 @@ public:
size_t DynamicMemoryUsage() const; size_t DynamicMemoryUsage() const;
/** Adds a transaction to the unbroadcast set */ /** Adds a transaction to the unbroadcast set */
void AddUnbroadcastTx(const uint256& txid) { void AddUnbroadcastTx(const uint256& txid, const uint256& wtxid) {
LOCK(cs); LOCK(cs);
// Sanity Check: the transaction should also be in the mempool // Sanity Check: the transaction should also be in the mempool
if (exists(txid)) { if (exists(txid)) {
m_unbroadcast_txids.insert(txid); m_unbroadcast_txids[txid] = wtxid;
} }
} }
@ -746,7 +749,7 @@ public:
void RemoveUnbroadcastTx(const uint256& txid, const bool unchecked = false); void RemoveUnbroadcastTx(const uint256& txid, const bool unchecked = false);
/** Returns transactions in unbroadcast set */ /** Returns transactions in unbroadcast set */
std::set<uint256> GetUnbroadcastTxs() const { std::map<uint256, uint256> GetUnbroadcastTxs() const {
LOCK(cs); LOCK(cs);
return m_unbroadcast_txids; return m_unbroadcast_txids;
} }

View file

@ -5083,19 +5083,22 @@ bool LoadMempool(CTxMemPool& pool)
} }
// TODO: remove this try except in v0.22 // TODO: remove this try except in v0.22
std::map<uint256, uint256> unbroadcast_txids;
try { try {
std::set<uint256> unbroadcast_txids;
file >> unbroadcast_txids; file >> unbroadcast_txids;
unbroadcast = unbroadcast_txids.size(); unbroadcast = unbroadcast_txids.size();
for (const auto& txid : unbroadcast_txids) {
pool.AddUnbroadcastTx(txid);
}
} catch (const std::exception&) { } catch (const std::exception&) {
// mempool.dat files created prior to v0.21 will not have an // mempool.dat files created prior to v0.21 will not have an
// unbroadcast set. No need to log a failure if parsing fails here. // unbroadcast set. No need to log a failure if parsing fails here.
} }
for (const auto& elem : unbroadcast_txids) {
// Don't add unbroadcast transactions that didn't get back into the
// mempool.
const CTransactionRef& added_tx = pool.get(elem.first);
if (added_tx != nullptr) {
pool.AddUnbroadcastTx(elem.first, added_tx->GetWitnessHash());
}
}
} catch (const std::exception& e) { } catch (const std::exception& e) {
LogPrintf("Failed to deserialize mempool data on disk: %s. Continuing anyway.\n", e.what()); LogPrintf("Failed to deserialize mempool data on disk: %s. Continuing anyway.\n", e.what());
return false; return false;
@ -5111,7 +5114,7 @@ bool DumpMempool(const CTxMemPool& pool)
std::map<uint256, CAmount> mapDeltas; std::map<uint256, CAmount> mapDeltas;
std::vector<TxMempoolInfo> vinfo; std::vector<TxMempoolInfo> vinfo;
std::set<uint256> unbroadcast_txids; std::map<uint256, uint256> unbroadcast_txids;
static Mutex dump_mutex; static Mutex dump_mutex;
LOCK(dump_mutex); LOCK(dump_mutex);