From 629f3a417712f1e1edd2ae249118762c20983f41 Mon Sep 17 00:00:00 2001 From: Marcus Holland-Moritz Date: Thu, 17 Dec 2020 21:36:54 +0100 Subject: [PATCH] Limit LRU cache size --- src/dwarfs/block_cache.cpp | 29 ++++++++++++++++------------- 1 file changed, 16 insertions(+), 13 deletions(-) diff --git a/src/dwarfs/block_cache.cpp b/src/dwarfs/block_cache.cpp index f7ef79f6..1af8ffb8 100644 --- a/src/dwarfs/block_cache.cpp +++ b/src/dwarfs/block_cache.cpp @@ -268,20 +268,23 @@ class block_cache_ : public block_cache::impl { void set_block_size(size_t size) override { // XXX: This currently inevitably clears the cache auto max_blocks = std::max(options_.max_bytes / size, 1); - { - std::lock_guard lock(mx_); - cache_.~lru_type(); - new (&cache_) lru_type(max_blocks); - cache_.setPruneHook( - [this](size_t block_no, std::shared_ptr&& block) { - LOG_DEBUG << "evicting block " << block_no - << " from cache, decompression ratio = " - << double(block->range_end()) / - double(block->uncompressed_size()); - ++blocks_evicted_; - update_block_stats(*block); - }); + + if (!block_.empty() && max_blocks > block_.size()) { + max_blocks = block_.size(); } + + std::lock_guard lock(mx_); + cache_.~lru_type(); + new (&cache_) lru_type(max_blocks); + cache_.setPruneHook( + [this](size_t block_no, std::shared_ptr&& block) { + LOG_DEBUG << "evicting block " << block_no + << " from cache, decompression ratio = " + << double(block->range_end()) / + double(block->uncompressed_size()); + ++blocks_evicted_; + update_block_stats(*block); + }); } std::future