Skip to content

Commit 8ab6c0b

Browse files
committed
Merge #11839: don't attempt mempool entry for wallet transactions on startup if alr…
6697a70 add test for unconfirmed balance between restarts (Gregory Sanders) 6ba8f30 don't attempt mempool entry for wallet transactions on startup if already in mempool (Gregory Sanders) Pull request description: …eady in mempool Mempool loads first, wallet second. Second attempt fails, marking that transaction !fInMempool. Those funds will disappear until confirmation is reached. Tree-SHA512: 955f0565ec1dc1ba395e0b803a98c07b7cd00c8cac5ec618ed832fed259a856fb7bbbe41310cf6a4e43c0435e09b156109d2a4467d403811dc8379d2caebeede
2 parents f60b4ad + 6697a70 commit 8ab6c0b

File tree

2 files changed

+12
-1
lines changed

2 files changed

+12
-1
lines changed

src/wallet/wallet.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4114,6 +4114,11 @@ int CMerkleTx::GetBlocksToMaturity() const
41144114

41154115
bool CWalletTx::AcceptToMemoryPool(const CAmount& nAbsurdFee, CValidationState& state)
41164116
{
4117+
// Quick check to avoid re-setting fInMempool to false
4118+
if (mempool.exists(tx->GetHash())) {
4119+
return false;
4120+
}
4121+
41174122
// We must set fInMempool here - while it will be re-set to true by the
41184123
// entered-mempool callback, if we did not there would be a race where a
41194124
// user could call sendmoney in a loop and hit spurious out of funds errors

test/functional/mempool_persist.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,21 +57,27 @@ def run_test(self):
5757
self.log.debug("Send 5 transactions from node2 (to its own address)")
5858
for i in range(5):
5959
self.nodes[2].sendtoaddress(self.nodes[2].getnewaddress(), Decimal("10"))
60+
node2_balance = self.nodes[2].getbalance()
6061
self.sync_all()
6162

6263
self.log.debug("Verify that node0 and node1 have 5 transactions in their mempools")
6364
assert_equal(len(self.nodes[0].getrawmempool()), 5)
6465
assert_equal(len(self.nodes[1].getrawmempool()), 5)
6566

66-
self.log.debug("Stop-start node0 and node1. Verify that node0 has the transactions in its mempool and node1 does not.")
67+
self.log.debug("Stop-start the nodes. Verify that node0 has the transactions in its mempool and node1 does not. Verify that node2 calculates its balance correctly after loading wallet transactions.")
6768
self.stop_nodes()
6869
self.start_node(0)
6970
self.start_node(1)
71+
self.start_node(2)
7072
# Give bitcoind a second to reload the mempool
7173
time.sleep(1)
7274
wait_until(lambda: len(self.nodes[0].getrawmempool()) == 5)
75+
wait_until(lambda: len(self.nodes[2].getrawmempool()) == 5)
7376
assert_equal(len(self.nodes[1].getrawmempool()), 0)
7477

78+
# Verify accounting of mempool transactions after restart is correct
79+
assert_equal(node2_balance, self.nodes[2].getbalance())
80+
7581
self.log.debug("Stop-start node0 with -persistmempool=0. Verify that it doesn't load its mempool.dat file.")
7682
self.stop_nodes()
7783
self.start_node(0, extra_args=["-persistmempool=0"])

0 commit comments

Comments
 (0)