#pragma once #include #include #include #include #include namespace ProfileEvents { extern const Event UncompressedCacheHits; extern const Event UncompressedCacheMisses; extern const Event UncompressedCacheWeightLost; } namespace DB { struct UncompressedCacheCell { Memory data; size_t compressed_size; }; struct UncompressedSizeWeightFunction { size_t operator()(const UncompressedCacheCell & x) const { return x.data.size(); } }; /** Cache of decompressed blocks for implementation of CachedCompressedReadBuffer. thread-safe. */ class UncompressedCache : public LRUCache { private: using Base = LRUCache; public: UncompressedCache(size_t max_size_in_bytes) : Base(max_size_in_bytes) {} /// Calculate key from path to file and offset. static UInt128 hash(const String & path_to_file, size_t offset) { UInt128 key; SipHash hash; hash.update(path_to_file.data(), path_to_file.size() + 1); hash.update(reinterpret_cast(&offset), sizeof(offset)); hash.get128(key.first, key.second); return key; } MappedPtr get(const Key & key) { MappedPtr res = Base::get(key); if (res) ProfileEvents::increment(ProfileEvents::UncompressedCacheHits); else ProfileEvents::increment(ProfileEvents::UncompressedCacheMisses); return res; } void set(const Key & key, MappedPtr mapped) { Base::set(key, mapped); ProfileEvents::increment(ProfileEvents::UncompressedCacheWeightLost, current_weight_lost); current_weight_lost = 0; } }; using UncompressedCachePtr = std::shared_ptr; }