From 0e10937184438f8d81940336b183267e59f959b7 Mon Sep 17 00:00:00 2001 From: Andrew Toth Date: Fri, 13 Mar 2026 13:32:12 -0400 Subject: [PATCH] fuzz: add coins_view_stacked fuzz harness to test concurrent leveldb reads --- src/test/fuzz/coins_view.cpp | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/src/test/fuzz/coins_view.cpp b/src/test/fuzz/coins_view.cpp index 62f7461442d..52c7f031dc7 100644 --- a/src/test/fuzz/coins_view.cpp +++ b/src/test/fuzz/coins_view.cpp @@ -449,3 +449,25 @@ FUZZ_TARGET(coins_view_overlay, .init = initialize_coins_view) EXCLUSIVE_LOCKS_R const auto reset_guard{coins_view_cache.StartFetching(block)}; TestCoinsView(fuzzed_data_provider, coins_view_cache, &backend_cache); } + +FUZZ_TARGET(coins_view_stacked, .init = initialize_coins_view) EXCLUSIVE_LOCKS_REQUIRED(!g_thread_pool_mutex) +{ + SeedRandomStateForTest(SeedRand::ZEROS); // for SaltedTxidHasher + StartPoolIfNeeded(); + FuzzedDataProvider fuzzed_data_provider{buffer.data(), buffer.size()}; + auto db_params = DBParams{ + .path = "", + .cache_bytes = 1_MiB, + .memory_only = true, + }; + CCoinsViewDB backend_base_coins_view{std::move(db_params), CoinsViewOptions{}}; + CCoinsViewCache backend_cache{&backend_base_coins_view, /*deterministic=*/true}; + TestCoinsView(fuzzed_data_provider, backend_cache, &backend_base_coins_view); + CoinsViewOverlay coins_view_cache{&backend_cache, g_thread_pool, /*deterministic=*/true}; + CBlock block{BuildRandomBlock(fuzzed_data_provider, backend_base_coins_view)}; + { + const auto reset_guard{coins_view_cache.StartFetching(block)}; + TestCoinsView(fuzzed_data_provider, coins_view_cache, &backend_cache); + } + TestCoinsView(fuzzed_data_provider, backend_cache, &backend_base_coins_view); +}