mirror of
https://github.com/bitcoin/bitcoin.git
synced 2025-04-08 03:59:18 +02:00
wallet: CommitTransaction, remove extra wtx lookup and add exception for a possible db write error.
1) `Wallet::AddToWallet` is already returning the pointer to the inserted `CWalletTx`, so there is no need to look it up in the map again. 2) `Wallet::AddToWallet` can only return a nullptr if the db `writeTx` call failed. Which should be treated as an error.
This commit is contained in:
parent
ba48fcf4a4
commit
57fb37c275
@ -2106,7 +2106,7 @@ void CWallet::CommitTransaction(CTransactionRef tx, mapValue_t mapValue, std::ve
|
||||
|
||||
// Add tx to wallet, because if it has change it's also ours,
|
||||
// otherwise just for transaction history.
|
||||
AddToWallet(tx, TxStateInactive{}, [&](CWalletTx& wtx, bool new_tx) {
|
||||
CWalletTx* wtx = AddToWallet(tx, TxStateInactive{}, [&](CWalletTx& wtx, bool new_tx) {
|
||||
CHECK_NONFATAL(wtx.mapValue.empty());
|
||||
CHECK_NONFATAL(wtx.vOrderForm.empty());
|
||||
wtx.mapValue = std::move(mapValue);
|
||||
@ -2116,6 +2116,11 @@ void CWallet::CommitTransaction(CTransactionRef tx, mapValue_t mapValue, std::ve
|
||||
return true;
|
||||
});
|
||||
|
||||
// wtx can only be null if the db write failed.
|
||||
if (!wtx) {
|
||||
throw std::runtime_error(std::string(__func__) + ": Wallet db error, transaction commit failed");
|
||||
}
|
||||
|
||||
// Notify that old coins are spent
|
||||
for (const CTxIn& txin : tx->vin) {
|
||||
CWalletTx &coin = mapWallet.at(txin.prevout.hash);
|
||||
@ -2123,17 +2128,13 @@ void CWallet::CommitTransaction(CTransactionRef tx, mapValue_t mapValue, std::ve
|
||||
NotifyTransactionChanged(coin.GetHash(), CT_UPDATED);
|
||||
}
|
||||
|
||||
// Get the inserted-CWalletTx from mapWallet so that the
|
||||
// wtx cached mempool state is updated correctly
|
||||
CWalletTx& wtx = mapWallet.at(tx->GetHash());
|
||||
|
||||
if (!fBroadcastTransactions) {
|
||||
// Don't submit tx to the mempool
|
||||
return;
|
||||
}
|
||||
|
||||
std::string err_string;
|
||||
if (!SubmitTxMemoryPoolAndRelay(wtx, err_string, true)) {
|
||||
if (!SubmitTxMemoryPoolAndRelay(*wtx, err_string, true)) {
|
||||
WalletLogPrintf("CommitTransaction(): Transaction cannot be broadcast immediately, %s\n", err_string);
|
||||
// TODO: if we expect the failure to be long term or permanent, instead delete wtx from the wallet and return failure.
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user