From 8f85d36d68ab33ba237407a2ed16667eb149d61f Mon Sep 17 00:00:00 2001 From: TheCharlatan Date: Sun, 17 Nov 2024 22:20:31 +0100 Subject: [PATCH] refactor: Clamp worker threads in ChainstateManager constructor This ensures the options are applied consistently from contexts where they might not pass through the args manager, such as in some tests, or when used through the kernel library. This is similar to the patch applied in 09ef322acc0a88a9e119f74923399598984c68f6. --- src/checkqueue.h | 2 ++ src/node/chainstatemanager_args.cpp | 3 +-- src/node/chainstatemanager_args.h | 2 -- src/validation.cpp | 2 +- src/validation.h | 3 +++ 5 files changed, 7 insertions(+), 5 deletions(-) diff --git a/src/checkqueue.h b/src/checkqueue.h index a1de000714d..d13ee7ddc1e 100644 --- a/src/checkqueue.h +++ b/src/checkqueue.h @@ -5,6 +5,7 @@ #ifndef BITCOIN_CHECKQUEUE_H #define BITCOIN_CHECKQUEUE_H +#include #include #include #include @@ -130,6 +131,7 @@ class CCheckQueue explicit CCheckQueue(unsigned int batch_size, int worker_threads_num) : nBatchSize(batch_size) { + LogInfo("Script verification uses %d additional threads", worker_threads_num); m_worker_threads.reserve(worker_threads_num); for (int n = 0; n < worker_threads_num; ++n) { m_worker_threads.emplace_back([this, n]() { diff --git a/src/node/chainstatemanager_args.cpp b/src/node/chainstatemanager_args.cpp index b86d0b29913..cdc8bdd43e8 100644 --- a/src/node/chainstatemanager_args.cpp +++ b/src/node/chainstatemanager_args.cpp @@ -60,8 +60,7 @@ util::Result ApplyArgsManOptions(const ArgsManager& args, ChainstateManage script_threads += GetNumCores(); } // Subtract 1 because the main thread counts towards the par threads. - opts.worker_threads_num = std::clamp(script_threads - 1, 0, MAX_SCRIPTCHECK_THREADS); - LogPrintf("Script verification uses %d additional threads\n", opts.worker_threads_num); + opts.worker_threads_num = script_threads - 1; if (auto max_size = args.GetIntArg("-maxsigcachesize")) { // 1. When supplied with a max_size of 0, both the signature cache and diff --git a/src/node/chainstatemanager_args.h b/src/node/chainstatemanager_args.h index b2cdba68b8f..af13aa8d3ce 100644 --- a/src/node/chainstatemanager_args.h +++ b/src/node/chainstatemanager_args.h @@ -10,8 +10,6 @@ class ArgsManager; -/** Maximum number of dedicated script-checking threads allowed */ -static constexpr int MAX_SCRIPTCHECK_THREADS{15}; /** -par default (number of script-checking threads, 0 = auto) */ static constexpr int DEFAULT_SCRIPTCHECK_THREADS{0}; diff --git a/src/validation.cpp b/src/validation.cpp index 09308557a9e..87df4aefb6b 100644 --- a/src/validation.cpp +++ b/src/validation.cpp @@ -6260,7 +6260,7 @@ static ChainstateManager::Options&& Flatten(ChainstateManager::Options&& opts) } ChainstateManager::ChainstateManager(const util::SignalInterrupt& interrupt, Options options, node::BlockManager::Options blockman_options) - : m_script_check_queue{/*batch_size=*/128, options.worker_threads_num}, + : m_script_check_queue{/*batch_size=*/128, std::clamp(options.worker_threads_num, 0, MAX_SCRIPTCHECK_THREADS)}, m_interrupt{interrupt}, m_options{Flatten(std::move(options))}, m_blockman{interrupt, std::move(blockman_options)}, diff --git a/src/validation.h b/src/validation.h index f6aeea3faaf..232dd186400 100644 --- a/src/validation.h +++ b/src/validation.h @@ -78,6 +78,9 @@ static constexpr int DEFAULT_CHECKLEVEL{3}; // Setting the target to >= 550 MiB will make it likely we can respect the target. static const uint64_t MIN_DISK_SPACE_FOR_BLOCK_FILES = 550 * 1024 * 1024; +/** Maximum number of dedicated script-checking threads allowed */ +static constexpr int MAX_SCRIPTCHECK_THREADS{15}; + /** Current sync state passed to tip changed callbacks. */ enum class SynchronizationState { INIT_REINDEX,