refactor: move block writes and pruning into BlockManager #36738

pull pzafonte wants to merge 8 commits into bitcoin:master from pzafonte:blockstorage-prune-bookkeeping changing 6 files +370 −168
  1. pzafonte commented at 11:58 PM on November 2, 2026: contributor

    FlushStateToDisk() handles block storage directly. It applies BlockManager's prune locks, writes its pruned flag, checks its blocks directory space and runs the flush, index write and file deletion, while BlockManager reads the chainstate to pick files. A pruning API on block storage (#35627) would have to go through validation for all of it.

    This moves the storage side into BlockManager, as described in the same issue. Validation decides which heights may be pruned and passes them as limits. BlockManager applies its prune locks, selects the files, flushes, writes the index and deletes the files, in the same order as before. There is no behavior change to my knowledge.

    Based on #36735

    Thanks to musaHaruna for his review on my fork, which led to grouping and checking the prune limits and to moving the prune bookkeeping into BlockManager.

  2. test: apply BlockManager args in test fixtures
    Without this, -prune and -fastprune in extra_args have no effect.
    24ad36d929
  3. test: check flush retry after failure
    Move the blk file aside instead of deleting it, so it can be restored.
    2334d27a24
  4. test: characterize a failed prune flush
    The pruned blk/rev files are not deleted, even after a later flush
    succeeds.
    108d7ff03c
  5. validation: delete pruned files on a later flush
    Files selected for pruning were kept in a local, so a failed flush left
    them on disk until the next startup.
    
    Keep them in BlockManager and delete them after the next block index
    write. Take them with the dirty entries, which WriteBlockIndexDB() drops
    even if the write fails. Drop a file from the set once a block is
    written to it.
    
    Pending files wait for the next periodic, forced or shutdown flush
    rather than forcing one, which would retry a failing write on every
    block.
    d224fb8721
  6. refactor: let BlockManager write block storage
    Move the block and undo file flush, block index write and pruned file
    deletion from FlushStateToDisk into BlockManager. Their bench log lines
    change from FlushStateToDisk to WriteBlockStorage.
    fb911aecde
  7. refactor: apply prune locks in BlockManager
    Validation read BlockManager's prune locks directly. Move that code and
    PRUNE_LOCK_BUFFER into BlockManager.
    14de6dfdf5
  8. refactor: pass prune limits to BlockManager
    BlockManager read the chainstate to decide what to prune. Decide in
    validation and pass the height range and sizes instead. An Assume checks
    the heights are non-negative.
    ae7d92d02e
  9. refactor: move prune bookkeeping into BlockManager
    Move FlushStateToDisk's handling of the prune request, prune locks,
    pruned flag, files to delete and blocks directory space check into
    BlockManager. The prune request is cleared before the prune locks are
    applied rather than after selection, which differs only if selection
    throws.
    
    An Assume checks that the pruned flag is set before files are queued
    for deletion, so a restart knows blocks were deleted.
    777b2f90de
  10. DrahtBot added the label Refactoring on Nov 2, 2026
  11. DrahtBot commented at 11:58 PM on November 2, 2026: contributor

    <!--e57a25ab6845829454e8d69fc972939a-->

    The following sections might be updated with supplementary metadata relevant to reviewers and maintainers.

    <!--006a51241073e994b41acfe9ec718e94-->

    External sites

    <!--021abf342d371248e50ceaed478a90ca-->

    Reviews

    See the guideline and AI policy for information on the review process. A summary of reviews will appear here.

    <!--174a7506f384e20aa4161008e828411d-->

    Conflicts

    Reviewers, this pull request conflicts with the following ones:

    • #36621 <sub><img src="https://drahtbot.space/ack_count/bitcoin/bitcoin/36621.svg"></sub> (node: batch block file pruning in a single pass over block index by mutatrum)
    • #36326 <sub><img src="https://drahtbot.space/ack_count/bitcoin/bitcoin/36326.svg"></sub> (kernel: Use typed errors for fatal and flush error notifications by arejula27)
    • #36033 <sub><img src="https://drahtbot.space/ack_count/bitcoin/bitcoin/36033.svg"></sub> ([wip,nomerge,rfc] build: Require C++23 compiler by maflcko)
    • #35570 <sub><img src="https://drahtbot.space/ack_count/bitcoin/bitcoin/35570.svg"></sub> (refactor: Change some validation.cpp methods to return BlockValidationState by optout21)
    • #34534 <sub><img src="https://drahtbot.space/ack_count/bitcoin/bitcoin/34534.svg"></sub> (rpc: Manual prune lock management (Take 2) by fjahr)
    • #31260 <sub><img src="https://drahtbot.space/ack_count/bitcoin/bitcoin/31260.svg"></sub> (scripted-diff: Type-safe settings retrieval by ryanofsky)

    If you consider this pull request important, please also help to review the conflicting pull requests. Ideally, start with the one that should be merged first.

    <!--5faf32d7da4f0f540f40219e4f7537a3-->


github-metadata-mirror

This is a metadata mirror of the GitHub repository bitcoin/bitcoin. This site is not affiliated with GitHub. Content is generated from a GitHub metadata backup.
generated: 2026-11-09 21:51 UTC

This site is hosted by @0xB10C
More mirrored repositories can be found on mirror.b10c.me