#pragma once #include #include #include #include #include namespace DB { struct UncompressedCacheCell { Memory data; size_t compressed_size; }; struct UncompressedSizeWeightFunction { size_t operator()(const UncompressedCacheCell & x) const { return x.data.size(); } }; /** Кэш разжатых блоков для CachedCompressedReadBuffer. thread-safe. */ class UncompressedCache : public LRUCache { private: typedef LRUCache Base; public: UncompressedCache(size_t max_size_in_bytes) : Base(max_size_in_bytes) {} /// Посчитать ключ от пути к файлу и смещения. 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; } }; typedef Poco::SharedPtr UncompressedCachePtr; }