bitcoin/src/wallet
Ava Chow 78567b052d
Merge bitcoin/bitcoin#30697: Bugfix: Ensure Atomicity in Wallet Settings Updates from Chain Interface
1b41d45d46 wallet: bugfix: ensure atomicity in settings updates (ismaelsadeeq)

Pull request description:

  This PR fixes #30620.

  As outlined in the issue, creating two wallets with `load_on_startup=true` simultaneously results in only one wallet being added to the startup file.

  The current issue arises because the wallet settings update process involves:
  1. Obtaining the settings value while acquiring the settings lock.
  2. Modifying the settings value.
  3. Overwriting the settings value while acquiring the settings lock again.

  This sequence is not thread-safe. Different threads could modify the same base value simultaneously, overwriting data from other workers without realizing it.

  The PR attempts to  fix this by modifying the chain interface's `updateRwSetting` method to accept a function that will be called with the settings reference. This function will either update or delete the setting and return an enum indicating whether the settings need to be overwritten in this or not.

  Additionally, this PR introduces two new methods to the chain interface:
  - `overwriteRwSetting`: This method replaces the setting with a new value.
  Used in `VerifyWallets`
  - `deleteRwSettings`: This method completely erases a specified setting.
  This method is currently used only in `overwriteRwSetting`.

  These changes ensure that updates are race-free across all clients.

ACKs for top commit:
  achow101:
    ACK 1b41d45d46
  furszy:
    self-code-ACK 1b41d45d46

Tree-SHA512: 50cda612b782aeb5e03e2cf63cc44779a013de1c535b883b57af4de22f24b0de80b4edecbcda235413baec0a12bdf0e5750fb6731c9e67d32e742d8c63f08c13
2024-08-27 12:29:20 -04:00
..
rpc Merge bitcoin/bitcoin#30659: wallet: fix UnloadWallet thread safety assumptions 2024-08-15 13:22:34 -04:00
test wallet: bugfix: ensure atomicity in settings updates 2024-08-26 13:41:56 +01:00
bdb.cpp bdb: Be able to make byteswapped databases 2024-05-16 15:03:13 -04:00
bdb.h bdb: Be able to make byteswapped databases 2024-05-16 15:03:13 -04:00
coincontrol.cpp wallet: Explicitly preserve scriptSig and scriptWitness in CreateTransaction 2023-12-08 17:12:19 -05:00
coincontrol.h [wallet, rpc]: add max_tx_weight to tx funding options 2024-06-27 15:31:21 +01:00
coinselection.cpp Merge bitcoin/bitcoin#29523: Wallet: Add max_tx_weight to transaction funding options (take 2) 2024-07-17 18:27:59 -04:00
coinselection.h Merge bitcoin/bitcoin#29523: Wallet: Add max_tx_weight to transaction funding options (take 2) 2024-07-17 18:27:59 -04:00
context.cpp scripted-diff: Bump copyright headers 2022-12-24 23:49:50 +00:00
context.h interfaces: Add schedulerMockForward method so mockscheduler RPC can work across processes 2023-10-20 10:30:16 -04:00
crypter.cpp refactor: Remove unused C-style casts 2023-07-24 15:32:00 +02:00
crypter.h scripted-diff: Bump copyright headers 2022-12-24 23:49:50 +00:00
db.cpp wallet, interfaces: Include database format in listWalletDir 2024-08-13 11:25:38 -04:00
db.h wallet, interfaces: Include database format in listWalletDir 2024-08-13 11:25:38 -04:00
dump.cpp bdb: Be able to make byteswapped databases 2024-05-16 15:03:13 -04:00
dump.h wallettool: Don't create CWallet when dumping DB 2023-12-19 16:54:06 -05:00
external_signer_scriptpubkeyman.cpp util: add TransactionError includes and namespace declarations 2024-05-16 10:16:08 -05:00
external_signer_scriptpubkeyman.h common: Add PSBTError enum 2024-05-16 10:16:08 -05:00
feebumper.cpp Merge bitcoin/bitcoin#27969: bumpfee: ignore WALLET_INCREMENTAL_RELAY_FEE when user specifies fee_rate 2024-06-14 14:46:04 -04:00
feebumper.h rpc: bumpfee, improve doc for 'reduce_output' arg 2023-09-26 20:17:02 -03:00
fees.cpp scripted-diff: Bump copyright headers 2022-12-24 23:49:50 +00:00
fees.h
init.cpp Merge bitcoin/bitcoin#26606: wallet: Implement independent BDB parser 2024-05-21 10:05:09 +01:00
interfaces.cpp gui: Use wallet name for wallet migration rather than WalletModel 2024-08-13 11:25:38 -04:00
load.cpp wallet: bugfix: ensure atomicity in settings updates 2024-08-26 13:41:56 +01:00
load.h interfaces: Add schedulerMockForward method so mockscheduler RPC can work across processes 2023-10-20 10:30:16 -04:00
migrate.cpp refactor: Add explicit cast to expected_last_page to silence fuzz ISan 2024-06-07 17:30:38 +02:00
migrate.h tidy: modernize-use-equals-default 2024-07-08 11:12:01 +02:00
receive.cpp [clang-tidy] Enable the misc-no-recursion check 2024-04-07 14:04:45 +01:00
receive.h wallet: Add wallet/types.h for simple public enum and struct types 2023-04-11 15:52:25 -04:00
salvage.cpp tidy: modernize-use-emplace 2023-10-12 11:27:19 +02:00
salvage.h refactor: Move fs.* to util/fs.* 2023-03-23 12:55:18 +01:00
scriptpubkeyman.cpp policy: Add OP_1 <0x4e73> as a standard output type 2024-07-30 14:06:58 -04:00
scriptpubkeyman.h Merge bitcoin/bitcoin#30406: refactor: modernize-use-equals-default 2024-07-11 19:08:46 +01:00
spend.cpp Merge bitcoin/bitcoin#29523: Wallet: Add max_tx_weight to transaction funding options (take 2) 2024-07-17 18:27:59 -04:00
spend.h refactor: pass CRecipient to FundTransaction 2024-01-19 15:04:56 +01:00
sqlite.cpp wallet: use LogTrace for walletdb log messages at trace level 2024-06-28 17:41:52 +10:00
sqlite.h tidy: modernize-use-equals-default 2024-07-08 11:12:01 +02:00
transaction.cpp scripted-diff: wallet: s/TxStateConflicted/TxStateBlockConflicted 2024-03-14 17:38:39 -04:00
transaction.h util: Move util/string.h functions to util namespace 2024-05-16 10:16:08 -05:00
types.h util: move error.h TransactionError enum to node/types.h 2024-05-16 10:16:08 -05:00
wallet.cpp Merge bitcoin/bitcoin#30697: Bugfix: Ensure Atomicity in Wallet Settings Updates from Chain Interface 2024-08-27 12:29:20 -04:00
wallet.h wallet: rename UnloadWallet to WaitForDeleteWallet 2024-08-14 16:12:18 -03:00
walletdb.cpp gui: Use wallet name for wallet migration rather than WalletModel 2024-08-13 11:25:38 -04:00
walletdb.h gui: Use wallet name for wallet migration rather than WalletModel 2024-08-13 11:25:38 -04:00
wallettool.cpp Merge bitcoin/bitcoin#26606: wallet: Implement independent BDB parser 2024-05-21 10:05:09 +01:00
wallettool.h
walletutil.cpp wallet, descspkm: Refactor wallet descriptor generation to standalone func 2024-03-20 16:15:43 -04:00
walletutil.h tidy: modernize-use-equals-default 2024-07-08 11:12:01 +02:00