/
smychkov
/
SStorage
Обзор
Документация
Войти
/
smychkov
/
SStorage
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
src/cache/block_cache.hpp
95 строк
3 KB
Андрей Смычков
feat: LSM tree with levels, flush, compaction, recovery, block cache
25 апр 2026, 09:14
25 апр 2026, 09:14
4631f83
Код
Авторство
О чём код?
#ifndef SSTORAGE_CACHE_BLOCK_CACHE_HPP #define SSTORAGE_CACHE_BLOCK_CACHE_HPP //============================================================================ // BlockCache — LRU-кэш несжатых data blocks SSTable //============================================================================ // Для одного и того же блока возможно множество чтений подряд // (последовательный scan, множественные find к одним и тем же ключам). // Кэш избавляет от повторных pread + декомпрессии. // // Ключ: (fileId, offset). fileId — путь к SSTable-файлу (уникален). // Значение: shared_ptr<std::string> — уже распакованные bytes блока. //============================================================================ #include <cstddef> #include <cstdint> #include <list> #include <memory> #include <mutex> #include <string> #include <unordered_map> namespace sstorage { class BlockCache { public: //------------------------------------------------------------------ // @param capacityBytes — суммарный бюджет памяти (мягкий лимит) //------------------------------------------------------------------ explicit BlockCache(size_t capacityBytes); // Получить блок из кэша. // @return nullptr если блока нет. std::shared_ptr<const std::string> get(const std::string& fileId, uint64_t offset) const; // Положить блок в кэш. void put(const std::string& fileId, uint64_t offset, std::shared_ptr<const std::string> data); // Удалить все блоки конкретного файла (при удалении SSTable). void invalidateFile(const std::string& fileId); // Очистить кэш полностью. void clear(); // Текущее использование памяти. size_t currentBytes() const; // Число блоков в кэше. size_t count() const; private: //------------------------------------------------------------------ // Ключ кэша //------------------------------------------------------------------ struct Key { std::string fileId; uint64_t offset; bool operator==(const Key& o) const { return fileId == o.fileId && offset == o.offset; } }; struct KeyHash { size_t operator()(const Key& k) const noexcept { // FNV-1a-подобное смешивание строки и uint64 size_t h = std::hash<std::string>()(k.fileId); h ^= std::hash<uint64_t>()(k.offset) + 0x9E3779B9 + (h << 6) + (h >> 2); return h; } }; //------------------------------------------------------------------ // Запись LRU-списка //------------------------------------------------------------------ struct Entry { Key key; std::shared_ptr<const std::string> data; size_t size; }; // Удалить хвост пока currentBytes_ > capacity void evictLocked(); size_t capacity_; size_t currentBytes_ = 0; mutable std::mutex mutex_; std::list<Entry> lru_; // front — свежее, back — старейшее std::unordered_map<Key, std::list<Entry>::iterator, KeyHash> map_; }; } #endif