-
Notifications
You must be signed in to change notification settings - Fork 725
[Wallet] Acquire cs_main lock before cs_wallet during wallet initialization #1781
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[Wallet] Acquire cs_main lock before cs_wallet during wallet initialization #1781
Conversation
>>> backports bitcoin/bitcoin@de9a1db CWallet::MarkConflicted may acquire the cs_main lock after CWalletDB::LoadWallet acquires the cs_wallet lock during wallet initialization. (CWalletDB::LoadWallet calls ReadKeyValue which calls CWallet::LoadToWallet which calls CWallet::MarkConflicted). This is the opposite order that cs_main and cs_wallet locks are acquired in the rest of the code, and so leads to POTENTIAL DEADLOCK DETECTED errors if bitcoin is built with -DDEBUG_LOCKORDER. This commit changes CWallet::LoadWallet (which calls CWalletDB::LoadWallet) to acquire both locks in the standard order. It also fixes some tests that were acquiring wallet and main locks out of order and failed with the new locking in CWallet::LoadWallet. Error was reported by Luke Dashjr <[email protected]> in https://botbot.me/freenode/bitcoin-core-dev/msg/90244330/
furszy
left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
nice finding, ACK 675ab11 .
A minor thing for another PR. With this change, CWalletDB::LoadWallet is recursively locking cs_wallet on the first lines. We can move it from LOCK to AssertLockHeld.
Fuzzbawls
left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
ACK 675ab11
>>> backports bitcoin/bitcoin@de9a1db CWallet::MarkConflicted may acquire the cs_main lock after CWalletDB::LoadWallet acquires the cs_wallet lock during wallet initialization. (CWalletDB::LoadWallet calls ReadKeyValue which calls CWallet::LoadToWallet which calls CWallet::MarkConflicted). This is the opposite order that cs_main and cs_wallet locks are acquired in the rest of the code, and so leads to POTENTIAL DEADLOCK DETECTED errors if bitcoin is built with -DDEBUG_LOCKORDER. This commit changes CWallet::LoadWallet (which calls CWalletDB::LoadWallet) to acquire both locks in the standard order. It also fixes some tests that were acquiring wallet and main locks out of order and failed with the new locking in CWallet::LoadWallet. Error was reported by Luke Dashjr <[email protected]> in https://botbot.me/freenode/bitcoin-core-dev/msg/90244330/ Github-Pull: PIVX-Project#1781 Rebased-From: 675ab11
dc0ed71 [BUG][GUI] Don't append cold-stake records twice (random-zebra) 91adcd7 masternode: CalculateScore and GetBlockHash accessing to chainActive without cs_main fix. (furszy) eeb112f GetMasternodeInputAge: Missing cs_main lock (furszy) 52ec12d refactor: decouple decompose coinstake from TransactionRecord::decomposeTransaction. (furszy) 51a8389 [BUG] Properly copy fCoinStake memeber between CTxInUndo and CCoins Github-Pull: #1796 Rebased-From: acf757b (random-zebra) 5c3caa4 lock cs_main for Misbehaving (furszy) 5c629d8 openssl.org dependency download link changed (CryptoDev-Project) 11aa63c Do not try to resend transactions if the node is importing or in IBD. (furszy) c59b62e [Core] Remove BIP30 check (random-zebra) 3f05eba include missing atomic to make CMake linux happy. (furszy) f0cfd88 Make the cs_sendProcessing a LOCK instead of a TRY_LOCK (Matt Corallo) d38e28c Split CNode::cs_vSend: message processing and message sending (Matt Corallo) 7561b18 Remove double brackets in addrman (Matt Corallo) 63c629b Fix AddrMan locking (Matt Corallo) f78cec4 Make fDisconnect an std::atomic (Matt Corallo) ec56cf5 net: fix a few cases where messages were sent rather than dropped upon disconnection (furszy) 7697085 Acquire cs_main lock before cs_wallet during wallet initialization (random-zebra) c796593 Remove bogus assert on number of oubound connections. (Matt Corallo) 7521065 wallet: Ignore MarkConflict if block hash is not known (random-zebra) 72042ac Move disconnectBlocks logging to use __func__ instead of hardcoded method name. (furszy) 0f66764 Simplify DisconnectBlock arguments/return value (furszy) cca4a8c Split logic to undo txin's off DisconnectBlock (furszy) 0f883e6 Cleaner disconnectBlock flow for coinbase and zerocoin txs. (furszy) a7cbc46 Move UndoWriteToDisk() and UndoReadFromDisk() to anon namespace (random-zebra) de5a405 Decouple CBlockUndo from CDiskBlockPos (jtimon) 671143c Decouple miner.o and txmempool.o from CTxUndo (random-zebra) 9419228 Decouple CCoins from CTxInUndo (jtimon) Pull request description: Backports the following PRs to the `4.2` branch: #1746 #1735 #1767 #1769 #1781 #1780 #1775 #1783 #1750 #1785 #1796 #1776 #1791 ACKs for top commit: furszy: Added #1805. utACK dc0ed71. random-zebra: utACK dc0ed71 Tree-SHA512: 0e59c9e751597b1b6f9a419e117946cec468dffdb921c882a44e5770ecb1a36b7d3d25f8c7f97d48bb3d59f136492842c08969901512d957a17bfaec6aece449
Fixing
(backports bitcoin#11126)