bitcoin/src
Ava Chow 5b8046a6e8
Merge bitcoin/bitcoin#30611: validation: write chainstate to disk every hour
e976bd3045 validation: add randomness to periodic write interval (Andrew Toth)
2e2f410681 refactor: replace m_last_write with m_next_write (Andrew Toth)
b557fa7a17 refactor: rename fDoFullFlush to should_write (Andrew Toth)
d73bd9fbe4 validation: write chainstate to disk every hour (Andrew Toth)
0ad7d7abdb test: chainstate write test for periodic chainstate flush (Andrew Toth)

Pull request description:

  Since #28233, periodically writing the chainstate to disk every 24 hours does not clear the dbcache. Since #28280, periodically writing the chainstate to disk is proportional only to the amount of dirty entries in the cache. Due to these changes, it is no longer beneficial to only write the chainstate to disk every 24 hours. The periodic flush interval was necessary because every write of the chainstate would clear the dbcache. Now, we can get rid of the periodic flush interval and simply write the chainstate along with blocks and block index at least every hour.

  Three benefits of doing this:
  1. For IBD or reindex-chainstate with a combination of large dbcache setting, slow CPU, slow internet speed/unreliable peers, it could be up to 24 hours until the chainstate is persisted to disk. A power outage or crash could potentially lose up to 24 hours of progress. If there is a very large amount of dirty cache entries, writing to disk when a flush finally does occur will take a very long time. Crashing during this window of writing can cause https://github.com/bitcoin/bitcoin/issues/11600. By syncing every hour in unison with the block index we avoid this problem. Only a maximum of one hour of progress can be lost, and the window for crashing during writing is much smaller. For IBD with lower dbcache settings, faster CPU, or better internet speed/reliable peers, chainstate writes are already triggered more often than every hour so this change will have no effect on IBD.
  2. Based on discussion in #28280, writing only once every 24 hours during long running operation of a node causes IO spikes. Writing smaller chainstate changes every hour like we do with blocks and block index will reduce IO spikes.
  3. Faster shutdown speeds. All dirty chainstate entries must be persisted to disk on shutdown. If we have a lot of dirty entries, such as when close to 24 hours or if we sync with a large dbcache, it can take a long time to shutdown. By keeping the chainstate clean we avoid this problem.

  Inspired by [this comment](https://github.com/bitcoin/bitcoin/pull/28280#issuecomment-2121088705).

  Resolves https://github.com/bitcoin/bitcoin/issues/11600

ACKs for top commit:
  achow101:
    ACK e976bd3045
  davidgumberg:
    utACK e976bd3045
  sipa:
    utACK e976bd3045
  l0rinc:
    ACK  e976bd3045

Tree-SHA512: 5bccd8f1dea47f9820a3fd32fe3bb6841c0167b3d6870cc8f3f7e2368f124af1a914bca6acb06889cd7183638a8dbdbace54d3237c3683f2b567eb7355e015ee
2025-05-01 12:11:55 -07:00
..
bench Merge bitcoin/bitcoin#31250: wallet: Disable creating and loading legacy wallets 2025-04-25 13:11:24 +01:00
common Merge bitcoin/bitcoin#31014: net: Use GetAdaptersAddresses to get local addresses on Windows 2025-04-29 15:13:39 -07:00
compat netbase: refactor CreateSock() to accept sa_family_t 2024-03-01 13:13:07 -05:00
consensus Merge bitcoin/bitcoin#29039: versionbits refactoring 2025-04-29 14:06:45 -07:00
crc32c Update crc32c subtree to latest upstream master 2024-02-27 18:28:19 +00:00
crypto scripted-diff: Bump copyright headers after std::span changes 2025-03-12 19:46:54 +01:00
index scripted-diff: rename block and undo functions for consistency 2025-01-09 15:17:02 +01:00
init refactor: Avoid using IsArgSet() on -debug, -loglevel, and -vbparams list options 2025-02-13 12:30:15 -05:00
interfaces Merge bitcoin/bitcoin#31785: Have createNewBlock() wait for tip, make rpc handle shutdown during long poll and wait methods 2025-04-14 14:39:57 -07:00
ipc Merge commit 'a2f28e4be96e92079a219567cf20214996aefc53' as 'src/ipc/libmultiprocess' 2025-04-02 21:41:16 +08:00
kernel Merge bitcoin/bitcoin#29039: versionbits refactoring 2025-04-29 14:06:45 -07:00
leveldb Update leveldb subtree to latest upstream 2025-03-17 15:59:05 +08:00
logging scripted-diff: modernize outdated trait patterns - values 2025-02-21 10:43:01 +01:00
minisketch Update minisketch subtree to latest master 2025-03-05 15:36:56 +00:00
node Merge bitcoin/bitcoin#32355: Bugfix: Miner: Don't reuse block_reserved_weight for "block is full enough to give up" weight delta 2025-04-29 15:51:18 -07:00
policy doc: Update comments for AreInputsStandard to match code 2025-03-26 18:58:02 +10:00
primitives tidy: modernize-use-equals-default 2024-07-08 11:12:01 +02:00
qt Merge bitcoin-core/gui#864: Crash fix, disconnect numBlocksChanged() signal during shutdown 2025-04-26 13:45:31 +01:00
rpc util: Remove fsbridge::get_filesystem_error_message() 2025-04-30 10:41:34 +01:00
script descriptors: Reject + sign when parsing multi threshold 2025-04-28 17:05:37 +02:00
secp256k1 Update secp256k1 subtree to v0.6.0 2024-11-04 14:59:46 -05:00
support util: Add missing types in make_secure_unique 2024-12-10 21:51:48 +01:00
test Merge bitcoin/bitcoin#30611: validation: write chainstate to disk every hour 2025-05-01 12:11:55 -07:00
univalue Merge bitcoin/bitcoin#31904: refactor: modernize outdated trait patterns using helper aliases (C++14/C++17) 2025-03-17 13:10:10 +08:00
util util: Remove fsbridge::get_filesystem_error_message() 2025-04-30 10:41:34 +01:00
wallet Merge bitcoin/bitcoin#32383: util: Remove fsbridge::get_filesystem_error_message() 2025-04-30 10:56:14 -07:00
zmq refactor: starts/ends_with changes for clang-tidy 20 2025-04-22 13:16:54 +01:00
.clang-format refactor: Print verbose serialize compiler error messages 2023-12-15 15:20:54 +01:00
.clang-tidy tidy: add clang-tidy modernize-use-starts-ends-with check 2024-09-14 20:33:32 +03:00
addrdb.cpp scripted-diff: Rename PACKAGE_* variables to CLIENT_* 2024-10-28 12:36:19 +00:00
addrdb.h Use serialization parameters for CAddress serialization 2023-09-05 10:13:25 +02:00
addresstype.cpp policy: Add OP_1 <0x4e73> as a standard output type 2024-07-30 14:06:58 -04:00
addresstype.h refactor: deduplicate anchor witness program bytes (0x4e,0x73) 2025-03-23 21:58:39 +01:00
addrman_impl.h Merge bitcoin/bitcoin#30568: addrman: change internal id counting to int64_t 2024-09-20 12:55:22 -04:00
addrman.cpp addrman: cap the max_pct to not exceed the maximum number of addresses 2024-11-11 12:47:53 -03:00
addrman.h addrman: cap the max_pct to not exceed the maximum number of addresses 2024-11-11 12:47:53 -03:00
arith_uint256.cpp Add a fuzz test for Num3072 multiplication and inversion 2025-01-09 10:11:46 -05:00
arith_uint256.h arith_uint256: modernize comparison operators 2025-04-07 10:45:13 -04:00
attributes.h
banman.cpp refactor: Delay translation of _() literals 2025-01-14 19:21:37 +01:00
banman.h doc: banman: reference past vuln due to unbounded banlist 2025-02-12 15:10:28 -05:00
base58.cpp scripted-diff: Bump copyright headers after std::span changes 2025-03-12 19:46:54 +01:00
base58.h scripted-diff: Bump copyright headers after std::span changes 2025-03-12 19:46:54 +01:00
bech32.cpp Split out bech32 separator char to header 2024-10-19 18:49:53 +02:00
bech32.h Split out bech32 separator char to header 2024-10-19 18:49:53 +02:00
bip324.cpp scripted-diff: Bump copyright headers after std::span changes 2025-03-12 19:46:54 +01:00
bip324.h scripted-diff: Bump copyright headers after std::span changes 2025-03-12 19:46:54 +01:00
bitcoin-chainstate.cpp Remove checkpoints 2025-03-13 11:13:13 +00:00
bitcoin-cli-res.rc scripted-diff: Rename PACKAGE_* variables to CLIENT_* 2024-10-28 12:36:19 +00:00
bitcoin-cli.cpp refactor: starts/ends_with changes for clang-tidy 20 2025-04-22 13:16:54 +01:00
bitcoin-tx-res.rc scripted-diff: Rename PACKAGE_* variables to CLIENT_* 2024-10-28 12:36:19 +00:00
bitcoin-tx.cpp refactor: Use TranslateFn type consistently 2025-01-15 12:15:40 +01:00
bitcoin-util-res.rc scripted-diff: Rename PACKAGE_* variables to CLIENT_* 2024-10-28 12:36:19 +00:00
bitcoin-util.cpp refactor: Use TranslateFn type consistently 2025-01-15 12:15:40 +01:00
bitcoin-wallet-res.rc scripted-diff: Rename PACKAGE_* variables to CLIENT_* 2024-10-28 12:36:19 +00:00
bitcoin-wallet.cpp wallet: Remove wallettool salvage 2025-04-23 12:10:30 -07:00
bitcoind-res.rc scripted-diff: Rename PACKAGE_* variables to CLIENT_* 2024-10-28 12:36:19 +00:00
bitcoind.cpp refactor: introduce a more general LockDirectories for init 2025-01-16 21:06:21 +00:00
blockencodings.cpp scripted-diff: LogPrint -> LogDebug 2024-08-29 13:49:57 +02:00
blockencodings.h tidy: modernize-use-equals-default 2024-07-08 11:12:01 +02:00
blockfilter.cpp util: Move util/string.h functions to util namespace 2024-05-16 10:16:08 -05:00
blockfilter.h Remove unused includes from blockfilter.h 2023-08-17 18:28:15 +02:00
chain.cpp
chain.h Remove checkpoints 2025-03-13 11:13:13 +00:00
chainparams.cpp refactor: Avoid using IsArgSet() on -signetseednode and -signetchallenge list options 2025-02-13 12:30:15 -05:00
chainparams.h
chainparamsbase.cpp net, init: derive default onion port if a user specified a -port 2024-11-14 13:41:02 -05:00
chainparamsbase.h net, init: derive default onion port if a user specified a -port 2024-11-14 13:41:02 -05:00
chainparamsseeds.h seeds: update fixed dns seeds 2025-03-06 15:39:58 -06:00
checkqueue.h Merge bitcoin/bitcoin#31313: refactor: Clamp worker threads in ChainstateManager constructor 2024-12-03 18:02:37 -05:00
clientversion.cpp refactor: Delay translation of _() literals 2025-01-14 19:21:37 +01:00
clientversion.h scripted-diff: Clarify "user agent" variable name 2024-10-28 12:35:49 +00:00
cluster_linearize.h clusterlin: add GetConnectedComponent 2025-03-27 15:48:44 -04:00
CMakeLists.txt cmake: Support building with libmultiprocess subtree 2025-04-02 08:41:16 -05:00
coins.cpp Merge bitcoin/bitcoin#30906: refactor: prohibit direct flags access in CCoinsCacheEntry and remove invalid tests 2024-12-04 14:09:05 -05:00
coins.h coins, refactor: Remove direct GetFlags access 2024-12-02 13:52:34 +01:00
compressor.cpp Clean up things that include script/standard.h 2023-08-14 17:38:27 -04:00
compressor.h scripted-diff: Bump copyright headers after std::span changes 2025-03-12 19:46:54 +01:00
core_io.h rpc: add getdescriptoractivity 2024-11-26 20:47:08 -05:00
core_memusage.h
core_read.cpp refactor: starts/ends_with changes for clang-tidy 20 2025-04-22 13:16:54 +01:00
core_write.cpp refactor: Rename CTransaction::nVersion to version 2024-06-07 13:55:23 -04:00
cuckoocache.h validation: Don't error if maxsigcachesize exceeds uint32::max 2024-07-04 22:35:29 +02:00
dbwrapper.cpp refactor: Remove manual CDBBatch size estimation 2025-04-07 15:59:41 +02:00
dbwrapper.h refactor: Remove manual CDBBatch size estimation 2025-04-07 15:59:41 +02:00
deploymentinfo.cpp versionbits: Use std::array instead of C-style arrays 2024-12-19 06:40:19 +10:00
deploymentinfo.h versionbits: Use std::array instead of C-style arrays 2024-12-19 06:40:19 +10:00
deploymentstatus.cpp scripted-diff: modernize outdated trait patterns - types 2025-02-21 10:41:27 +01:00
deploymentstatus.h versionbits: Simplify VersionBitsCache API 2025-01-21 00:38:03 +10:00
dummywallet.cpp wallet, test: Be able to always swap BDB endianness 2024-05-16 15:03:13 -04:00
external_signer.cpp refactor: Remove Span operator==, Use std::ranges::equal 2024-08-13 07:44:31 +02:00
external_signer.h
flatfile.cpp scripted-diff: LogPrint -> LogDebug 2024-08-29 13:49:57 +02:00
flatfile.h refactor: Add FlatFileSeq member variables in BlockManager 2024-07-24 09:39:35 +02:00
hash.cpp scripted-diff: Bump copyright headers after std::span changes 2025-03-12 19:46:54 +01:00
hash.h scripted-diff: Bump copyright headers after std::span changes 2025-03-12 19:46:54 +01:00
headerssync.cpp [headerssync] update headerssync config for v29 2025-03-04 14:23:18 -05:00
headerssync.h tidy: modernize-use-equals-default 2024-07-08 11:12:01 +02:00
httprpc.cpp refactor: starts/ends_with changes for clang-tidy 20 2025-04-22 13:16:54 +01:00
httprpc.h
httpserver.cpp Fix nonsensical -norpcbind and -norpcallowip behavior 2025-02-13 12:30:15 -05:00
httpserver.h rpc: increase the defaults for -rpcthreads and -rpcworkqueue 2024-11-04 17:08:21 +01:00
i2p.cpp refactor: starts/ends_with changes for clang-tidy 20 2025-04-22 13:16:54 +01:00
i2p.h i2p: log errors properly according to their severity 2024-06-12 16:19:50 -03:00
indirectmap.h
init.cpp net: Rename _randomize_credentials Proxy parameter to tor_stream_isolation 2025-04-01 20:18:59 +02:00
init.h refactor: introduce a more general LockDirectories for init 2025-01-16 21:06:21 +00:00
key_io.cpp key: clear out secret data in DecodeExtKey 2024-10-27 15:38:54 +01:00
key_io.h Clean up things that include script/standard.h 2023-08-14 17:38:27 -04:00
key.cpp scripted-diff: Bump copyright headers after std::span changes 2025-03-12 19:46:54 +01:00
key.h scripted-diff: Bump copyright headers after std::span changes 2025-03-12 19:46:54 +01:00
logging.cpp log: Enforce trailing newline, Remove redundant m_started_new_line 2024-10-01 11:31:39 +02:00
logging.h log: Enforce trailing newline, Remove redundant m_started_new_line 2024-10-01 11:31:39 +02:00
mapport.cpp mapport: make ProcessPCP void 2024-11-04 14:19:40 -05:00
mapport.h mapport: rename 'use_pcp' to 'enable' 2024-10-29 11:58:51 -04:00
memusage.h memusage: Add DynamicUsage for std::string 2024-11-04 18:46:40 +01:00
merkleblock.cpp [clang-tidy] Enable the misc-no-recursion check 2024-04-07 14:04:45 +01:00
merkleblock.h tidy: modernize-use-equals-default 2024-07-08 11:12:01 +02:00
net_permissions.cpp util: move fees.h and error.h to common/messages.h 2024-05-16 10:16:08 -05:00
net_permissions.h scripted-diff: modernize outdated trait patterns - types 2025-02-21 10:41:27 +01:00
net_processing.cpp Use LogBlockHeader for compact blocks 2025-04-15 08:04:50 -04:00
net_processing.h refactor: Fix net_processing iwyu includes 2024-11-13 14:09:58 +01:00
net_types.cpp rpc: avoid copying into UniValue 2024-05-20 16:48:19 +00:00
net_types.h tidy: modernize-use-equals-default 2024-07-08 11:12:01 +02:00
net.cpp net: remove unnecessary check from AlreadyConnectedToAddress() 2025-04-25 15:12:03 +02:00
net.h scripted-diff: Bump copyright headers after std::span changes 2025-03-12 19:46:54 +01:00
netaddress.cpp scripted-diff: Bump copyright headers after std::span changes 2025-03-12 19:46:54 +01:00
netaddress.h scripted-diff: Bump copyright headers after std::span changes 2025-03-12 19:46:54 +01:00
netbase.cpp Merge bitcoin/bitcoin#32176: net: Prevent accidental circuit sharing when using Tor stream isolation 2025-04-10 12:42:34 -04:00
netbase.h net: Rename _randomize_credentials Proxy parameter to tor_stream_isolation 2025-04-01 20:18:59 +02:00
netgroup.cpp Merge bitcoin/bitcoin#27581: net: Continuous ASMap health check 2023-12-06 11:22:42 -05:00
netgroup.h net: Add continuous ASMap health check logging 2023-12-02 22:03:08 +01:00
netmessagemaker.h refactor: NetMsg::Make() without nVersion 2023-11-20 14:02:27 +01:00
noui.cpp node: Use log levels in noui_ThreadSafeMessageBox 2024-03-21 16:41:16 +01:00
noui.h
outputtype.cpp fix incorrect multisig redeem script size limit for segwit 2024-05-03 14:20:44 -03:00
outputtype.h fix incorrect multisig redeem script size limit for segwit 2024-05-03 14:20:44 -03:00
pow.cpp fuzz: enable running fuzz test cases in Debug mode 2025-04-22 17:11:24 +10:00
pow.h consensus: add DeriveTarget() to pow.h 2025-01-22 11:29:05 +01:00
prevector.h prevector: avoid GCC bogus warnings in insert method 2024-09-11 17:41:26 +02:00
protocol.cpp scripted-diff: get rid of remaining "command" terminology in protocol.{h,cpp} 2024-10-26 23:44:15 +02:00
protocol.h scripted-diff: get rid of remaining "command" terminology in protocol.{h,cpp} 2024-10-26 23:44:15 +02:00
psbt.cpp scripted-diff: Bump copyright headers after std::span changes 2025-03-12 19:46:54 +01:00
psbt.h psbt: Implement un/ser of musig2 fields 2025-04-17 16:31:57 -07:00
pubkey.cpp scripted-diff: Bump copyright headers after std::span changes 2025-03-12 19:46:54 +01:00
pubkey.h scripted-diff: Bump copyright headers after std::span changes 2025-03-12 19:46:54 +01:00
random.cpp Remove support for RNDR/RNDRRS for aarch64 on Linux 2025-04-11 08:11:41 +02:00
random.h Merge bitcoin/bitcoin#31519: refactor: Use std::span over Span 2025-03-20 13:41:54 +08:00
randomenv.cpp refactor: modernize remaining outdated trait patterns 2025-02-21 10:43:41 +01:00
randomenv.h
rest.cpp Merge bitcoin/bitcoin#31583: rpc: add target to getmininginfo field and show next block info 2025-01-22 15:01:23 -05:00
rest.h
scheduler.cpp scripted-diff: Rename SingleThreadedSchedulerClient to SerialTaskRunner 2024-02-15 14:43:14 +01:00
scheduler.h kernel: Remove dependency on CScheduler 2024-02-16 17:12:52 +01:00
serialize.h Merge bitcoin/bitcoin#31519: refactor: Use std::span over Span 2025-03-20 13:41:54 +08:00
signet.cpp scripted-diff: Bump copyright headers after std::span changes 2025-03-12 19:46:54 +01:00
signet.h
span.h scripted-diff: Bump copyright headers after std::span changes 2025-03-12 19:46:54 +01:00
streams.cpp optimization: bulk serialization writes in WriteBlockUndo and WriteBlock 2025-04-14 12:04:06 +02:00
streams.h optimization: bulk serialization writes in WriteBlockUndo and WriteBlock 2025-04-14 12:04:06 +02:00
sync.cpp scripted-diff: modernize outdated trait patterns - values 2025-02-21 10:43:01 +01:00
sync.h tidy: modernize-use-equals-default 2024-07-08 11:12:01 +02:00
threadsafety.h tidy: modernize-use-equals-default 2024-07-08 11:12:01 +02:00
tinyformat.h refactor: Introduce struct to hold a runtime format string 2025-01-15 12:16:08 +01:00
torcontrol.cpp torcontrol: Fix addrOnion outdate comment 2025-04-16 19:59:52 +08:00
torcontrol.h net, init: derive default onion port if a user specified a -port 2024-11-14 13:41:02 -05:00
txdb.cpp refactor: Remove manual CDBBatch size estimation 2025-04-07 15:59:41 +02:00
txdb.h kernel: Move default cache constants to caches 2025-01-15 15:44:55 +01:00
txgraph.cpp txgraph: make GroupClusters use partition numbers directly (optimization) 2025-04-11 10:43:56 -04:00
txgraph.h Get*Union: disallow nulltpr Refs 2025-03-31 13:07:37 -04:00
txmempool.cpp txmempool: fix typos in comments 2024-12-31 00:04:20 -03:00
txmempool.h txmempool: fix typos in comments 2024-12-31 00:04:20 -03:00
txorphanage.cpp [fuzz] TxOrphanage::SanityCheck accounting 2025-02-07 13:55:57 -05:00
txorphanage.h [fuzz] TxOrphanage::SanityCheck accounting 2025-02-07 13:55:57 -05:00
txrequest.cpp [refactor] make GetCandidatePeers take uint256 and in-out vector 2025-01-29 18:05:16 -05:00
txrequest.h doc: txrequest: point to past censorship vulnerability in tx re-request handling 2025-02-12 15:10:28 -05:00
uint256.cpp refactor: Remove SetHexDeprecated 2025-04-09 15:59:59 +01:00
uint256.h refactor: Remove SetHexDeprecated 2025-04-09 15:59:59 +01:00
undo.h Include version.h in fewer places 2023-11-16 11:36:22 +10:00
validation.cpp Merge bitcoin/bitcoin#30611: validation: write chainstate to disk every hour 2025-05-01 12:11:55 -07:00
validation.h Merge bitcoin/bitcoin#30611: validation: write chainstate to disk every hour 2025-05-01 12:11:55 -07:00
validationinterface.cpp refactor: include the proper header rather than forward-declaring RemovalReasonToString 2024-10-08 15:25:47 +00:00
validationinterface.h [refactor] change ActiveTipChange to use CBlockIndex ref instead of ptr 2024-07-25 11:01:22 +01:00
versionbits_impl.h tests: refactor versionbits fuzz test 2025-01-21 00:38:03 +10:00
versionbits.cpp versionbits: Expose VersionBitsConditionChecker via impl header 2025-01-21 00:38:03 +10:00
versionbits.h versionbits: docstrings for BIP9Info 2025-03-14 13:38:53 +10:00
walletinitinterface.h tidy: modernize-use-equals-default 2024-07-08 11:12:01 +02:00