mirror of
https://github.com/bitcoin/bitcoin.git
synced 2026-06-01 16:53:52 +02:00
Merge #18960: indexes: Add compact block filter headers cache
0187d4c118[indexes] Add compact block filter headers cache (John Newbery) Pull request description: Cache block filter headers at heights of multiples of 1000 in memory. Block filter headers at height 1000x are checkpointed, and will be the most frequently requested. Cache them in memory to avoid costly disk reads. ACKs for top commit: jkczyz: ACK0187d4c118theStack: ACK0187d4c118🎉 fjahr: re-utACK0187d4c118laanwj: code review ACK0187d4c118ariard: Code Review ACK0187d4c. Tree-SHA512: 2075ae36901ebcdc4a217eae5203ebc8582181a0831fb7a53a119f031c46bca960a610a38a3d0636a9a405f713efcf4200c85f10c8559fd80139036d89473c56
This commit is contained in:
@@ -31,6 +31,12 @@ constexpr char DB_FILTER_POS = 'P';
|
||||
constexpr unsigned int MAX_FLTR_FILE_SIZE = 0x1000000; // 16 MiB
|
||||
/** The pre-allocation chunk size for fltr?????.dat files */
|
||||
constexpr unsigned int FLTR_FILE_CHUNK_SIZE = 0x100000; // 1 MiB
|
||||
/** Maximum size of the cfheaders cache
|
||||
* We have a limit to prevent a bug in filling this cache
|
||||
* potentially turning into an OOM. At 2000 entries, this cache
|
||||
* is big enough for a 2,000,000 length block chain, which
|
||||
* we should be enough until ~2047. */
|
||||
constexpr size_t CF_HEADERS_CACHE_MAX_SZ{2000};
|
||||
|
||||
namespace {
|
||||
|
||||
@@ -377,13 +383,32 @@ bool BlockFilterIndex::LookupFilter(const CBlockIndex* block_index, BlockFilter&
|
||||
return ReadFilterFromDisk(entry.pos, filter_out);
|
||||
}
|
||||
|
||||
bool BlockFilterIndex::LookupFilterHeader(const CBlockIndex* block_index, uint256& header_out) const
|
||||
bool BlockFilterIndex::LookupFilterHeader(const CBlockIndex* block_index, uint256& header_out)
|
||||
{
|
||||
LOCK(m_cs_headers_cache);
|
||||
|
||||
bool is_checkpoint{block_index->nHeight % CFCHECKPT_INTERVAL == 0};
|
||||
|
||||
if (is_checkpoint) {
|
||||
// Try to find the block in the headers cache if this is a checkpoint height.
|
||||
auto header = m_headers_cache.find(block_index->GetBlockHash());
|
||||
if (header != m_headers_cache.end()) {
|
||||
header_out = header->second;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
DBVal entry;
|
||||
if (!LookupOne(*m_db, block_index, entry)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (is_checkpoint &&
|
||||
m_headers_cache.size() < CF_HEADERS_CACHE_MAX_SZ) {
|
||||
// Add to the headers cache if this is a checkpoint height.
|
||||
m_headers_cache.emplace(block_index->GetBlockHash(), entry.header);
|
||||
}
|
||||
|
||||
header_out = entry.header;
|
||||
return true;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user