/
smychkov
/
SStorage
Обзор
Документация
Войти
/
smychkov
/
SStorage
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
src/core/record.hpp
93 строки
4 KB
Андрей Смычков
feat: Record class (bytes key/value, seqNo, tombstone)
25 апр 2026, 09:00
25 апр 2026, 09:00
f7ec976
Код
Авторство
О чём код?
#ifndef SSTORAGE_CORE_RECORD_HPP #define SSTORAGE_CORE_RECORD_HPP //============================================================================ // Класс Record — единица данных в LSM-tree (замена старого Row) //============================================================================ // Ключ и значение — bytes (std::string как контейнер байтов, как в Bigtable). // seqNo — монотонно возрастающий номер записи, используется для: // - упоря��очивания версий одного и того же key (latest wins) // - tie-break при compaction (более новая запись побеждает старую) // tombstone — флаг удаления. Удаление = зап��сь tombstone с тем же key. // // Сериализация (используется в WAL, MemTable dump, SSTable data block): // [varint: keyLen][bytes: key] // [byte: flags] bit 0 = tombstone // [varint: valueLen] 0 для tombstone // [bytes: value] отсутствует если tombstone // [varint: seqNo] //============================================================================ #include <cstdint> #include <optional> #include <string> namespace sstorage { // Флаги записи (1 байт в сериализован��ом виде) enum class RecordFlags : uint8_t { kNone = 0, kTombstone = 1, }; class Record { public: // Конструктор обычной записи (put). Record(std::string key, std::string value, uint64_t seqNo); // Фабрика tombstone-записи (delete). static Record makeTombstone(std::string key, uint64_t seqNo); // Пустой Record (для десериализации). Record() = default; //------------------------------------------------------------------ // Аксессоры //------------------------------------------------------------------ const std::string& key() const { return key_; } const std::string& value() const { return value_; } uint64_t seqNo() const { return seqNo_; } bool isTombstone() const { return tombstone_; } //------------------------------------------------------------------ // Упорядочивание: по key ASC, при равных key — по seqNo DESC. // Это даёт LSM-порядок: для одного key сначала идёт самая свежая версия. //------------------------------------------------------------------ bool operator<(const Record& other) const; bool operator==(const Record& other) const; //------------------------------------------------------------------ // Сериализация: дописать байты в out. //------------------------------------------------------------------ void serialize(std::string& out) const; // Десериализация из буфера. // @param data — начало буфера // @param len — доступный размер // @param consumed — сколько байт было прочитано (при успехе) // @return распарсенный Record или nullopt при ошибке static std::optional<Record> deserialize(const char* data, size_t len, size_t& consumed); //------------------------------------------------------------------ // Приблизительный размер в памяти (key + value + overhead). // Используется MemTable для оценки заполненности. //------------------------------------------------------------------ size_t approximateSize() const; //------------------------------------------------------------------ // Размер сериализованного представления в байтах. // Без аллокации: только считает длину. //------------------------------------------------------------------ size_t serializedSize() const; private: std::string key_; std::string value_; uint64_t seqNo_ = 0; bool tombstone_ = false; }; } #endif