nit: This can be ignored or left for a follow-up. The test could also assert that the configured cache budget reaches the chainstate cache split for stronger coverage.
<details>
<summary>diff</summary>
diff --git a/src/kernel/bitcoinkernel.cpp b/src/kernel/bitcoinkernel.cpp
index c26d2a98c7..36360fcdd9 100644
--- a/src/kernel/bitcoinkernel.cpp
+++ b/src/kernel/bitcoinkernel.cpp
@@ -1071,6 +1071,16 @@ btck_ChainstateManager* btck_chainstate_manager_create(
return btck_ChainstateManager::create(std::move(chainman), opts.m_context);
}
+btck_ChainstateManagerCacheSizes btck_chainstate_manager_get_cache_sizes(
+ const btck_ChainstateManager* chainman)
+{
+ const auto& manager{*btck_ChainstateManager::get(chainman).m_chainman};
+ return {
+ .coins_db_cache_bytes = manager.m_total_coinsdb_cache,
+ .coins_tip_cache_bytes = manager.m_total_coinstip_cache,
+ };
+}
+
const btck_BlockTreeEntry* btck_chainstate_manager_get_block_tree_entry_by_hash(const btck_ChainstateManager* chainman, const btck_BlockHash* block_hash)
{
auto block_index = WITH_LOCK(btck_ChainstateManager::get(chainman).m_chainman->GetMutex(),
diff --git a/src/kernel/bitcoinkernel.h b/src/kernel/bitcoinkernel.h
index 3c9e34fe72..02ee7a5269 100644
--- a/src/kernel/bitcoinkernel.h
+++ b/src/kernel/bitcoinkernel.h
@@ -226,6 +226,12 @@ typedef struct btck_ChainstateManagerOptions btck_ChainstateManagerOptions;
*/
typedef struct btck_ChainstateManager btck_ChainstateManager;
+/** Cache sizes selected for a chainstate manager. */
+typedef struct {
+ size_t coins_db_cache_bytes; //!< LevelDB cache reserved for the coins database.
+ size_t coins_tip_cache_bytes; //!< In-memory coins cache.
+} btck_ChainstateManagerCacheSizes;
+
/**
* Opaque data structure for holding a block.
*/
@@ -1249,6 +1255,15 @@ BITCOINKERNEL_API void btck_chainstate_manager_options_destroy(btck_ChainstateMa
BITCOINKERNEL_API btck_ChainstateManager* BITCOINKERNEL_WARN_UNUSED_RESULT btck_chainstate_manager_create(
const btck_ChainstateManagerOptions* chainstate_manager_options) BITCOINKERNEL_ARG_NONNULL(1);
+/**
+ * [@brief](/bitcoin-bitcoin/contributor/brief/) Get the cache sizes selected for a chainstate manager.
+ *
+ * [@param](/bitcoin-bitcoin/contributor/param/)[in] chainstate_manager Non-null.
+ * [@return](/bitcoin-bitcoin/contributor/return/) The chainstate cache sizes in bytes.
+ */
+BITCOINKERNEL_API btck_ChainstateManagerCacheSizes btck_chainstate_manager_get_cache_sizes(
+ const btck_ChainstateManager* chainstate_manager) BITCOINKERNEL_ARG_NONNULL(1);
+
/**
* [@brief](/bitcoin-bitcoin/contributor/brief/) Get the btck_BlockTreeEntry whose associated btck_BlockHeader has the most
* known cumulative proof of work.
diff --git a/src/kernel/bitcoinkernel_wrapper.h b/src/kernel/bitcoinkernel_wrapper.h
index a2b0ceaf9c..752ff4165b 100644
--- a/src/kernel/bitcoinkernel_wrapper.h
+++ b/src/kernel/bitcoinkernel_wrapper.h
@@ -1165,6 +1165,11 @@ public:
}
};
+struct ChainstateManagerCacheSizes {
+ size_t coins_db;
+ size_t coins_tip;
+};
+
class ChainView : public View<btck_Chain>
{
public:
@@ -1302,6 +1307,12 @@ public:
{
}
+ ChainstateManagerCacheSizes GetCacheSizes() const
+ {
+ const auto sizes{btck_chainstate_manager_get_cache_sizes(get())};
+ return {sizes.coins_db_cache_bytes, sizes.coins_tip_cache_bytes};
+ }
+
bool ImportBlocks(const std::span<const std::string> paths)
{
std::vector<const char*> c_paths;
diff --git a/src/test/kernel/test_kernel.cpp b/src/test/kernel/test_kernel.cpp
index 780164cfcd..e11f1cefa5 100644
--- a/src/test/kernel/test_kernel.cpp
+++ b/src/test/kernel/test_kernel.cpp
@@ -783,6 +783,9 @@ BOOST_AUTO_TEST_CASE(btck_chainman_tests)
BOOST_CHECK(chainman_opts.SetWipeDbs(/*wipe_block_tree=*/false, /*wipe_chainstate=*/true));
BOOST_CHECK(chainman_opts.SetWipeDbs(/*wipe_block_tree=*/false, /*wipe_chainstate=*/false));
ChainMan chainman{context, chainman_opts};
+ const auto cache_sizes{chainman.GetCacheSizes()};
+ BOOST_CHECK_EQUAL(cache_sizes.coins_db, 8_MiB);
+ BOOST_CHECK_EQUAL(cache_sizes.coins_tip, 990_MiB);
}
std::unique_ptr<ChainMan> create_chainman(TestDirectory& test_directory,
</details>