validation: Reduce direct g_chainman usage#19927
Conversation
maflcko
left a comment
There was a problem hiding this comment.
Concept ACK. I did similar changes or was planning to do them.
|
Concept ACK; helps reduce globals, supports fuzzing. |
|
Concept ACK |
jnewbery
left a comment
There was a problem hiding this comment.
Concept ACK.
I think you may as well clean up the code as you're moving it. No need to retain comments that are no longer useful, for example.
|
I get this warning: Another proposed change: pass as a ref instead (I see this was discussed above). |
~CMainCleanup: 1. Is vestigial 2. References the g_chainman global (we should minimize g_chainman refs) 3. Only acts on g_chainman.m_blockman 4. Does the same thing as BlockManager::Unload
86cb85e to
cdd2063
Compare
|
Thank you MarcoFalke, jnewbery, and Empact for the code review! Marco: Note: I will push a commit to remove the comments and assertions in 84d983656f1927955e516a94366b7c216bacded3 once I get the first Code Review ACK. |
jnewbery
left a comment
There was a problem hiding this comment.
utACK cdd2063bbe8b8df4db42c81ee7913e2dc0b2387a
Just a couple of style suggestions inline. Feel free to ignore.
ryanofsky
left a comment
There was a problem hiding this comment.
Code review ACK cdd2063bbe8b8df4db42c81ee7913e2dc0b2387a. Seems good and can re-ack if an extra assert-cleanup commit will be added.
[META] This is a pure refactor commit.
Move PruneBlockFile to BlockManager because:
1. PruneOneBlockFile only acts on BlockManager
2. Eliminates the need for callers (FindFilesToPrune{,Manual}) to have a
reference to the larger ChainstateManager, just a reference to
BlockManager is enough. See following commits.
cdd2063 to
75142a7
Compare
|
Got a code review ACK, just pushed a version which:
This is now ready for final review and (hopefully) merge. |
|
code review ACK 75142a7bd7890f2e14920dbe9701ada2cbc2326f |
ryanofsky
left a comment
There was a problem hiding this comment.
Code review ACK 75142a7bd7890f2e14920dbe9701ada2cbc2326f. Since last review just new commit removing asserts, new commit cleaning up whitespace, and a newline fix in earlier commit
|
The following sections might be updated with supplementary metadata relevant to reviewers and maintainers. ConflictsReviewers, this pull request conflicts with the following ones:
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. |
|
Previously those methods were private ( What do you think about turning them E.g. diff --git a/src/validation.h b/src/validation.h
index cc5e36acfc..bc9b136039 100644
--- a/src/validation.h
+++ b/src/validation.h
@@ -357,7 +357,12 @@ struct CBlockIndexWorkComparator
* This data is used mostly in `CChainState` - information about, e.g.,
* candidate tips is not maintained here.
*/
-class BlockManager {
+class BlockManager
+{
+ friend CChainState;
+ void FindFilesToPruneManual(std::set<int>& setFilesToPrune, int nManualPruneHeight, int chain_tip_height);
+ void FindFilesToPrune(std::set<int>& setFilesToPrune, uint64_t nPruneAfterHeight, int chain_tip_height, bool is_ibd);
+
public:
BlockMap m_block_index GUARDED_BY(cs_main);
@@ -411,24 +416,6 @@ public:
//! Mark one block file as pruned (modify associated database entries)
void PruneOneBlockFile(const int fileNumber) EXCLUSIVE_LOCKS_REQUIRED(cs_main);
- /* Calculate the block/rev files to delete based on height specified by user with RPC command pruneblockchain */
- void FindFilesToPruneManual(std::set<int>& setFilesToPrune, int nManualPruneHeight, int chain_tip_height);
- /**
- * Prune block and undo files (blk???.dat and undo???.dat) so that the disk space used is less than a user-defined target.
- * The user sets the target (in MB) on the command line or in config file. This will be run on startup and whenever new
- * space is allocated in a block or undo file, staying below the target. Changing back to unpruned requires a reindex
- * (which in this case means the blockchain must be re-downloaded.)
- *
- * Pruning functions are called from FlushStateToDisk when the global fCheckForPruning flag has been set.
- * Block and undo files are deleted in lock-step (when blk00003.dat is deleted, so is rev00003.dat.)
- * Pruning cannot take place until the longest chain is at least a certain length (100000 on mainnet, 1000 on testnet, 1000 on regtest).
- * Pruning will never delete a block within a defined distance (currently 288) from the active chain's tip.
- * The block index is updated by unsetting HAVE_DATA and HAVE_UNDO for any blocks that were stored in the deleted files.
- * A db flag records the fact that at least some block files have been pruned.
- *
- * @param[out] setFilesToPrune The set of file indices that can be unlinked will be returned
- */
- void FindFilesToPrune(std::set<int>& setFilesToPrune, uint64_t nPruneAfterHeight, int chain_tip_height, bool is_ibd);
/**
* If a block header hasn't already been seen, call CheckBlockHeader on it, ensure
* that it doesn't descend from an invalid block, and then add it to m_block_index. |
|
cr ACK 75142a7bd7890f2e14920dbe9701ada2cbc2326f 😺 Show signature and timestampSignature: Timestamp of file with hash |
[META] No behaviour change is intended in this commit.
[META] This commit should be followed up by removing the comments and
assertions meant only to show that the change is correct.
Also stop FindFilesToPrune{,Manual} from unnecessary reaching for
::ChainActive() by passing in the necessary information.
[META] This is a pure style commit.
[META] This is a pure comment commit. They belong in the member declarations in the header file.
[META] This is a followup to "validation: Move FindFilesToPrune{,Manual}
to BlockManager" removing comments and assertions meant only to
show that the change is correct.
75142a7 to
72a1d5c
Compare
|
Made Previous code reviewers: this change can be reviewed with: git diff 75142a7 72a1d5c |
| friend CChainState; | ||
|
|
||
| private: | ||
| /* Calculate the block/rev files to delete based on height specified by user with RPC command pruneblockchain */ |
There was a problem hiding this comment.
(Only if you retouch the branch again) Make this a doxygen comment (start with /**). Also line-wrap this comment and the one below at something sensible 🙂
|
re-ACK 72a1d5c 👚 Show signature and timestampSignature: Timestamp of file with hash |
72a1d5c validation: Remove review-only comments + assertions (Carl Dong) 3756853 docs: Move FindFilesToPrune{,Manual} doxygen comment (Carl Dong) 485899a style: Make FindFilesToPrune{,Manual} match style guide (Carl Dong) 3f5b5f3 validation: Move FindFilesToPrune{,Manual} to BlockManager (Carl Dong) f8d4975 validation: Move PruneOneBlockFile to BlockManager (Carl Dong) 74f73c7 validation: Pass in chainman to UnloadBlockIndex (Carl Dong) 4668ded validation: Move ~CMainCleanup logic to ~BlockManager (Carl Dong) Pull request description: This PR paves the way for de-globalizing `g_chainman` entirely by removing the usage of `g_chainman` in the following functions/methods: - `~CMainCleanup` - `CChainState::FlushStateToDisk` - `UnloadBlockIndex` The remaining direct uses of `g_chainman` are as follows: 1. In initialization codepaths: - `AppTests` - `AppInitMain` - `TestingSetup::TestingSetup` 2. `::ChainstateActive` 3. `LookupBlockIndex` - Note: `LookupBlockIndex` is used extensively throughout the codebase and require a much larger set of changes, therefore I've left it out of this initial PR ACKs for top commit: MarcoFalke: re-ACK 72a1d5c 👚 jnewbery: utACK 72a1d5c Tree-SHA512: 944a4fa8405eecf39706ff944375d6824373aaeea849d11473f08181eff26b12f70043a8348a5b08e6e9021b243b481842fbdfbc7c3140ca795fce3688b7f5c3
In preparation for removing `cs_main` requirements for ChainstateActive()/ActiveChainstate(), relax lock requirements for g_chainman. I have verified that all usages of `g_chainman` that are concurrency-sensitive are usages of its members (e.g. `m_blockman`), which are already annotated. The references to `g_chainman.m_active_chainstate` will be protected by use of `std::atomic` in later commits. Here are all non-`BlockManager`-related usages: ``` % rg --pcre2 --trim 'g_chainman(?!.m_blockman)' src/net_processing.cpp 1271:assert(std::addressof(g_chainman) == std::addressof(m_chainman)); src/validation.h 994:extern ChainstateManager g_chainman; src/init.cpp 1423:node.chainman = &g_chainman; doc/release-notes/release-notes-0.21.0.md 577:- bitcoin#19927 Reduce direct `g_chainman` usage (dongcarl) src/validation.cpp 105:ChainstateManager g_chainman; 109:assert(g_chainman.m_active_chainstate); 110:return *g_chainman.m_active_chainstate; 174:assert(std::addressof(g_chainman.BlockIndex()) == std::addressof(m_block_index)); src/node/interfaces.cpp 479:assert(std::addressof(g_chainman) == std::addressof(*m_node.chainman)); 489:assert(std::addressof(g_chainman) == std::addressof(*m_node.chainman)); 502:assert(std::addressof(g_chainman) == std::addressof(*m_node.chainman)); 514:assert(std::addressof(g_chainman) == std::addressof(*m_node.chainman)); 516:assert(std::addressof(g_chainman) == std::addressof(*m_node.chainman)); 525:assert(std::addressof(g_chainman) == std::addressof(*m_node.chainman)); 527:assert(std::addressof(g_chainman) == std::addressof(*m_node.chainman)); src/test/util/setup_common.cpp 143:m_node.chainman = &::g_chainman; src/qt/test/apptests.cpp 89:UnloadBlockIndex(/* mempool */ nullptr, g_chainman); 90:g_chainman.Reset(); ```
Summary: PR description: > This PR paves the way for de-globalizing g_chainman entirely by removing the usage of g_chainman in the following functions/methods: > > - ~CMainCleanup > - CChainState::FlushStateToDisk > - UnloadBlockIndex > > The remaining direct uses of g_chainman are as follows: > > - In initialization codepaths: > - AppTests > - AppInitMain > - TestingSetup::TestingSetup > - ::ChainstateActive > - LookupBlockIndex > Note: LookupBlockIndex is used extensively throughout the codebase and require a much larger set of changes, therefore I've left it out of this initial PR ~CMainCleanup: 1. Is vestigial 2. References the g_chainman global (we should minimize g_chainman refs) 3. Only acts on g_chainman.m_blockman 4. Does the same thing as BlockManager::Unload This is a backport of [[bitcoin/bitcoin#19927 | core#19927]] [1/6] bitcoin/bitcoin@4668ded Backport note: there were 7 commits in the original PR, but one of those commits is only touching style and is not relevant to us as the linter already fixed the style. Test Plan: `ninja all check-all` Reviewers: #bitcoin_abc, majcosta Reviewed By: #bitcoin_abc, majcosta Differential Revision: https://reviews.bitcoinabc.org/D9820
Summary: This is a backport of [[bitcoin/bitcoin#19927 | core#19927]] [2/6] bitcoin/bitcoin@74f73c7 Depends on D9820 Test Plan: `ninja all check-all` Reviewers: #bitcoin_abc, majcosta Reviewed By: #bitcoin_abc, majcosta Differential Revision: https://reviews.bitcoinabc.org/D9821
Summary:
[META] This is a pure refactor commit.
Move PruneBlockFile to BlockManager because:
1. PruneOneBlockFile only acts on BlockManager
2. Eliminates the need for callers (FindFilesToPrune{,Manual}) to have a
reference to the larger ChainstateManager, just a reference to
BlockManager is enough. See following commits.
This is a backport of [[bitcoin/bitcoin#19927 | core#19927]] [3/6]
bitcoin/bitcoin@f8d4975
Depends on D9821
Test Plan: `ninja all check-all`
Reviewers: #bitcoin_abc, majcosta
Reviewed By: #bitcoin_abc, majcosta
Differential Revision: https://reviews.bitcoinabc.org/D9822
Summary: [META] This is a pure comment commit. They belong in the member declarations in the header file. This is a backport of [[bitcoin/bitcoin#19927 | core#19927]] [5/6] bitcoin/bitcoin@3756853 Depends on D9823 Test Plan: NA Reviewers: #bitcoin_abc, majcosta Reviewed By: #bitcoin_abc, majcosta Differential Revision: https://reviews.bitcoinabc.org/D9824
Summary:
[META] This is a followup to "validation: Move FindFilesToPrune{,Manual} to BlockManager" removing comments and assertions meant only to show that the change is correct.
This is a backport of [[bitcoin/bitcoin#19927 | core#19927]] [6/6]
bitcoin/bitcoin@72a1d5c
Depends on D9824
Test Plan: `ninja all check-all`
Reviewers: #bitcoin_abc, majcosta
Reviewed By: #bitcoin_abc, majcosta
Differential Revision: https://reviews.bitcoinabc.org/D9825
This PR paves the way for de-globalizing
g_chainmanentirely by removing the usage ofg_chainmanin the following functions/methods:~CMainCleanupCChainState::FlushStateToDiskUnloadBlockIndexThe remaining direct uses of
g_chainmanare as follows:AppTestsAppInitMainTestingSetup::TestingSetup::ChainstateActiveLookupBlockIndexLookupBlockIndexis used extensively throughout the codebase and require a much larger set of changes, therefore I've left it out of this initial PR