LCOV - code coverage report
Current view: top level - src/node - caches.cpp (source / functions) Coverage Total Hit
Test: fuzz_coverage.info Lines: 39.1 % 23 9
Test Date: 2025-10-10 04:04:55 Functions: 66.7 % 3 2
Branches: 23.1 % 26 6

             Branch data     Line data    Source code
       1                 :             : // Copyright (c) 2021-2022 The Bitcoin Core developers
       2                 :             : // Distributed under the MIT software license, see the accompanying
       3                 :             : // file COPYING or http://www.opensource.org/licenses/mit-license.php.
       4                 :             : 
       5                 :             : #include <node/caches.h>
       6                 :             : 
       7                 :             : #include <common/args.h>
       8                 :             : #include <common/system.h>
       9                 :             : #include <index/txindex.h>
      10                 :             : #include <kernel/caches.h>
      11                 :             : #include <logging.h>
      12                 :             : #include <node/interface_ui.h>
      13                 :             : #include <tinyformat.h>
      14                 :             : #include <util/byte_units.h>
      15                 :             : 
      16                 :             : #include <algorithm>
      17                 :             : #include <string>
      18                 :             : 
      19                 :             : // Unlike for the UTXO database, for the txindex scenario the leveldb cache make
      20                 :             : // a meaningful difference: https://github.com/bitcoin/bitcoin/pull/8273#issuecomment-229601991
      21                 :             : //! Max memory allocated to tx index DB specific cache in bytes.
      22                 :             : static constexpr size_t MAX_TX_INDEX_CACHE{1024_MiB};
      23                 :             : //! Max memory allocated to all block filter index caches combined in bytes.
      24                 :             : static constexpr size_t MAX_FILTER_INDEX_CACHE{1024_MiB};
      25                 :             : //! Maximum dbcache size on 32-bit systems.
      26                 :             : static constexpr size_t MAX_32BIT_DBCACHE{1024_MiB};
      27                 :             : 
      28                 :             : namespace node {
      29                 :         858 : size_t CalculateDbCacheBytes(const ArgsManager& args)
      30                 :             : {
      31   [ +  -  -  + ]:        1716 :     if (auto db_cache{args.GetIntArg("-dbcache")}) {
      32         [ #  # ]:           0 :         if (*db_cache < 0) db_cache = 0;
      33         [ #  # ]:           0 :         const uint64_t db_cache_bytes{SaturatingLeftShift<uint64_t>(*db_cache, 20)};
      34                 :           0 :         constexpr auto max_db_cache{sizeof(void*) == 4 ? MAX_32BIT_DBCACHE : std::numeric_limits<size_t>::max()};
      35         [ #  # ]:           0 :         return std::max<size_t>(MIN_DB_CACHE, std::min<uint64_t>(db_cache_bytes, max_db_cache));
      36                 :             :     }
      37                 :             :     return DEFAULT_DB_CACHE;
      38                 :             : }
      39                 :             : 
      40                 :         858 : CacheSizes CalculateCacheSizes(const ArgsManager& args, size_t n_indexes)
      41                 :             : {
      42                 :         858 :     size_t total_cache{CalculateDbCacheBytes(args)};
      43                 :             : 
      44                 :         858 :     IndexCacheSizes index_sizes;
      45   [ +  -  +  -  :        1716 :     index_sizes.tx_index = std::min(total_cache / 8, args.GetBoolArg("-txindex", DEFAULT_TXINDEX) ? MAX_TX_INDEX_CACHE : 0);
                   -  + ]
      46                 :         858 :     total_cache -= index_sizes.tx_index;
      47         [ -  + ]:         858 :     if (n_indexes > 0) {
      48         [ #  # ]:           0 :         size_t max_cache = std::min(total_cache / 8, MAX_FILTER_INDEX_CACHE);
      49                 :           0 :         index_sizes.filter_index = max_cache / n_indexes;
      50                 :           0 :         total_cache -= index_sizes.filter_index * n_indexes;
      51                 :             :     }
      52                 :         858 :     return {index_sizes, kernel::CacheSizes{total_cache}};
      53                 :             : }
      54                 :             : 
      55                 :           0 : void LogOversizedDbCache(const ArgsManager& args) noexcept
      56                 :             : {
      57         [ #  # ]:           0 :     if (const auto total_ram{GetTotalRAM()}) {
      58                 :           0 :         const size_t db_cache{CalculateDbCacheBytes(args)};
      59   [ #  #  #  # ]:           0 :         if (ShouldWarnOversizedDbCache(db_cache, *total_ram)) {
      60                 :           0 :             InitWarning(bilingual_str{tfm::format(_("A %zu MiB dbcache may be too large for a system memory of only %zu MiB."),
      61                 :           0 :                         db_cache >> 20, *total_ram >> 20)});
      62                 :             :         }
      63                 :             :     }
      64                 :           0 : }
      65                 :             : } // namespace node
        

Generated by: LCOV version 2.0-1