Skip to content

Conversation

@random-zebra
Copy link

@random-zebra random-zebra commented Aug 1, 2020

Fixing

2020-08-01 09:53:49 POTENTIAL DEADLOCK DETECTED
2020-08-01 09:53:49 Previous lock order was:
2020-08-01 09:53:49  (1) cs_main wallet/wallet.cpp:1617 (in thread )
2020-08-01 09:53:49  (2) cs_wallet wallet/wallet.cpp:1617 (in thread )
2020-08-01 09:53:49 Current lock order is:
2020-08-01 09:53:49  (2) pwallet->cs_wallet wallet/walletdb.cpp:708 (in thread )
2020-08-01 09:53:49  (1) cs_main wallet/wallet.cpp:1013 (in thread )

(backports bitcoin#11126)

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.

>>> 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/
@random-zebra random-zebra added this to the 5.0.0 milestone Aug 1, 2020
@random-zebra random-zebra self-assigned this Aug 1, 2020
Copy link

@furszy furszy left a 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.

Copy link
Collaborator

@Fuzzbawls Fuzzbawls left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ACK 675ab11

@random-zebra random-zebra merged commit 4715915 into PIVX-Project:master Aug 2, 2020
@random-zebra random-zebra added the Needs Backport Placeholder tag for anything needing a backport to prior version branches label Aug 5, 2020
Fuzzbawls pushed a commit to Fuzzbawls/PIVX that referenced this pull request Aug 13, 2020
>>> 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
furszy added a commit that referenced this pull request Aug 18, 2020
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
@random-zebra random-zebra modified the milestones: 5.0.0, 4.3.0 Sep 10, 2020
@random-zebra random-zebra removed the Needs Backport Placeholder tag for anything needing a backport to prior version branches label Sep 10, 2020
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants