HomePhabricator

Call InvalidateBlock without cs_main held

Description

Call InvalidateBlock without cs_main held

Summary:
This PR makes a number of improvements to the InvalidateBlock (invalidateblock RPC) and RewindBlockIndex functions, primarily around breaking up their long-term cs_main holding. In addition:

  • They're made safely interruptible (bitcoind can be shutdown, and no progress in either will be lost, though if incomplete, invalidateblock won't continue after restart and will need to be called again)
  • The validation queue is prevented from overflowing (meaning invalidateblock on a very old block will not drive bitcoind OOM) (see #14289).
  • invalidateblock won't bother to move transactions back into the mempool after 10 blocks (optimization).

Partial Backport of Bitcoin Core PR15402 (commit 9b1ff5c):
https://github.com/bitcoin/bitcoin/pull/15402/commits/9b1ff5c742dec0a6e0d6aab29b0bb771ad6d8135

Call InvalidateBlock (and ParkBlock) without cs_main held

Depends on D4757

Test Plan:

  1. Build with Clang in Debug mode:
CXX=clang++ CC=clang cmake .. -D CMAKE_CXX_FLAGS="-Werror=thread-safety-analysis" -GNinja -DCMAKE_BUILD_TYPE=Debug
ninja check-all
  1. Verify that the compiler has not emitted a thread-safety warning.
  2. Run the node: ./src/bitcoind -regtest
  3. Verify that text similar to "Assertion failed: lock ... not held ..." is not printed on stderr.

Reviewers: #bitcoin_abc, deadalnix, markblundeberg

Reviewed By: #bitcoin_abc, deadalnix, markblundeberg

Differential Revision: https://reviews.bitcoinabc.org/D4758

Details

Provenance
Pieter Wuille <pieter.wuille@gmail.com>Authored on Feb 13 2019, 23:53
fpelliccioniCommitted on Jan 14 2020, 15:27
fpelliccioniPushed on Jan 14 2020, 15:56
Reviewer
Restricted Project
Differential Revision
D4758: Call InvalidateBlock without cs_main held
Parents
rSTAGING7504e09fda75: Call RewindBlockIndex without cs_main held
Branches
Unknown
Tags
Unknown
References
tag: phabricator/base/15451