aboutsummaryrefslogtreecommitdiff
path: root/src/node
diff options
context:
space:
mode:
authorJohn Newbery <john@johnnewbery.com>2021-06-16 10:47:56 +0100
committerJohn Newbery <john@johnnewbery.com>2021-07-09 17:24:08 +0100
commit2837a9f1eaa2c6bf402d1d9891d9aa84c4a56033 (patch)
tree5e9afdc056a180a8c83377b2d6be52cb5b847e25 /src/node
parent8ab0c77299a5b184a8d0edf38f26a97bf9bbed6e (diff)
downloadbitcoin-2837a9f1eaa2c6bf402d1d9891d9aa84c4a56033.tar.xz
[mempool] Only add a transaction to the unbroadcast set when it's added to the mempool
Currently, if BroadcastTransaction() is called to rebroadcast a transaction (e.g. by ResendWalletTransactions()), then we add the transaction to the unbroadcast set. That transaction has already been broadcast in the past, so peers are unlikely to request it again, meaning RemoveUnbroadcastTx() won't be called and it won't be removed from m_unbroadcast_txids. Net processing will therefore continue to attempt rebroadcast for the transaction every 10-15 minutes. This will most likely continue until the node connects to a new peer which hasn't yet seen the transaction (or perhaps indefinitely). Fix by only adding the transaction to the broadcast set when it's added to the mempool.
Diffstat (limited to 'src/node')
-rw-r--r--src/node/transaction.cpp9
1 files changed, 6 insertions, 3 deletions
diff --git a/src/node/transaction.cpp b/src/node/transaction.cpp
index f21b390915..926dd0e31d 100644
--- a/src/node/transaction.cpp
+++ b/src/node/transaction.cpp
@@ -71,6 +71,12 @@ TransactionError BroadcastTransaction(NodeContext& node, const CTransactionRef t
// Transaction was accepted to the mempool.
+ if (relay) {
+ // the mempool tracks locally submitted transactions to make a
+ // best-effort of initial broadcast
+ node.mempool->AddUnbroadcastTx(hashTx);
+ }
+
if (wait_callback) {
// For transactions broadcast from outside the wallet, make sure
// that the wallet has been notified of the transaction before
@@ -96,9 +102,6 @@ TransactionError BroadcastTransaction(NodeContext& node, const CTransactionRef t
}
if (relay) {
- // the mempool tracks locally submitted transactions to make a
- // best-effort of initial broadcast
- node.mempool->AddUnbroadcastTx(hashTx);
node.peerman->RelayTransaction(hashTx, tx->GetWitnessHash());
}