aboutsummaryrefslogtreecommitdiff
path: root/ci
diff options
context:
space:
mode:
authorVasil Dimov <vd@FreeBSD.org>2020-06-01 14:04:36 +0200
committerVasil Dimov <vd@FreeBSD.org>2020-06-01 17:14:43 +0200
commitf46b678acff0b2e75e26aa50b14d935b3d251a2a (patch)
treec44064bba46e0dc3e0ae07822a9a244645299a4e /ci
parent9bc7751cadbd038faf8ac1d62cda23fcf00d4cc2 (diff)
downloadbitcoin-f46b678acff0b2e75e26aa50b14d935b3d251a2a.tar.xz
qt: lock cs_main, m_cached_tip_mutex in that order
Always lock the mutexes `cs_main` and `m_cached_tip_mutex` in the same order: `cs_main`, `m_cached_tip_mutex`. Otherwise we may end up in a deadlock. `ClientModel::m_cached_tip_blocks` is protected by `ClientModel::m_cached_tip_mutex`. There are two access paths that lock the two mutexes in opposite order: ``` validation.cpp:2868 CChainState::ActivateBestChain(): lock cs_main validation.cpp:2916 CChainState::ActivateBestChain(): call uiInterface.NotifyBlockTip() ui_interface.cpp:52 CClientUIInterface::NotifyBlockTip(): go deep in boost ... qt/clientmodel.cpp:255 BlockTipChanged(): lock m_cached_tip_mutex ``` and ``` qt/clientmodel.cpp:119 ClientModel::getBestBlockHash(): lock m_cached_tip_mutex qt/clientmodel.cpp:121 ClientModel::getBestBlockHash(): call m_node.getBestBlockHash() interfaces/node.cpp:200 NodeImpl::getBestBlockHash(): lock cs_main ``` From `debug.log`: ``` POTENTIAL DEADLOCK DETECTED Previous lock order was: m_cs_chainstate validation.cpp:2851 (1) cs_main validation.cpp:2868 ::mempool.cs validation.cpp:2868 (2) clientmodel->m_cached_tip_mutex qt/clientmodel.cpp:255 Current lock order is: (2) m_cached_tip_mutex qt/clientmodel.cpp:119 (1) ::cs_main interfaces/node.cpp:200 ``` The possible deadlock was introduced in https://github.com/bitcoin/bitcoin/pull/17993
Diffstat (limited to 'ci')
0 files changed, 0 insertions, 0 deletions