1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/cocalele-rocksdb

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
HISTORY.md 540 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
Отправлено 03.03.2025 15:56 635da6e

Журнал изменений Rocksdb

Уведомление: Ввод данных для следующего выпуска здесь не осуществляется. Следуйте инструкциям в unreleased_history/README.txt

8.10.0 (15/12/2023)

Новые возможности

  • Обеспечено поддержание асинхронного ввода-вывода для сокращения размера readahead_size путём выполнения поиска в блочном кэше.
  • Добавлено начальное поддержание широколончатых таблиц в WriteBatchWithIndex. Это включает API PutEntity и поддержку широколончатых таблиц в существующих методах чтения (GetFromBatch, GetFromBatchAndDB, MultiGetFromBatchAndDB, и BaseDeltaIterator).

Изменения публичного API

  • Кастомные реализации TablePropertiesCollectorFactory теперь могут вернуть nullptr коллектор для отказа от обработки файла, что снижает вызовы обратного вызова в таких случаях.

Изменения поведения

  • Установлено значение по умолчанию для ReadOptions.auto_readahead_size как true, которое выполняет оптимизации предварительной загрузки для последовательных сканирований при указании iterate_upper_bound и использования блочного кэша.
  • Компактирование может быть запланировано параллельно в дополнительном случае: высокий долг компактирования относительно объёма данных.
  • HyperClockCache теперь имеет встроенные защиты против чрезмерного потребления процессора при экстремальном стрессе, когда нет (или очень мало) вытесняемых записей кэша, что может незначительно увеличить использование памяти в таких условиях. Новый параметр HyperClockCacheOptions::eviction_effort_cap контролирует соотношение пространства и времени ответа. По умолчанию он обычно хорошо балансирован, без заметного влияния на нормальную работу.

Исправление ошибок

  • Исправлено случайное поведение с auto_readahead_size, где операция Prev возвращает ошибку NOT SUPPORTED при изменении направления сканирования с прямого на обратное.
  • Предотвращена двойная подсчета операции записи с транзакциями.
  • Исправлен счётчик WRITE_STALL, который сообщал неверное значение в некоторых случаях.
  • Исправлен поиск через MultiGet в TiersedCache, который переходит к локальному флеш-кэшу и завершается с очень низкой задержкой, то есть до последующего вызова WaitAll, игнорируется, что приводит к ложному отрицательному результату и утечке памяти.

Улучшения производительности

  • Расширены Java API для улучшения согласованности и полноты API.
  1. Расширен RocksDB.get([ColumnFamilyHandle columnFamilyHandle,] ReadOptions opt, ByteBuffer key, ByteBuffer value) для принятия параметров косвенного буфера, а также прямого буфера.
  2. Расширен RocksDB.put([ColumnFamilyHandle columnFamilyHandle,] WriteOptions writeOpts, final ByteBuffer key, final ByteBuffer value) для принятия параметров косвенного буфера, а также прямого буфера.
  3. Добавлены методы RocksDB.merge([ColumnFamilyHandle columnFamilyHandle,] WriteOptions writeOptions, ByteBuffer key, ByteBuffer value) с теми же параметрами, что и put(...), поддерживаются прямой и косвенный буфер.
  4. Добавлены методы RocksIterator.key(byte[] key[, int offset, int len]), которые получают ключ итератора в предоставленный буфер.
  5. Добавлены методы RocksIterator.value(byte[] value[, int offset, int len]), которые получают значение итератора в предоставленный буфер.
  6. Устарели get(final ColumnFamilyHandle columnFamilyHandle, final ReadOptions readOptions, byte[]) в пользу get(final ReadOptions readOptions, final ColumnFamilyHandle columnFamilyHandle, byte[]), который имеет согласованное расположение параметров с другими методами в том же классе.
  7. Добавлены методы Transaction.get(ReadOptions opt, [ColumnFamilyHandle columnFamilyHandle, ] byte[] key, byte[] value).
  8. Добавлены методы Transaction.get(ReadOptions opt, [ColumnFamilyHandle columnFamilyHandle, ] ByteBuffer key, ByteBuffer value).
  9. Добавлены методы Transaction.getForUpdate(ReadOptions readOptions, [ColumnFamilyHandle columnFamilyHandle, ] byte[] key, byte[] value, boolean exclusive[, boolean doValidate]).
  10. Добавлены методы Transaction.getForUpdate(ReadOptions readOptions, [ColumnFamilyHandle columnFamilyHandle, ] ByteBuffer key, ByteBuffer value, boolean exclusive[, boolean doValidate]).
  11. Добавлен метод Transaction.getIterator() как удобство, который по умолчанию использует значение ReadOptions передаваемое в существующие методы Transaction.iterator(). Это зеркалит существующий метод RocksDB.iterator().
  12. Добавлены методы Transaction.put([ColumnFamilyHandle columnFamilyHandle, ] ByteBuffer key, ByteBuffer value[, boolean assumeTracked]), которые предоставляют ключ и значение для записи в параметре ByteBuffer.
  13. Добавлены методы Transaction.merge([ColumnFamilyHandle columnFamilyHandle, ] ByteBuffer key, ByteBuffer value[, boolean assumeTracked]), которые предоставляют ключ и значение для записи/слияния в параметре ByteBuffer.
  14. Добавлены методы Transaction.mergeUntracked([ColumnFamilyHandle columnFamilyHandle, ] ByteBuffer key, ByteBuffer value), которые предоставляют ключ и значение для записи/слияния в параметре ByteBuffer.

8.9.0 (17/11/2023)

Новые возможности

  • Добавлены API GetEntity() и PutEntity() для поддержки группы атрибутов. Через использование колонок семейств, группа атрибутов позволяет пользователям логически группировать широколончатые объекты.

Изменения публичного API

  • Добавлен API rocksdb_ratelimiter_create_auto_tuned для создания автоматически настроенного GenericRateLimiter.
  • Добавлен метод clipColumnFamily() в Java API для ограничения записей в CF по диапазону [begin_key, end_key).
  • API EnableFileDeletion больше не устанавливается по умолчанию для принудительного включения. Для пользователей, которые полагаются на это поведение по умолчанию и всё ещё хотят использовать принудительное включение, они должны явно передать true в EnableFileDeletion.
  • Добавлены новые API кэша GetSecondaryCacheCapacity() и GetSecondaryCachePinnedUsage() для возврата конфигурируемого объёма и зарезервированного кэша вторичного уровня.### Изменения поведения
  • Во время часов мертвого сезона, определяемых daily_offpeak_time_utc, компактир выбирает больше файлов для периодического компактирования. Этот выбор будет включать файлы, которые прогнозируются для истечения с момента начала следующего часа мертвого сезона, обеспечивая, что эти файлы не будут выбраны для периодического компактирования вне часов мертвого сезона.
  • Если возникает ошибка при записи в трассировочный файл после DB::StartTrace(), последующие записи трассировки будут пропущены, чтобы избежать записи в файл, который ранее видел ошибку. В этом случае DB::EndTrace() также вернет статус не-OK с информацией об ошибке, которая произошла ранее, в его сообщении статуса.
  • Удаление старых файлов при восстановлении делегируется SstFileManager, если доступно, таким образом, чтобы они могли быть ограничены скоростью.
  • RocksDB теперь вызывает TablePropertiesCollector::Finish() только один раз.
  • Когда WAL_ttl_seconds > 0, мы теперь обрабатываем архивированные WAL для удаления хотя бы каждые WAL_ttl_seconds / 2 секунды. Ранее это могло быть реже при маленьких значениях WAL_ttl_seconds, когда одновременно была активна размерная экспирация (WAL_size_limit_MB > 0).

Исправление ошибок

  • Исправлено аварийное завершение программы или утвержденное исключение в экспериментальной новой вариации HyperClockCache, особенно при использовании SecondaryCache.
  • Исправлено гонку между восстановлением ошибки записи и уничтожением базы данных, которая может привести к аварийному завершению работы базы данных.
  • Исправлены некоторые ошибки в пути индексного сборщика/чтателя для пользовательских временных меток в функции только для Memtable.
  • Исправлено возможное поднятие ниже нуля при вычислении доли сжатия вторичного кэша относительно общего блочного кэша при обновлении отношения сжатия вторичного кэша к общему блочному кэшу.

Улучшения производительности

  • Улучшена эффективность ввода-вывода при создании новой базы данных с помощью create_missing_column_families=true и множества колонок семейств.

8.7.0 (09/22/2023)

Новые возможности

  • Добавлен экспериментальный новый вариант "автоматического" HyperClockCache, который не требует предварительной оценки среднего размера записей в кэше. Этот вариант активируется при установке HyperClockCacheOptions::estimated_entry_charge = 0 и имеет примерно такие же преимущества параллелизма, как существующий HyperClockCache.
  • Добавлена новая метрика COMPACTION_CPU_TOTAL_TIME, которая отслеживает накопительное время выполнения компактации процессора. Эта метрика регулярно обновляется во время выполнения компактации.
  • Добавлен новый метод API GetEntity() для ReadOnly DB и Secondary DB.
  • Добавлен новый метод API Iterator::Refresh(const Snapshot *), который позволяет обновлять итератор с использованием входящего снимка данных.
  • Добавлен новый параметр чтения merge_operand_count_threshold. Когда количество операндов слияния, применённых во время успешного поиска точки превышает этот порог, запрос вернёт специальное состояние успеха с новым подкодом kMergeOperandThresholdExceeded. Приложения могут использовать это сигнал для принятия действий по снижению количества операндов слияния для затронутых ключей, например запустив компактацию.
  • Для NewRibbonFilterPolicy(), сделана возможность изменения параметра bloom_before_level через интерфейс Configurable и API SetOptions, что позволяет динамически переключаться между конфигурациями всех-Bloom и всех-Ribbon, а также конфигурациями между ними. Смотрите комментарии к NewRibbonFilterPolicy().
  • RocksDB теперь позволяет создавать трехуровневый кэш, ставя блочный кэш поверх сжатого вторичного кэша и неволатильного вторичного кэша. Чтобы настроить его, используйте API NewTieredCache() в rocksdb/cache.h.
  • Добавлен новый ширококолончато-осведомленный полный метод слияния FullMergeV3 к MergeOperator. FullMergeV3 поддерживает широкие колонки как базовое значение и результат слияния, что позволяет приложению выполнять более общие преобразования во время слияний. Для обратной совместимости, по умолчанию реализация применяет логику слияния к основной колонке любого ширококолончатого объекта. Конкретно, если нет базового значения или базовое значение является простым ключом-значением, по умолчанию реализация падает назад к FullMergeV2. Если базовое значение является ширококолончатым объектом, по умолчанию реализация вызывает FullMergeV2 для выполнения слияния на основной колонке, и оставляет любые другие колонки без изменений.
  • Добавлена поддержка широких колонок к командам ldb (скан, дамп, idump, dump_wal) и инструменту sst_dump скан.

Изменения в общественном API

  • Увеличено количество информации о входных файлах, используемых при создании таблицы (если они есть), доступной в CompactionFilter::Context. Смотрите CompactionFilter::Context::input_start_level, CompactionFilter::Context::input_table_properties для подробностей.
  • По умолчанию значение Options::compaction_readahead_size изменено с 0 до 2МБ.
  • При использовании сжатия LZ4 параметр acceleration можно настраивать, задав отрицательное значение в CompressionOptions::level. Например, CompressionOptions::level=-10 установит acceleration=10.
  • API NewTieredCache изменён так, чтобы принимать общую емкость кэша (включая как основной, так и сжатый вторичный кэши) и соотношение общей емкости, выделенной для сжатого кэша. Эти параметры указаны в TieredCacheOptions. Любая емкость, указанная в LRUCacheOptions, HyperClockCacheOptions и CompressedSecondaryCacheOptions, игнорируется. Предоставлен новый API UpdateTieredCache для динамической настройки общей емкости, соотношения сжатого кэша и политики приема.
  • API NewTieredVolatileCache() в rocksdb/cache.h переименован в NewTieredCache().### Изменения поведения
  • Производительность чтения при компактации будет ухудшаться, когда Options::compaction_readahead_size явно установлено в 0.
  • В случае универсального увеличения размера при компактации некоторые самые новые файлы уровня L0 будут условно исключены при выборе входных данных с небольшим отрицательным влиянием на увеличение размера. Это предотвращает блокировку большого количества новых файлов.

Изменения поведения

  • Изменен разделитель команды скана ldb с ':' на '==>'.

Исправление ошибок

  • Исправлена ошибка, при которой данные могут быть потеряны при компактации и чтении/скане, если произошла ошибка чтения с смещения 0 файла из L1+ и этот файл не является первым файлом в отсортированном наборе.
  • Исправлена ошибка, при которой итератор может вернуть некорректный результат для пользователей DeleteRange(), если произошла ошибка чтения из файла.
  • Исправлена ошибка с atomic_flush=true, которая могла бы заставить БД зависнуть после провала флеша (#11872).
  • Исправлена ошибка, при которой RocksDB (с atomic_flush=false) может удалить выходные файлы SST предстоящих флешей, если предыдущий конкурентный флеш завершился неудачно (#11865). Это может привести к тому, что БД войдет в режим только для чтения с сообщением об ошибке типа IO error: No such file or directory: While open a file for random read: /tmp/rocksdbtest-501/db_flush_test_87732_4230653031040984171/000013.sst.
  • Исправлено утверждение о проблеме во время поиска с async_io при включенном отсеивании readahead.
  • Когда емкость сжатого вторичного кэша уменьшается до 0, он полностью отключается. До этого исправления, вставка и поиск всё ещё направлялись в поддерживающий LRUCache перед возвратом, что приводило к дополнительным затратам на блокировку. С этим исправлением, вставка и поиск становятся бесполезными и не добавляют никакой нагрузки.
  • Обновление трёхуровневого кэша (кэш, созданный с помощью NewTieredCache()) путём вызова SetCapacity() на нем работало некорректно. Изначально создание устанавливало емкость основного кэша на сумму основного и сжатого вторичного кэшей. Но SetCapacity() просто устанавливало емкость основного кэша. С этим исправлением, пользователь всегда указывает общую бюджетную сумму и соотношение сжатого вторичного кэша при создании. Затем SetCapacity() распределяет новую емкость между двумя кэшами тем же соотношением.
  • Исправлена ошибка в MultiGet для очистки SuperVersion, полученного с блокировкой db mutex.
  • Исправлена ошибка, при которой кэш строки может ошибочно вернуть kNotFound даже если запись кэша строки была найдена.
  • Исправлено гонение в GenericRateLimiter, которое могло бы сделать его прекратить выдавать запросы.
  • Исправлена ошибка (Задача #10257), при которой БД может зависнуть после записи, поскольку нет запланированной компактации (#11764).
  • Добавлено исправление для async_io, где во время поиска, при чтении блока для поиска целевых ключей в файле без readahead, итератор выравнивал чтение на границе страницы и читал больше, чем было необходимо. Это увеличивало использование пропускной способности чтения хранилища.
  • Исправлена проблема в инструменте sst dump для обработки границ, указанных для данных с пользовательскими временными отметками.
  • При включенном auto_readahead_size, обновление верхней границы readahead происходит во время отсеивания readahead при динамическом изменении iterate_upper_bound при ре-поиске.
  • Исправлена ошибка, при которой rocksdb.file.read.verify.file.checksums.micros не заполнялась.### Улучшения производительности
  • Добавлены дополнительные улучшения в настройке readahead_size во время сканов при включенном auto_readahead_size. Однако это не поддерживается с операцией Iterator::Prev и вернет ошибку NotSupported.
  • Во время async_io, поиск происходит в двух фазах. Первая фаза начинает асинхронное чтение на блочном пропуске кэша, а вторая ждет окончания чтения и завершает поиск. В обеих фазах сначала выполняется поиск блочного кэша для блока данных, прежде чем обращаться к буферу предварительного чтения. Оптимизация достигается за счет выполнения поиска блочного кэша только в первой фазе, что экономит некоторое время ЦП.

8.6.0 (08/18/2023)

Новые возможности

  • Добавлена усиленная проверка целостности данных в файлах SST с новым форматом версии format_version=6. Влияние на производительность минимально или незначительно. Ранее, если данные SST были перемещены или переупакованы уровнем хранения, они могли пройти проверку контрольной суммы блока с вероятностью выше одного из четырёх миллиардов. При использовании format_version=6 контрольные суммы блоков зависят от того, какой это файл и местоположение внутри него. Таким образом, перемещённые данные SST теперь так же маловероятно пройдут проверку контрольной суммы, как случайно повреждённые данные. Также при format_version=6 контрольные суммы защищают концы файлов SST.
  • Добавлена возможность уменьшать размер предварительного чтения (readahead_size) во время сканирования до верхней границы (upper_bound), когда указана опция iterate_upper_bound. Эта функциональность активируется через ReadOptions.auto_readahead_size. Пользователи должны также указывать ReadOptions.iterate_upper_bound.
  • RocksDB будет сравнивать количество входных ключей с количеством обработанных ключей после каждой компактации. Компактация завершится ошибкой и сообщит о состоянии корruptions, если проверка не пройдет. Опция compaction_verify_record_count введена для этой цели и включена по умолчанию.
  • Добавлена опция CF bottommost_file_compaction_delay для указания задержки одиночных файловых компактаций уровня нижнего уровня.
  • Добавлена поддержка для включения/отключения пользовательских меток времени для существующего столбца семейства вместе с функцией только для Memtables.
  • Реализована новая политика приема для сжатого вторичного кэша, которая принимает блоки, выгнанные из основного кэша с установленным битом удара. Эта политика может быть установлена в TieredVolatileCacheOptions путём задания нового параметра adm_policy.
  • Добавлена опция столбца семейства memtable_max_range_deletions, ограничивающая число диапазонных удалений в Memtable. RocksDB попытается выполнить автоматическую флеш после достижения этого лимита. (#11358)
  • Добавлен метод PutEntity в sst_file_writer
  • Добавлено поле timeout в микросекундах в опции WaitForCompactOptions для своевременного прекращения длительного ожидания в ситуациях повторяемых восстановляемых ошибок, таких как ситуации отсутствия места и непрерывные потоки записи, поддерживающие постоянные флэши и компактации.
  • Введены новые статистики rocksdb.file.read.{get|multiget|db.iterator|verify.checksum|verify.file.checksums}.micros, измеряющие время чтения блочных таблиц SST или blob-файлов во время открытия базы данных, вызова Get(), MultiGet(), использования итератора базы данных, VerifyFileChecksums() и VerifyChecksum(). Эти статистики требуют уровня статистики больше чем StatsLevel::kExceptDetailedTimers.
  • Добавлена опция закрытия базы данных close_db в WaitForCompactOptions для вызова Close() после завершения ожидания.
  • Добавлена новая опция сжатия CompressionOptions::checksum для включения функции контрольной суммы ZSTD для обнаружения повреждений при декомпрессии.

Изменения публичного API

  • Отмечено как устаревшие API связанные с Options::access_hint_on_compaction_start. Смотрите #11631 для альтернативного поведения.

Изменения поведения

  • Статистика rocksdb.sst.read.micros теперь включает время затрат на многократное чтение и асинхронное чтение в файл.
  • Для пользователей универсальной компактации периодическая компактация (опция periodic_compaction_seconds) по умолчанию будет установлена на 30 дней, если используется блочная таблица.

Исправление ошибок

  • Устранена ошибка в FileTTLBooster, которая может вызвать ошибки типа "runtime error: shift exponent .. is too large.." для пользователей с большим количеством уровней (более 65). (#11673).

8.5.0 (07/21/2023)

Изменения публичного API

  • Удалены недавно добавленные API GeneralCache и MakeSharedGeneralCache() поскольку наш план изменился на то, чтобы перестать предоставлять общий интерфейс кэша. Старые формы этих API, Cache и NewLRUCache(), всё ещё доступны, хотя общая поддержка кэширования будет окончательно прекращена.

Изменения поведения

  • Опция periodic_compaction_seconds больше не поддерживает FIFO-компактацию: её установка не влияет на FIFO-компактацию. Пользователям FIFO-компактации следует использовать опцию ttl вместо.
  • Обязанность предварительного кэширования перед компактацией передана страницному кэшу для случаев, где не используется directIO.

Улучшение производительности

  • В случае использования directIO, если буфер, переданный вызывающим, уже выровнен, RandomAccessFileRead::Read избежит реаллокации нового буфера, что снижает количество операций memcpy и использует уже переданный выровненный буфер.
  • Малое улучшение эффективности HyperClockCache за счет снижения шансов генерации кучевых аллоцирований компилятором.

Исправление ошибок

  • Устранена ошибка use_after_free в асинхронных многократных чтениях при включенном экспериментальном режиме kFSBuffer.## 8.4.0 (06/26/2023)

Новые возможности

  • Добавлена опция FSReadRequest::fs_scratch, представляющая собой буфер данных, выделенный и предоставленный подсистемой хранения RocksDB во время чтения, когда система хочет предоставить свой собственный буфер данных вместо использования буфера, предоставленного RocksDB. Это помогает в оптимизации процессора, избегая копирования данных из буфера системы хранения в буфер RocksDB. Подробнее о том, как использовать/включить эту опцию, см. в file_system.h. На данный момент эта опция поддерживается только для многократных асинхронных и синхронных чтений без использования directIO.
  • Начата регистрация нулевых пользовательских меток времени в журнале WAL для сигнализации о формате ключей пользователя в последующих записях и использования его во время восстановления. Это изменение может сломать восстановление из журналов WAL, созданных ранними версиями, содержащими пользовательские метки времени. Работающее решение — убедиться, что нет журналов WAL для восстановления (то есть, выполнив флэш перед закрытием) перед обновлением.
  • Добавлен новый параметр "rocksdb.obsolete_sst_files_size_property", который сообщает о размере файлов SST, которые стали устаревшими, но ещё не были удалены или запланированы для удаления.
  • Начато записывание значения флага AdvancedColumnFamilyOptions.persist_user_defined_timestamps в манифест и свойства таблицы для файла SST при его создании. И использование записанного флага при создании читателя таблицы для файла SST. Этот флаг явно записывается только тогда, когда он равен false.
  • Добавлена новая опция OptimisticTransactionDBOptions::shared_lock_buckets, которая позволяет делиться мютексами для проверки транзакций между экземплярами баз данных для лучшего балансирования эффективности памяти и конкуренции проверки между экземплярами баз данных. Разные семейства столбцов и базы данных теперь используют различные семена хеширования в этом процессе проверки, чтобы те же наборы имен ключей не конкурировали между базами данных или семействами столбцов.
  • Добавлен новый тикер rocksdb.files.marked_trash_deleted для отслеживания количества файлов мусора, удаленных фоновым потоком из очереди мусора.
  • Добавлен API NewTieredVolatileCache() в include/rocksdb/cache.h для создания экземпляра кэша блоков с первичным уровнем кэша блоков и сжатым вторичным уровнем кэша. Кэш такого типа распределяет зарезервированную память против кэша блоков, таких как WriteBufferManager, память читателя таблицы и т.д., пропорционально между первичным и сжатым вторичным кэшем.
  • Добавлен метод WaitForCompact(), который ждет завершения всех задач флэш и компактации. Ждутся задачи, которые ещё не были запланированы (добавлены в очередь, но ещё не были запланированы).
  • Добавлен метод WriteBatch::Release(), который освобождает сериализованные данные пакета к вызывающему.

Изменения публичного API

  • Добавлен C API rocksdb_options_add_compact_on_deletion_collector_factory_del_ratio.
  • Изменен API FileSystem::use_async_io() на API SupportedOps, чтобы расширить его на различные операции, поддерживаемые системой хранения. Сейчас этот API содержит FSSupportedOps::kAsyncIO и FSSupportedOps::kFSBuffer. Подробнее о FSSupportedOps в filesystem.h.
  • Добавлены новые тикеры: rocksdb.error.handler.bg.error.count, rocksdb.error.handler.bg.io.error.count, rocksdb.error.handler.bg.retryable.io.error.count для замены испорченных: rocksdb.error.handler.bg.errro.count, rocksdb.error.handler.bg.io.errro.count, rocksdb.error.handler.bg.retryable.io.errro.count ('error' вместо 'errro'). Пользователи должны перейти на использование новых тикеров до выпуска 9.0, так как старые тикеры будут полностью удалены тогда.
  • Переопределён API CreateColumnFamilyWithImport() для поддержки создания семейства столбцов путём импорта нескольких семейств столбцов. Это требует, чтобы CF не пересекались в диапазоне ключей пользователя.### Изменения поведения
  • Изменено значение по умолчанию для опции level_compaction_dynamic_level_bytes на true. Это влияет на пользователей, использующих уровневую компактацию и не устанавливающих эту опцию явно. Эти пользователи могут заметить дополнительные фоновые компактации после открытия базы данных. Эти компактации помогают сформировать LSM согласно level_compaction_dynamic_level_bytes таким образом, чтобы размер каждого уровня Ln был примерно равен размеру Ln-1 * max_bytes_for_level_multiplier. Активация этой опции имеет и другие преимущества: более подробно см. в вики: https://github.com/facebook/rocksdb/wiki/Leveled-Compaction#option-level_compaction_dynamic_level_bytes-and-levels-target-size и в комментарии к опции в advanced_options.h (#11525).
  • Для пользователей уровневой компактации метод CompactRange() всегда будет пытаться компактировать до последнего непустого уровня. (#11468) Для пользователей уровневой компактации метод CompactRange() с опцией bottommost_level_compaction = BottommostLevelCompaction::kIfHaveCompactionFilter будет действовать аналогично kForceOptimized: он будет пропускать файлы, созданные во время этой ручной компактации, при компактации файлов в нижнем уровне. (#11468)
  • RocksDB будет пытаться удалять диапазонные тумбы во время не-нижних уровней компактации, когда это безопасно. (#11459)
  • Когда база данных открывается с опцией allow_ingest_behind=true (в настоящее время поддерживаются только универсальные компактации), файлы в последнем уровне, то есть внесенные файлы, не будут включены в любую компактацию. (#11489)
  • Статистика rocksdb.sst.read.micros теперь охватывает все чтения SST, кроме чтения файлов и импорта семейств столбцов (некоторые чтения компактации ранее были исключены).

Исправленные ошибки

  • Уменьшили случаи незаконного использования Env::Default() во время статического разрушения, никогда не разрушая внутренний объект PosixEnv сам по себе (кроме сборок, проверяющих наличие памяти утечек). (#11538)
  • Исправили лишнее предварительное чтение в процессе seek в асинхронном режиме io при условии, что BlockBasedTableOptions.num_file_reads_for_auto_readahead равно 1, что приводит к избыточному чтению больше, чем требуется.
  • Исправили баг, когда компактация, которая должна была выполняться как две подкомпактации, выполнялась как одна подкомпактация.
  • Исправили баг с использованием после перемещения в файле block.cc.

Версия 8.3.0 (19/05/2023)

Новые возможности

  • Введено новое опция block_protection_bytes_per_key, которое можно использовать для включения защиты целостности ключей-значений для блоков в памяти в блок кэше (#11287).
  • Добавлена опция JemallocAllocatorOptions::num_arenas. Установка num_arenas > 1 может снизить конфликты мьютексов в аллокаторе, особенно в ситуациях, где блочные выделения часто обходят кэш jemalloc.
  • Улучшение операционной безопасности публикации базы данных или файлов SST на множество хостов путём использования различных семенных значений хеша блока кэша на разных хостах. Конкретное поведение контролируется новой опцией ShardedCacheOptions::hash_seed, которая также подробно документирует решённую проблему.
  • Введено новое опция CompactionOptionsFIFO::file_temperature_age_thresholds, которое позволяет FIFO компактации компактировать файлы до различных температур на основе возраста ключей (#11428).
  • Добавлен новый счетчик тикера для отслеживания количества раз, когда RocksDB обнаруживает коррекцию при проверке контрольной суммы блока: BLOCK_CHECKSUM_MISMATCH_COUNT.
  • Новый статистический показатель rocksdb.file.read.db.open.micros, который измеряет время чтения блочных SST таблиц или файлов blob во время открытия базы данных.
  • Новые статистические тикеры для различных поведений seek итератора и соответствующего фильтрации, как *_LEVEL_SEEK_*. (#11460)

Изменения в общественном API

  • EXPERIMENTAL: Добавлено новое API DB::ClipColumnFamily для обрезки ключей в CF до определенного диапазона. Это физически удаляет все ключи вне этого диапазона, включая надгробия.
  • Добавлены функции создания MakeSharedCache() для различных объектов опций кэша, и устарели функции NewWhateverCache() с длинными списками параметров.
  • Изменены значения различных статистических показателей фильтра Блума (префикс против всего ключа), с отслеживанием итератор-связанного фильтра только в новых *_LEVEL_SEEK_*. показателях. (#11460)

Изменения поведения

  • Для x86, характеристики ЦП больше не обнаруживаются в реальном времени ни в скриптах сборки, но через общие препроцессорные определения в исходном коде. Это вероятно освобождает некоторые небольшие улучшения производительности на некоторых более новых устройствах, но может ухудшить производительность контрольной суммы CRC32c, которая больше не является по умолчанию, на некоторых "портабельных" сборках. Подробнее см. PR #11419.

Исправленные ошибки

  • Удаление пустого файла журнала WAL при открытии базы данных, если номер журнала меньше минимального номера журнала для сохранения.
  • Удаление временного файла OPTIONS при открытии базы данных, если произошла ошибка записи или переименования его.

Улучшения производительности

  • Улучшение эффективности I/O предварительного чтения метаданных SST за счет записи большего объема информации в проявленное состояние базы данных. Открытие файлов, записанных с предыдущих версий, всё ещё будет полагаться на эвристическое предварительное чтение (#11406).

Версия 8.2.0 (24/04/2023)

Изменения в общественном API

  • SstFileWriter::DeleteRange() теперь возвращает Status::InvalidArgument, если конечный ключ диапазона находится перед начальным ключом согласно пользовательскому сравнителю. Ранее поведение было неопределенным.
  • Добавлен метод multi_get_for_update в C API.
  • Удалён ненужный конструктор для CompressionOptions.### Изменения поведения
  • Изменено значение по умолчанию размера кэша блока с 8 МБ на 32 МБ LRUCache, увеличив количество шардов кэша с 16 до 64. Это изменение направлено на минимизацию конфликтов мьютексов в условиях стресса. Подробнее см. https://github.com/facebook/rocksdb/wiki/Block-Cache.
  • При уровне компактации с level_compaction_dynamic_level_bytes=true, RocksDB теперь просто перемещает уровни вниз для заполнения LSM, начиная с нижнего уровня при открытии базы данных. Подробнее см. комментарии к опции level_compaction_dynamic_level_bytes (#11321).
  • Пользовательские ReadOptions теперь применяются для большего количества чтений блоков, отличных от CacheEntryRole::kDataBlock.
  • При уровне компактации с level_compaction_dynamic_level_bytes=true, RocksDB теперь автоматически устраняет ненужные уровни через фоновую компактацию (#11340). Это вместе с #11321 делает автоматическим переход других настроек компактации к уровневой компактации с level_compaction_dynamic_level_bytes=true. Кроме того, живая база данных, которая становится меньше, теперь будет иметь ненужные уровни удалены, что поможет уменьшить коэффициенты чтения и пространства.
  • Если CompactRange() вызывается с CompactRangeOptions::bottommost_level_compaction=kForce* для компактации из L0 в L1, RocksDB теперь попытается выполнить простое перемещение из L0 в L1, затем выполнить внутри-L1 компактацию вместо L0 в L1 компактации с отключенным простым перемещением (#11375).

Исправленные ошибки

  • В API DB::VerifyFileChecksums обеспечено, чтобы чтения файлов SST были равны размеру предварительного чтения в ReadOptions, если он указан. Ранее каждое чтение было дважды большим, чем размер предварительного чтения.
  • В трассировке кэша блока исправлены некоторые случаи плохой информации о попадании/промахах (и другое) с MultiGet.

Новые возможности

  • Добавлен экспериментальный PerfContext счетчики iter_{next|prev|seek}_count для итератора базы данных, каждый из которых считает количество вызовов соответствующего API.
  • Разрешено изменять в реальном времени, позволяет ли WriteBufferManager паузу или нет, вызывая SetAllowStall().
  • Добавлены новые статистические тикеры BYTES_COMPRESSED_FROM, BYTES_COMPRESSED_TO, BYTES_COMPRESSION_BYPASSED, BYTES_COMPRESSION_REJECTED, NUMBER_BLOCK_COMPRESSION_BYPASSED, и NUMBER_BLOCK_COMPRESSION_REJECTED. Деактивированы/устарели гистограммы BYTES_COMPRESSED и BYTES_DECOMPRESSED, и тикер NUMBER_BLOCK_NOT_COMPRESSED. Новые тикеры предлагают больше информации о соотношении сжатия, отклонённых против отключённых сжатия и т.д. (#11388)
  • Новые статистические показатели rocksdb.file.read.{flush|compaction}.micros, которые измеряют время чтения блочных SST таблиц или файлов blob во время флеша или компактации.

Версия 8.1.0 (18/03/2023)

Изменения поведения

  • Логика разделения выходных файлов компактации теперь принимает во внимание начальные ключи диапазона надгробий. Например, SST парсер теперь может получить запрос на разделение для начальных ключей диапазона надгробий.
  • Если опция async_io ReadOption указана для MultiGet или NewIterator на платформе, которая не поддерживает IO uring, эта опция игнорируется, и используется синхронное чтение.

Исправленные ошибки

  • Исправлено проблемное поведение обратного итерирования при активации пользовательского определённого временного штампа в сочетании с BlobDB.
  • Исправлены несколько случаев, когда операнд слияния встречался во время итерации, но не отражался в счетчике производительности internal_merge_count.
  • Исправлен баг в CreateColumnFamilyWithImport()/ExportColumnFamily(), который не поддерживал диапазон надгробий (#11252).
  • Исправлен баг, когда исключенный столбец семьи из атомарного флеша содержал недофлешенные данные, которые должны были бы быть включены в этот атомарный флеш (например, данные с номером последовательности меньше максимального номера последовательности этого атомарного флеша), что могло привести к потере данных в этом исключённом столбце семьи при WriteOptions::disableWAL == true (#11148).

Новые возможности

  • Добавлены статистические показатели rocksdb.secondary.cache.filter.hits, rocksdb.secondary.cache.index.hits, и rocksdb.secondary.cache.filter.hits.
  • Добавлен новый счетчик производительности internal_merge_point_lookup_count, который отслеживает количество применяемых операндов слияния при обслуживании запросов точечного поиска.
  • Добавлены новые статистические показатели rocksdb.table.open.prefetch.tail.read.bytes, rocksdb.table.open.prefetch.tail.{miss|hit}.
  • Добавлена поддержка SecondaryCache с HyperClockCache (HyperClockCacheOptions наследует опцию secondary_cache из ShardedCacheOptions).
  • Добавлены новые свойства базы данных rocksdb.cf-write-stall-stats, rocksdb.db-write-stall-stats и API для анализа их структурированно. В частности, пользователи GetMapProperty() с свойством kCFWriteStallStats/kDBWriteStallStats могут теперь использовать функции в WriteStallStatsMapKeys для поиска статистики в карте.

Изменения в общественном API

  • Изменены различные функции и возможности в Cache, которые в основном относятся к специализированным реализациям или обёрткам. Особенно, асинхронная функциональность поиска перемещена из Lookup() в новую функцию StartAsyncLookup().

Версия 8.0.0 (19/02/2023)

Изменения поведения

  • ReadOptions::verify_checksums=false отключает проверку контрольных сумм для большего количества чтений блоков, отличных от CacheEntryRole::kDataBlock.
  • При сканировании с включенной опцией async_io, если POSIX не поддерживает IOUring, возвращается ошибка Status::NotSupported пользователям. Вначале эта ошибка проглатывалась, и чтения переключались на синхронное чтение.### Исправленные ошибки
  • Исправлено конкурентное расхождение на ColumnFamilyData::flush_reason, вызванное одновременными флешами.
  • Исправлено проблемное поведение в Get и MultiGet при активации пользовательских временных штампов в сочетании с BlobDB.
  • Исправлены некоторые атипичные поведения LockWAL(), такие как позволяющее конкурентное/рекурсивное использование и не ожидающее UnlockWAL() после некорректного результата. См. комментарии API.
  • Исправлен баг взаимодействия функций, где для блоков GetEntity выводил ссылку на блок вместо значения блока.
  • Исправлены DisableManualCompaction() и CompactRangeOptions::canceled для отмены компактации даже если они ожидают завершения конфликтующих компактаций.
  • Исправлен баг, при котором успешный GetMergeOperands() мог временно вернуть Status::MergeInProgress().
  • Возвращается правильная ошибка (Status::NotSupported()) для вызова MultiGet при активации ReadOptions::async_io и отсутствии поддержки IO uring. Ранее возвращалась ошибка Status::Corruption().

Удаление функциональностей

  • Удалена RocksDB Lite.
  • Удалён функционал блока block_cache_compressed. Соответствующие ему статистики также удалены.
  • Удалён устаревший метод Env::LoadEnv(). Вместо него следует использовать Env::CreateFromString().
  • Удалён устаревший метод FileSystem::Load(). Вместо него следует использовать FileSystem::CreateFromString().
  • Удалены устаревшие версии следующих вспомогательных функций и соответствующие им Java-биндинги: LoadOptionsFromFile, LoadLatestOptions, CheckOptionsCompatibility.
  • Удалён метод FactoryFunc из метода LoadObject из вспомогательных методов Customizable.

Изменения в публичном API

  • Определение класса Cache, которое используется редко, перемещено в новый файл advanced_cache.h, а также добавлен класс CacheWrapper в этот же файл. Небольшие изменения в определении API класса SimCache.
  • Полностью удалены следующие устаревшие/устаревающие статистики: тикеры BLOCK_CACHE_INDEX_BYTES_EVICT, BLOCK_CACHE_FILTER_BYTES_EVICT, BLOOM_FILTER_MICROS, NO_FILE_CLOSES, STALL_L0_SLOWDOWN_MICROS, STALL_MEMTABLE_COMPACTION_MICROS, STALL_L0_NUM_FILES_MICROS, RATE_LIMIT_DELAY_MILLIS, NO_ITERATORS, NUMBER_FILTERED_DELETES, WRITE_TIMEDOUT, BLOB_DB_GC_NUM_KEYS_OVERWRITTEN, BLOB_DB_GC_NUM_KEYS_EXPIRED, BLOB_DB_GC_BYTES_OVERWRITTEN, BLOB_DB_GC_BYTES_EXPIRED, BLOCK_CACHE_COMPRESSION_DICT_BYTES_EVICT а также гистограммы STALL_L0_SLOWDOWN_COUNT, STALL_MEMTABLE_COMPACTION_COUNT, STALL_L0_NUM_FILES_COUNT, HARD_RATE_LIMIT_DELAY_COUNT, SOFT_RATE_LIMIT_DELAY_COUNT, BLOB_DB_GC_MICROS, и NUM_DATA_BLOCKS_READ_PER_LEVEL. Обратите внимание, что как результат, значения перечисляемых значений C++ для ещё поддерживаемых статистик изменились. Разработчикам рекомендуется не полагаться на фактические числовые значения.
  • Устарел параметр IngestExternalFileOptions::write_global_seqno с изменением значения по умолчанию на false. Этот параметр требуется установить в значение true, чтобы создать базу данных совместимую с версиями RocksDB до 5.16.0.
  • Удалены устаревшие API GetColumnFamilyOptionsFrom{Map|String}(const ColumnFamilyOptions&, ..), GetDBOptionsFrom{Map|String}(const DBOptions&, ..), GetBlockBasedTableOptionsFrom{Map|String}(const BlockBasedTableOptions& table_options, ..) и GetPlainTableOptionsFrom{Map|String}(const PlainTableOptions& table_options,..).
  • Добавлен подкод ошибки Status::Corruption, Status::SubCode::kMergeOperatorFailed, чтобы пользователи могли идентифицировать коррупционные ошибки, возникшие в операторе слияния, отличаясь от внутренне выявленных коррупций RocksDB.

Изменения сборки

  • Теперь по умолчанию сборка make создаёт общую библиотеку вместо статической. Чтобы использовать статическую библиотеку, используйте LIB_MODE=static.

Новые возможности

  • Поддержка компактационных фильтров для широколюбовых сущностей через API FilterV3. Для получения более подробной информации обратитесь к комментариям API.
  • Добавлен параметр do_not_compress_roles к CompressedSecondaryCacheOptions для отключения сжатия определённых типов блоков. Блоки фильтра теперь не сжимаются по умолчанию через CompressedSecondaryCache.
  • Добавлен новый API MultiGetEntity, который позволяет выполнять групповые запросы к широколюбовым сущностям. Для получения более подробной информации обратитесь к комментариям API.### Исправление ошибок
  • Исправлена регрессия в итераторах, где диапазонные границы после iterate_upper_bound были некорректно обработаны.
  • Исправлен утечка памяти в MultiGet при использовании опции чтения async_io, вызванная ошибками ввода-вывода при открытии таблицы.
  • Исправлена ошибка, которая приводила к удалению одного файла в не-L0 уровне даже если размер максимального количества файлов компактации не превышает допустимое значение с момента #10348 или 7.8.0.
  • Исправлена ошибка, вызванная методом DB::SyncWAL(), влияющая на track_and_verify_wals_in_manifest. Без исправления приложение может столкнуться с ошибкой "open error: Corruption: Missing WAL with log number", когда пытается открыть базу данных. Коррупция является ложным тревожным сигналом, но препятствует открытию базы данных (#10892).
  • Исправлена ошибка в BackupEngine, где восстановление базы данных из последнего резервного копирования завершалось ошибкой, если последняя резервная копия была удалена, но существуют другие действительные резервные копии.
  • Исправлена коррупция файла L0, вызванная импортом файлов с перекрывающимися seqnos вместе с записями мемтаблицы. До этого исправления, force_consistency_checks=true могло выявить коррупцию до того, как она стала доступна для читателей, в этом случае записи будут возвращать Status::Corruption. Также заменён предыдущий неполный исправление (#5958) на ту же самую коррупцию новым и более полным исправлением.
  • Исправлена ошибка в LockWAL(), приводящая к повторному захвату мьютекса (#11020).
  • Исправлена ошибка использования после освобождения памяти в асинхронном предварительном чтении скана, когда поток скана и другой поток пытаются считывать и загружать один и тот же блок seek в кэше.
  • Исправлена ошибка использования после освобождения памяти в асинхронном предварительном чтении скана, если включена словарная компрессия, в результате чего синхронное чтение словарной компрессии смешивается с асинхронным предварительным чтением.
  • Исправлена ошибка конкурентного доступа в CompactRange() при активации уровня change_level=true на перекрывающемся диапазоне со одновременным импортом файла для уровня компактации. Это либо приводит к коррупции перекрывающихся диапазонов файлов на определённом уровне, выявленной force_consistency_checks=true, либо потенциально два одинаковых ключа с seqno 0 на двух разных уровнях (то есть новые данные окажутся на нижнем/более старом уровне). Последнее будет выявлено утверждением в режиме отладки, но пройдет незамеченным и приведет к неверному результату чтения в режиме выпуска. Это исправление универсально, поэтому оно заменяет предыдущие исправления аналогичной проблемы для CompactFiles() (#4665), общего CompactRange() и автоматического компактования (коммиты 5c64fb6 и 87dfc1d).
  • Исправлена ошибка в разделении выходных файлов компактации, где маленькие выходные файлы были созданы из-за состояний разделения TTL файлов, которые не обновлялись (#11075).

Новые возможности

  • Когда конфигурируется SstPartitionerFactory, метод CompactRange() теперь автоматически выбирает для компактации любые файлы, перекрывающие границу разделения, находящуюся в области компактации, даже если нет реальных записей в запрошенной области компактации. Эта возможность позволяет использовать ручную компактацию для (пере-)установки точек разделения SST при изменении SstPartitioner, без полной компактации.
  • Добавлена возможность в BackupEngine для исключения файлов из резервного копирования, известных тем, что они уже резервируются в другом месте, используя CreateBackupOptions::exclude_files_callback. Для восстановления базы данных, исключенные файлы должны быть предоставлены в альтернативных директориях резервного копирования с помощью RestoreOptions::alternate_dirs.

Изменения в публичном API

  • Произведены substantial изменения в классе Cache для поддержки внутренних целей развития. Прямое использование членов класса Cache не рекомендовано, и дальнейшие изменения могут быть сделаны в будущем. Класс SecondaryCache имеет некоторые связанные изменения, и реализации потребуют обновления. (В отличие от Cache, SecondaryCache всё ещё предназначен для поддержки пользовательских реализаций, и разрушительные изменения будут избегаться.) (#10975)
  • Добавлен параметр MergeOperationOutput::op_failure_scope для пользователей оператора слияния для контроля радиуса действия ошибок оператора слияния. Существующие пользователи оператора слияния не требуют никаких изменений для сохранения старого поведения.

Улучшение производительности

  • Обновлены исходные коды xxHash, что должно повысить скорость хэширования kXXH3, хотя бы на ARM (#11098).
  • Улучшена эффективность процессора для чтений базы данных, благодаря улучшениям доступа к кэшу блоков (#10975).

7.9.0 (11/21/2022)

Улучшение производительности

  • Исправлена регрессия производительности итератора для пользователей диапазона удалений при сканировании через последовательность диапазонных границ (#10877).### Исправление ошибок
  • Исправлена ошибка коррупции памяти при сканировании, если включен async_io. Коррупция произошла из-за ошибки ввода-вывода при чтении данных, что привело к пустому буферу и другому буферу, уже находящемуся в процессе асинхронного чтения, снова выполняющему чтение.
  • Исправлена ошибка, связанная с неудачной попыткой повторного выполнения флеша мемтаблицы, которая могла привести к некорректно упорядоченным обновлениям, что проявилось бы для писателей как Status::Corruption при force_consistency_checks=true (по умолчанию). Это затрагивает случаи использования, которые позволяют параллельный флеш (max_background_flushes > 1 или max_background_jobs >= 8) и нестандартное количество мемтаблиц (max_write_buffer_number > 2).
  • Исправлена ошибка, когда тикер READ_NUM_MERGE_OPERANDS не обновлялся при чтении основного ключа-значения или тумбы из файла SST.
  • Исправлена ошибка безопасности памяти при использовании вторичного кэша с block_cache_compressed. block_cache_compressed больше не пытается использовать функции вторичного кэша.
  • Исправлена регрессия в сканировании при использовании async_io. Во время поиска, действительные буферы были очищены, что привело к регрессии.
  • Уровневое Хранение: исправлена избыточная запись ключей в предпоследнем уровне в неразрабатываемых сборках.

Новые возможности

  • Добавлена базовая поддержка пользовательских меток времени для слияния (#10819).
  • Добавлены статистики для времени выполнения ReadAsync и асинхронных ошибок чтения.
  • Базовая поддержка модели данных с широкими столбцами теперь доступна. Широко-столбцовые сущности могут храниться с помощью API PutEntity, а также извлекаться с использованием GetEntity и нового API columns итератора. Для совместимости классические API Get и MultiGet, а также API value итератора возвращают значение анонимного по умолчанию столбца широко-столбцовых сущностей; также GetEntity и API columns итератора возвращают любые простые ключ-значения в виде сущности, которая имеет только анонимный столбец по умолчанию. В настоящее время MergeGetMergeOperands) применяются только к столбцу по умолчанию; любые другие столбцы сущностей остаются незатронутыми операциями Merge. Обратите внимание, что некоторые функции, такие как фильтры компактации, транзакции, пользовательские метки времени и писатель файла SST, еще не поддерживают широко-столбцовые сущности; также в настоящее время нет аналогичной API MultiGet для одновременного извлечения нескольких сущностей. Мы планируем постепенно закрыть вышеупомянутые пробелы и реализовать новые функции, такие как операции уровня столбцов (например, обновление или запрос только определённых столбцов сущности).
  • Отмечен HyperClockCache как производственный вариант для LRUCache для блочного кэша. HyperClockCache значительно повышает эффективность процессора на горячем пути при высокой параллельной нагрузке или высокой конкуренции, с некоторыми известными ограничениями. До 4,5 раз больше операций в секунду по сравнению с LRUCache было замечено в db_bench при высокой параллельной нагрузке.
  • Добавлен периодический диагностирование в info_log (файл LOG) для блочного кэша HyperClockCache, если производительность снижается из-за плохого значения опции estimated_entry_charge.

7.8.0 (22/10/2022)

Новые возможности

  • Теперь метод DeleteRange() поддерживает пользовательские метки времени.
  • Поддержана асинхронная I/O с последовательными итераторами при активированном режиме ReadOptions.tailing во время сканирования.
  • Уровневое хранилище: позволено перемещение данных из нижнего уровня в предпоследний уровень, если входной уровень является предпоследним уровнем или выше.
  • Добавлен параметр DB::Properties::kFastBlockCacheEntryStats, который похож на DB::Properties::kBlockCacheEntryStats, но возвращает кэшированные (устаревшие) значения в большем количестве случаев для снижения затрат.
  • FIFO компакция теперь поддерживает миграцию из многоуровневого DB через DB::Open(). Во время этапа миграции FIFO компакционный выборник будет:
    • Выбирать SST файл с минимальным начальным ключом в нижнем уровне.
    • Обратите внимание, что во время этапа миграции порядок удаления файлов будет лишь приближенным "FIFO", так как файлы в более низких уровнях иногда содержат более новые ключи, чем файлы в верхних уровнях.
  • Добавлен параметр ignore_max_compaction_bytes_for_input, чтобы игнорировать максимальный размер байтов компакции при добавлении файлов для компактирования из входного уровня. Это должно помочь снизить увеличение записи. Параметр включен по умолчанию.
  • Уровневое хранилище: позволено перемещение данных из нижнего уровня даже если это последний уровень только компакция, если предпоследний уровень пуст.
  • Добавлен новый параметр IOOptions.do_not_recurse, который можно использовать подсистемами файловой системы для пропуска рекурсивного просмотра подкаталогов и списка только файлов в API GetChildren.
  • Добавлен параметр preserve_internal_time_seconds, чтобы сохранять информацию о времени для самых новых данных. Этот параметр можно использовать для определения возраста данных при активированном параметре preclude_last_level_data_seconds. Информация о времени прикреплена к SST в свойстве таблицы rocksdb.seqno.time.map, которое можно распарсить с помощью инструмента ldb или sst_dump.### Исправления ошибок
  • Исправлена ошибка в io_uring_prep_cancel в API AbortIO для POSIX, ожидающая sqe->addr совпадать с отправленным запросом чтения и передачи неверного параметра.
  • Исправлена регрессия в производительности итератора, когда вся база данных представляет собой единую memtable, введённая в #10449. Исправление находится в #1 Yöntem: 10705 и #10716.
  • Исправлена ошибка валидации оптимистической транзакции вызванная DBImpl::GetLatestSequenceForKey(), возвращающей не самую свежую последовательность для слияния (#10724).
  • Исправлена ошибка в обновлении итератора, которая могла привести к segmentation fault для пользователей DeleteRange (#10739).
  • Исправлена ошибка, вызывающая ручное сбросивание с flush_opts.wait=false застревать, когда база данных прекращает все записи (#10001).
  • Исправлена ошибка в обновлении итератора, которая не освобождала SuperVersion, что могло привести к чрезмерному закреплению ресурсов (#10770).
  • Исправлена ошибка, где RocksDB могла бесконечно продолжать компактирование при активированном параметре allow_ingest_behind и нижнем уровне не заполненном (#10767).
  • Исправлена ошибка безопасности памяти в экспериментальном HyperClockCache (#10768).
  • Исправлены некоторые случаи, где ldb update_manifest и ldb unsafe_remove_sst_file были недоступны, поскольку они требовали, чтобы файлы базы данных соответствовали текущему состоянию манифеста (до его обновления до желаемого состояния).

Улучшения производительности

  • Попытка выровнять границы выходных файлов компактирования к следующим уровням, что может снизить нагрузку компактирования на уровне по умолчанию более чем на 10%. Эта функция включена по умолчанию, чтобы отключить её, установите AdvancedColumnFamilyOptions.level_compaction_dynamic_file_size в false. Как побочный эффект, она может создавать SST большие, чем целевой размер файла (ограниченные двумя разами целевого размера файла) или меньшие файлы.
  • Улучшение RoundRobin TTL компактирования, которое будет таким же, как обычное RoundRobin компактирование для перемещения указателя компактирования.
  • Исправление небольшого регресса производительности, вызванного изменением, которое сделало UserComparatorWrapper Customizable, потому что Customizable само имеет небольшую производительность процессора для инициализации.

Изменения поведения

  • Санитизация min_write_buffer_number_to_merge до 1, если включена атомарная очистка, чтобы предотвратить неожиданное потерю данных при отключённом журнале транзакций в многоколонковых настройках (#10773).
  • При периодическом сборщике статистик, ждущем каждые options.stats_dump_period_sec секунды, он не будет собирать статистику для CF, если она не изменилась в течение периода, кроме случаев, когда семь периодов были пропущены.
  • Только периодический сборщик статистик, запущенный через options.stats_dump_period_sec, будет обновлять интервал статистики. Те, которые запущены через DB::GetProperty(), не будут обновлять интервал статистики и будут сообщать на основе интервала с момента последней сборки статистики.

Изменения общественной API

  • К XXH3 контрольной сумме сделан новым значением по умолчанию, потому что она быстрее на общих устройствах, особенно с CRC32c, затронутым проблемой производительности в некоторых версиях clang (https://github.com/facebook/rocksdb/issues/9891). Базы данных, записанные с этим новым значением, могут быть прочитаны RocksDB 6.27 и новее.
  • Переработаны классы, API и структуры данных для трассировки блочного кэша, чтобы позволить использовать предоставленный пользователем трассер. Введен абстрактный класс BlockCacheTraceWriter, который принимает структурированный BlockCacheTraceRecord. Реализация BlockCacheTraceWriter затем форматирует и логирует запись способом, который считает подходящим. Реализация по умолчанию BlockCacheTraceWriterImpl использует файловый трассер с предоставленным пользователем TraceWriter. Больше деталей в rocksdb/include/block_cache_trace_writer.h.

7.7.0 (18/09/2022)

Исправления ошибок

  • Исправлена засыпание, когда операция, такая как GetLiveFiles или CreateNewBackup, просит триггерить и ждать очистки memtable на только для чтения базе данных. Такие косвенные запросы очистки memtable теперь игнорируются на только для чтения базе данных.
  • Исправлена ошибка, где FlushWAL(true /* sync */) (используется GetLiveFilesStorageInfo(), который используется для точки и резерва) могла привести к тому, что параллельные записи в конце файла WAL никогда не будут синхронизированы.
  • Исправлено периодическое задание задачи, которое не может заново зарегистрировать ту же тип задачи, что может привести к неудаче SetOptions() обновить периодическую задачу время, такое как: stats_dump_period_sec, stats_persist_period_sec.
  • Исправлена ошибка в статистике rocksdb.prefetched.bytes.discarded. Она считывала размер буфера предварительного чтения, а не фактическое количество байтов, отброшенных из буфера.
  • Исправлена ошибка, где директорий, содержащих CURRENT, могли остаться несинхронизированными после того, как CURRENT был обновлен для указания на самый свежий MANIFEST, что приводит к риску потери данных CURRENT.
  • Обновлена статистика rocksdb.multiget.io.batch.size в non-async MultiGet также.
  • Исправлена ошибка проверки пересечения диапазонов ключей с параллельными операциями компактирования при активированном пользовательском метке времени. Пользовательские метки времени должны быть ИСКЛЮЧЕНЫ при проверке пересечения двух диапазонов.
  • Исправлена ошибка, где логика предварительного заполнения кэша блока не учитывала вторичный кэш (см. #10603).
  • Исправлена статистика rocksdb.num.sst.read.per.level, rocksdb.num.index.and.filter.blocks.read.per.level и rocksdb.num.level.read.per.multiget в корутинах MultiGet

Изменения общественной API

  • Добавлены rocksdb_column_family_handle_get_id, rocksdb_column_family_handle_get_name для получения имени и ID семейства колонок в C API
  • Добавлен новый показатель rocksdb.async.prefetch.abort.micros для измерения времени, проведённого в ожидании завершения асинхронного предварительного чтения### Изменения Java API
  • Добавлено CompactionPriority.RoundRobin.
  • Возвращено использование стандартной политики зарядки метаданных при создании LRU кэша через Java API.

Изменение поведения

  • Функционал DBOptions::verify_sst_unique_id_in_manifest теперь включен по умолчанию и проверяет уникальность ID файла SST каждый раз при открытии файла базой данных, а не только при открытии базы данных методом DB::Open.
  • В настоящее время при миграции с помощью инструмента изменения опций (OptionChangeMigration()) в режим FIFO компактация все данные компактируются в один единственный файл SST и перемещаются в уровень L0. Это может создать проблемы для некоторых пользователей: огромный файл может быть удален вскоре после создания, чтобы удовлетворить ограничение max_table_files_size, что может привести к почти пустой базе данных. Мы изменили поведение так, чтобы файлы были разделены на меньшие части, но эти файлы могут не следовать порядку вставки данных. После изменения, мигрированные данные после миграции могут не быть удалены в порядке вставки FIFO компактации.
  • Когда блок впервые находится в CompressedSecondaryCache, мы просто вставляем фиктивный блок в основной кэш и не удаляем блок из CompressedSecondaryCache. Отдельный указатель возвращается вызывающему объекту. Только если блок снова найдется в CompressedSecondaryCache до того как будет выведен фиктивный блок, мы удалим блок из CompressedSecondaryCache и вставим его в основной кэш.
  • Когда блок впервые выгоняется из основного кэша в CompressedSecondaryCache, мы просто вставляем фиктивный блок в CompressedSecondaryCache. Только если он снова будет выведен из кэша до того как будет выведен фиктивный блок, он будет считаться горячим блоком и будет вставлен в CompressedSecondaryCache.
  • Улучшено оценивание использования памяти за счет кэшированных биндов, принимая во внимание размер объекта, владеющего значением бинда, а также стоимость аллоцирования, если доступна malloc_usable_size (см. #10583).
  • Теперь значения биндов имеют свою собственную категорию в статистиках кэширования, вместо того чтобы быть объединенными в "Misc" корзину (см. #10601).
  • Изменено значение экспериментального флага ReadOptions optimize_multiget_for_io на включение по умолчанию.

Новые возможности

  • RocksDB выполняет внутреннее автоматическое предварительное чтение, если замечает два последовательных запроса чтения, если размер предварительного чтения не указан. Новая опция num_file_reads_for_auto_readahead добавлена в BlockBasedTableOptions, которая указывает, после скольких последовательных запросов чтения должно начаться внутреннее автоматическое предварительное чтение (по умолчанию — 2).
  • Добавлены новые счетчики производительности block_cache_standalone_handle_count, block_cache_real_handle_count, compressed_sec_cache_insert_real_count, compressed_sec_cache_insert_dummy_count, compressed_sec_cache_uncompressed_bytes, и compressed_sec_cache_compressed_bytes.
  • Память для биндов, предназначенных для вставки в кэш биндов, теперь выделяется с использованием аллокатора кэша (см. #10628 и #10647).
  • HyperClockCache представляет собой экспериментальный, блокирующийся альтернативный кэш для блока, который предлагает значительно улучшенную эффективность процессора при высоких параллельных нагрузках или высокой конкуренции, с некоторыми оговорками. Было замечено до 4,5 раз увеличение операций в секунду против LRUCache в тестах db_bench при высоких параллельных нагрузках.
  • Добавлена опция CompressedSecondaryCacheOptions::enable_custom_split_merge для включения специальной функции разделения и слияния, которая разделяет сжатое значение на части, чтобы они лучше подходили под bin jemalloc.

Улучшение производительности

  • Производительность итератора улучшена для пользователей DeleteRange(). Внутри, итератор пропускает конец диапазона tombstones, когда это возможно, вместо циклического прохождения каждого ключа и проверки, является ли ключ диапазонно удаленным.
  • Устранены некоторые выделения памяти и копирования в путях чтения биндов. Также, PinnableSlice теперь указывает только на значение бинда и закрепляет поддерживающую ресурс (вход кэша или буфер) во всех случаях, вместо хранения копии значения бинда. См. #10625 и #10647.
  • При сканировании с включенной асинхронной IO, добавлены оптимизации для отправки большего количества асинхронных запросов параллельно, чтобы избежать синхронного предварительного чтения.
  • Пользователи DeleteRange() должны заметить улучшение производительности получения и итератора из изменяемого memtable (см. #10547).## 7.6.0 (08/19/2022)

Новые возможности

  • Добавлена опция prepopulate_blob_cache в ColumnFamilyOptions. Если включена, теплые/горячие бинды, уже находящиеся в памяти, будут предварительно заполняться в кэше биндов при каждом флеше. При флеше, бинды, находящиеся в памяти (в memtables), записываются на устройство. Если используется Direct IO, дополнительно возникают операции ввода-вывода для чтения этих биндов обратно в память, что можно избежать путем включения этой опции. Это также помогает при работе с временной локальностью, где большую часть запросов выполняют недавно записанные данные. Это также полезно при работе с удалённой файловой системой, поскольку она требует сетевой передачи и имеет более высокие задержки.
  • Поддерживается использование вторичного кэша с кэшем биндов. При создании кэша биндов, пользователь может установить второй кэш биндов, настроив secondary_cache в LRUCacheOptions.
  • Расход памяти кэша биндов учитывается, если поддерживающий кэш биндов и блочный кэш различны. Если операция, зарезервированная памятью для кэша биндов, превышает доступное пространство в блочном кэше (то есть, вызывает состояние "кэш полон" при LRUCacheOptions::strict_capacity_limit = true), создание завершится ошибкой Status::MemoryLimit(). Чтобы активировать эту возможность, следует включить учет CacheEntryRole::kBlobCache в BlockBasedTableOptions::cache_usage_options.
  • Улучшено распределение диапазонов подкомпакта, чтобы оно было более равномерным. Более равномерное распределение подкомпактов повысит производительность компактирования для некоторых рабочих нагрузок. Все входные файлы индексных блоков используются для выбора некоторых ключевых точек, из которых выбираются позиции для разделения входного диапазона. Это может привести к некоторому увеличению затрат на ЦП в подготовительной фазе компактирования, если подкомпактирование включено, но это должна быть небольшая часть общего потребления ЦП всего процесса компактирования. Это также привносит изменение поведения: количество подкомпактов намного чаще достигает максимального значения, чем раньше.
  • Добавлен новый режим выбора компактирования CompactionPri::kRoundRobin, который циклически проходит через все файлы с курсором компактирования в круговом порядке. Эта функция доступна с версии Yöntem, который döngüsel olarak tüm dosyaları compaction cursor ile yuvarlak bir sırayla gezer. Bu özellik sürüm 7.5'ten itibaren mevcuttur.
  • Kullanıcı tanımlı zaman etiketleri için alt-compaction desteği eklendi.
  • memtable_protection_bytes_per_key adlı yeni bir seçenek eklendi, bu seçenek her anahtar-değer çifti için memtablarda kontrol öbeklerini koruma sağlar. Her bir memtablo öğesi, yazıldığında hesaplanan ve okunduğunda veya kompaktlaştırıldığında kontrol edilen bir kontrol öbeği ile sonlandırılır. Algılanan çürütme durumu kullanıcıya bildirilir ve çürütme durumu statüsü kullanıcıya geri döndürülür.
  • Bir blob-cache özel öncelik seviyesi eklenmiştir - düşük öncelikli seviye. Bloblar genellikle blok verilerine göre daha az önemsiz hedeflerdir çünkü 1) BlobDB'de, blok verileri anahtar-değer çiftlerinin değerlerini okumadan önce kontrol öbekleri oluşturmak zorunludır ve 2) önbelleklenmiş bloblar sadece tek bir anahtar-değer çiftini temsil ederken, önbelleklenmiş blok verileri genellikle birkaç anahtar-değer çiftini içerir. Kullanıcı, LRUCacheOptions'ta yeni bir low_pri_pool_ratio seçeneğini belirleyerek düşük öncelikli öğelerin (ve dolayısıyla düşük öncelikli seviyenin) alabileceği alanın oranını ayarlayabilir veya NewLRUCache()'da yeni bir low_pri_pool_ratio argümanını kullanarak aynı etkiyi elde edebilir.

API Değişiklikleri

  • Özel RateLimiter'in oluşturulması ve türüne dayalı fonksiyonların (CreateFromString() ve Type()) kaldırılması.
  • exclusive_manual_compaction CompactRangeOptions'nin varsayılan değeri artık false olarak ayarlanmıştır. Bu, RocksDB'nin varsayılan olarak yapboz paralellik kısıtlamalarını girdirmemesini garanti eder.
  • Seviye depolama: bottommost_temperature adlı eski bir seçenek last_level_temperature olarak yeniden adlandırılmıştır. Eski seçenek adı yalnızca geçiş amacıyla korunmuştur; lütfen yeni adı kullanınız. Bu değişiklik, sadece last_level seviyesindeki dosyaların sıcaklığına uygulanmasını sağlar.
  • Okuma seçenekleri için yeni bir deneyimsel seçenek optimize_multiget_for_io eklendi. Bu seçenek, MultiGet işlevinin ağırlık yükünü azaltmaya çalışırken, birden çok düzeyde anahtarlara yönelik korelasyonları başlatır.### Исправление ошибок
  • Исправлена ошибка, начавшаяся с версии 7.4.0, при которой некоторые операции fsync могли быть пропущены в базе данных после любого DropColumnFamily на этой базе данных, пока она не будет заново открыта. Это может привести к потере данных при отключении питания. (Для пользовательских реализаций FileSystem это могло бы привести к FSDirectory::Fsync или FSDirectory::Close после первого FSDirectory::Close; Также, valgrind мог бы сообщить о вызове close() с fd=-1.)
  • Исправлена ошибка, при которой GenericRateLimiter мог бы переопределить установленную динамически скорость передачи данных с помощью SetBytesPerSecond(), когда пользователь настраивает структуру, окружающую его, например, используя GetOptionsFromString() для настройки Options, которое ссылается на существующий объект RateLimiter.
  • Исправлены условия гонки в GenericRateLimiter.
  • Исправлена ошибка в FIFOCompactionPicker::PickTTLCompaction, при которой расчет общего размера мог бы привести к переполнению.
  • Исправлена ошибка данных в связанном списке хэши memtable. При этой ошибке запрос чтения мог бы временно пропустить старую запись в memtable при условии гонки к хэшу.
  • Исправлена ошибка, при которой best_efforts_recovery мог бы не открыть базу данных с mmap чтения.
  • Исправлена ошибка, при которой бинды, прочитанные во время компактирования, могли бы загрязнять кэш.
  • Исправлены условия гонки в LRUCache при использовании вторичного кэша.
  • Исправлена ошибка, при которой бинды, прочитанные итераторами, могли бы быть вставлены в кэш даже при установке опции fill_cache в false.
  • Исправлено аварийное завершение работы, вызванное AllocateData() в CompressedSecondaryCache::SplitValueIntoChunks() и MergeChunksIntoValueTest.
  • Исправлена ошибка в BlobDB, при которой смесь встроенных и биндов значений могла бы привести к неверному значению, переданному в фильтр компактирования (см. #10391).
  • Исправлена утечка памяти в стрессовых тестах, вызванная FaultInjectionSecondaryCache.

Изменение поведения

  • Добавлено контрольное суммирование при передаче отрывка разархивированного WAL во время копирования. Это вместе с #9875, #10037, #10212, #10114 и #10319 обеспечивает защиту целостности данных в процессе восстановления.
  • Чтобы минимизировать внутреннюю фрагментацию, вызванную различной размерностью сжатых блоков в CompressedSecondaryCache, исходный блок теперь делится согласно размеру бинов jemalloc в методе Insert() и затем объединяется обратно в методе Lookup().
  • Удалён PosixLogger, а по умолчанию используется EnvLogger для информационного логирования. Ведущиеся эти два логгера должны иметь очень похожее поведение при использовании стандартного окружения Posix.
  • На данный момент удалены [min|max]_timestamp из VersionEdit, так как они не отслеживаются в MANIFEST, но всё равно потребляют пустые строки типа std::string (до 64 байт) для каждого файла. Если они будут добавлены обратно в будущем, следует хранить их более компактно.
  • Улучшено универсальное решение для выбора уровня хранения, чтобы избежать лишних основных операций сжатия, вызванных увеличением размера данных. Если активна опция preclude_last_level_data_seconds, вычисление увеличения размера данных производится только среди данных, не относящихся к последнему уровню, что позволяет пропустить последний уровень и использовать предпоследний уровень как базовый.
  • При возникновении ошибки записи в файл (при добавлении, синхронизации и т.д.), RocksDB строже ограничивает выполнение других операций над этим файлом, за исключением закрытия файла, если это операция WAL в пути восстановления.
  • Конструктор WriteBufferManager с параметром allow_stall == false больше не будет неявно запускать задержку записи до достижения лимита колич�数量超过限制,以下是剩余部分的翻译:

数量超过限制,以下是剩余部分的翻译:

  • Вместо этого семейство столбцов может продолжать накапливать записи, пока это семейство не будет очищаться, что может привести к увеличению использования памяти. Пользователи, предпочитающие задерживать записи, должны явно установить allow_stall == true.
  • Добавлен CompressedSecondaryCache в тесты стресса.
  • Ключи кэша блока изменились, что приведёт к пропуску любых постоянных кэшей между версиями.

Оптимизация производительности

  • Теперь вместо создания FragmentedRangeTombstoneList при каждом чтении он создаётся один раз и сохраняется в неизменяемых мемтаблицах. Это ускоряет запросы диапазонных отметок удаления из неизменяемых мемтаблиц.
  • При использовании итераторов с интегрированным BlobDB реализация теперь освобождает обработчики кэша блобов сразу после изменения положения итератора.
  • MultiGet теперь может выполнять больше параллельных операций ввода-вывода, читая данные блоков из SST файлов нескольких уровней, если установлен флаг optimize_multiget_for_io.## 7.5.0 (15/07/2022)

Новые возможности

  • Флаг опции experimental_mempurge_threshold теперь является частью ColumnFamilyOptions и может быть динамически конфигурирован через SetOptions().
  • Поддержка обратного итерирования при установке ReadOptions.iter_start_ts.
  • Обеспечена поддержка асинхронного ввода-вывода в ReadOptions.async_io для улучшения времени поиска путём параллельного выполнения поиска в потомках и асинхронного предварительного чтения при последовательном сканировании.
  • Добавлена поддержка кэширования блобов для частого использования блобов в BlobDB.
    • Пользователь может настроить новую опцию column_family_options.blob_cache для включения/выключения кэширования блобов.
    • Поддерживается использование общего кэша с блоками или полностью отдельного кэша.
    • Новая абстракция интерфейса BlobSource для логики чтения блобов даёт всем пользователям доступ к блобам, независимо от того, находятся ли они в кэше блобов, вторичном кэше или (удалённом) хранилище.
  • Добавлена экспериментальная возможность усовершенствованного многоуровневого сжатия AdvancedColumnFamilyOptions.preclude_last_level_data_seconds, которая гарантирует, что новые данные, введённые в течение указанного периода времени, не будут помещены на холодный уровень (функциональность ещё не завершена).

Изменения в публичном API

  • Добавлены структуры метаданных и функции в C API, включая
    • rocksdb_get_column_family_metadata() и rocksdb_get_column_family_metadata_cf() для получения rocksdb_column_family_metadata_t.
    • rocksdb_column_family_metadata_t и его функции получения и уничтожения.
    • rocksdb_level_metadata_t и его функции получения и уничтожения.
    • rocksdb_file_metadata_t и его функции получения и уничтожения.
  • Добавлены функции suggest_compact_range() и suggest_compact_range_cf() в C API.
  • При использовании строгого лимита емкости кэша блоков (LRUCache с strict_capacity_limit = true), операции DB теперь завершаются с кодом состояния kAborted подкодом kMemoryLimit (IsMemoryLimit()) вместо kIncomplete (IsIncomplete()) при достижении лимита емкости, поскольку Incomplete может указывать на другие конкретные вещи для некоторых операций.
  • Вызовы нового кэша NewClockCache временно возвращают LRUCache (с аналогичными характеристиками желаемого ClockCache). Это потому, что ClockCache заменяется новой версией (старый имел неизвестные ошибки), но это всё ещё находится в разработке.
  • Добавлены две функции ReserveThreads() и ReleaseThreads() в класс Env. По умолчанию обе возвращают 0. Новый класс xxxEnv, который наследует Env, должен реализовать эти две функции для управления зарезервированными потоками.
  • Добавлены функции rocksdb_options_get_prepopulate_blob_cache и rocksdb_options_set_prepopulate_blob_cache в C API.
  • Добавлены функции prepopulateBlobCache и setPrepopulateBlobCache в Java API.

Исправления ошибок

  • Исправлена ошибка, при которой резервная копия/точка восстановления могла содержать WAL, удалённый RocksDB.
  • Исправлена ошибка, при которой конкурентные сжатия могли вызвать необязательную дальнейшую задержку записи. В некоторых случаях это могло привести к снижению скорости записи до минимальной.
  • Исправлена ошибка в Logger, при которой создание dbname и db_log_dir на разных файловых системах приводило бы к ошибке и невозможности открытия БД.
  • Исправлена проблема эффективности ЦП и памяти, введённая PR #8336, которое сделало InternalKeyComparator настраиваемым как побочный эффект.

Изменение поведения

  • В многоуровневом сжатии с динамическим уровнем, множитель уровня больше не корректируется из-за переустановки L0. Вместо этого, оценочное значение сжатия корректируется увеличением цели уровня размера за счет добавления входящих байтов из верхних уровней. Это позволит отложить сжатия из верхних уровней, если больше данных приходит из L0. Это исправляет некоторые необязательные полные задержки из-за резкого изменения целей уровня, не расходуя полосу пропускной способности записи при перегрузке записей.
  • Для отслеживания и проверки WAL в MANIFEST, возвращено к первоначальному поведению до #10087: синхронизация живого WAL файла не отслеживается, и мы отслеживаем только синхронизированные размеры закрытых WAL.
  • Сжатие WAL теперь вычисляет/верифицирует контрольную сумму при сжатии/распаковке.### Оптимизация производительности
  • Вместо полной сортировки всех файлов на уровне, SortFileByOverlappingRatio() теперь находит только верхние 50 файлов на основе оценки. Это может улучшить скорость записи для случаев, когда данные загружаются в порядке возрастания ключа и существует большое количество файлов в одном дереве LSM, где применение результатов сжатия является бутылочной горлышкой.
  • В многоуровневом сжатии, простое перемещение L0 -> L1 теперь позволяет переместить более одного файла в одной операции сжатия. Это позволяет быстрее перемещать файлы L0 вниз при загрузке данных в последовательном порядке, что затрудняет достижение условий замедления или остановки. Также ищите простое перемещение L0 -> L1, если только некоторые файлы подходят.
  • В многоуровневом сжатии, попытайтесь просто переместить более одного файла, если возможно, до четырех файлов или максимального размера сжатия. Это позволяет повысить скорость записи для некоторых случаев, когда данные загружаются в последовательном порядке, где применение результатов сжатия является бутылочной горлышкой.

7.4.0 (06/19/2022)

Исправление ошибок

  • Устранена ошибка в вычислении целостности ключ-значение защиты для пользователей местных обновлений memtable. В частности, затронутыми пользователями будут те, кто конфигурирует protection_bytes_per_key > 0 на WriteBatch или WriteOptions, а также конфигурирует inplace_callback != nullptr.
  • Устранена ошибка, при которой снимок, сделанный во время загрузки SST файла, становился нестабильным.
  • Устранена ошибка для баз данных, отличных от TransactionDB, с avoid_flush_during_recovery = true и TransactionDB, где после аварийного завершения работы минимальное число логов для хранения может не меняться при восстановлении и сохранении нового MANIFEST с продвинутыми номерами логов для некоторых колонок, что приводит к ошибке "несоответствие колонок" при втором восстановлении. В качестве решения RocksDB будет сохранять новый MANIFEST после успешной синхронизации нового WAL. Если будущее восстановление начинается с нового MANIFEST, это значит, что новый WAL успешно синхронизирован. Из-за пустого записывающего блока данных в начале гарантируется, что kPointInTimeRecovery WAL пройдет после этой точки. Если будущее восстановление начинается со старого MANIFEST, это значит, что запись нового MANIFEST провалилась. Мы не получим ошибку "SST перед WAL".
  • Устранена ошибка, при которой RocksDB DB::Open() может создавать и записывать два новых MANIFEST файла даже до успешного восстановления. Теперь записи в MANIFEST сохраняются только после успешного восстановления.
  • Устранено конкурентное состояние в отслеживании размера WAL, вызванное небезопасным доступом к итератору после изменения контейнера.
  • Устранена незащищенная конкурентная доступность к WritableDatabase::filesize_ методом DB::SyncWAL() и DB::Put() в двух режимах записи.
  • Устранена ошибка в отслеживании WAL. До этого запроса (#10087), вызов SyncWAL() на единственном файле WAL базы данных не регистрировал событие в MANIFEST, позволяя последующему DB::Open даже если файл WAL отсутствует или поврежден.
  • Устранена ошибка, которая могла вернуть неверные результаты с index_type=kHashSearch и использованием SetOptions для изменения prefix_extractor.
  • Устранена ошибка в отслеживании WAL с wal_compression. Compress WAL записывает kSetCompressionType запись, которая не связана ни с каким номером последовательности. В результате, WalManager::GetSortedWalsOfType() пропускает эти WAL и не возвращает их обратно вызывающему, например, Checkpoint, Backup, что приводит к неудаче операций.
  • Предотвращена аварийная остановка, если файл IDENTITY случайно обрезается до пустого состояния. Новый ID базы данных будет создан и сгенерирован при открытии.
  • Устранена возможная коррозия для пользователей manual_wal_flush и/или FlushWAL(true /* sync */) вместе с track_and_verify_wals_in_manifest == true. Для этих пользователей потеря незаписанных данных (например, из-за потери питания) может сделать будущие открытия базы данных неудачными с сообщением об ошибке Status::Corruption о недостающих данных WAL.
  • Устранена ошибка в WriteBatchInternal::Append(), где точка окончания WAL в записи была не учтена, и функция добавляет неверное количество контрольных сумм.### Изменения публичного API
  • Добавлен новый API GetUnixTime в классе Snapshot, который возвращает Unix время создания снимка.
  • Добавлены транзакционные методы get_pinned и multi_get в C API.
  • Добавлена поддержка двухфазного коммита в C API.
  • Добавлены методы rocksdb_transaction_get_writebatch_wi и rocksdb_transaction_rebuild_from_writebatch в C API.
  • Добавлены методы rocksdb_options_get_blob_file_starting_level и rocksdb_options_set_blob_file_starting_level в C API.
  • Добавлены методы blobFileStartingLevel и setBlobFileStartingLevel в Java API.
  • Добавлен метод SingleDelete для DB в C API.
  • Добавлена поддержка пользовательских временных меток в C API.
    • Метод rocksdb_comparator_with_ts_create для создания временного компаратора.
    • Методы Put, Get, Delete, SingleDelete, MultiGet имеют соответствующие временные методы с суффиксом with_ts.
    • Также добавлены методы C API для транзакций, SstFileWriter, Compaction, как указано здесь.
  • Контракт реализации Comparator::IsSameLengthImmediateSuccessor был обновлен для обхода дизайнерской ошибки в auto_prefix_mode.
  • Документация API для auto_prefix_mode теперь указывает некоторые случаи, когда она возвращает различные результаты чем total_order_seek, из-за дизайнерских ошибок, которые сложно исправить. Пользователи использующие встроенные компараторы и ключи размером хотя бы одного фиксированного префикса не затронуты.
  • Устарела статистика NUM_DATA_BLOCKS_READ_PER_LEVEL и введены новые статистики NUM_LEVEL_READ_PER_MULTIGET и MULTIGET_COROUTINE_COUNT.
  • Введено поле WriteOptions::protection_bytes_per_key, которое можно использовать для включения защиты целостности ключ-значение для живых обновлений.

Новые возможности

  • Добавлен API FileSystem::ReadAsync в io_tracing.
  • Добавлены параметры сборки мусора для blob blob_garbage_collection_policy и blob_garbage_collection_age_cutoff для принудительного включения и отключения сборки мусора, а также выборочного переопределения порогового возраста при использовании CompactRange.
  • Добавлен дополнительный проверочный механизм в GetSortedWalFiles() (также используется в GetLiveFilesStorageInfo(), BackupEngine, и Checkpoint) для снижения риска успешного создания бэкапа или точки восстановления, которые не могут быть открыты из-за отсутствия WAL файла.
  • Добавлен новый параметр колонки blob_file_starting_level для включения записи blob файлов во время флешей и компактов начиная с указанного уровня LSM дерева.
  • Добавлена поддержка временных снимков (#9879).
  • Обеспечена поддержка AbortIO в posix для отмены отправленных асинхронных запросов с помощью io_uring.
  • Добавлена поддержка ограничения скорости для групповых MultiGet() API.
  • Добавлены несколько новых тикеров, статистик производительности и свойств базы данных для BlobDB.
    • Добавлены новые свойства базы данных "rocksdb.blob-cache-capacity", "rocksdb.blob-cache-usage", "rocksdb.blob-cache-pinned-usage" для показа использования кэша blob.
    • Добавлены новые статистики производительности blob_cache_hit_count, blob_read_count, blob_read_byte, blob_read_time, blob_checksum_time и blob_decompress_time.
    • Добавлены новые тикеры BLOB_DB_CACHE_MISS, BLOB_DB_CACHE_HIT, BLOB_DB_CACHE_ADD, BLOB_DB_CACHE_ADD_FAILURES, BLOB_DB_CACHE_BYTES_READ и BLOB_DB_CACHE_BYTES_WRITE.

Изменения поведения

  • DB::Open(), DB::OpenAsSecondary() будут неудачными, если не удается создать Logger (#9984).
  • DB::Write не удерживает глобальный mutex_ если этот экземпляр базы данных не требует переключения WAL и mem-table (#7516).
  • Удалена поддержка чтения фильтров Bloom с устаревшим блочной форматом фильтра. (Поддержка записи таких фильтров была удалена в 7.0.) Для хорошего времени выполнения чтения на старых базах данных, использующих эти фильтры, требуется полное компактирование.
  • Переключение на проверку контрольной суммы в записи в write batch выполняется перед записью в WAL для обнаружения любых повреждений записи (#10114).

Улучшение производительности

  • При компиляции с folly (Meta-внутренняя интеграция; экспериментальная в открытой сборке), улучшена производительность блокировки (эффективность процессора) LRUCache путем использования folly DistributedMutex вместо стандартного mutex.

7.3.0 (05/20/2022)

Исправление ошибок

  • Устранена ошибка, при которой ручное очистка могла заблокировать бесконечно, даже если опции очистки имели wait=false.
  • Устранена ошибка, при которой RocksDB мог повредить базы данных с avoid_flush_during_recovery == true, удаляя действительные WAL, что приводило к ошибке Status::Corruption с сообщением типа "SST файл находится впереди WAL" при попытках повторного открытия.
  • Устранена ошибка в асинхронном пути IO, где неправильная длина данных читается FilePrefetchBuffer, если данные потребляются из двух заполненных буферов и запрос на больше данных отправляется.
  • Устранена ошибка в CompactionFilter. Compaction filter использовал Delete для удаления ключей, даже если ключи должны были быть удалены с помощью SingleDelete. Смешивание Delete и SingleDelete может привести к неопределенному поведению.
  • Устранена ошибка в WritableDatabase::WriteDirect и WritableDatabase::WriteDirectWithChecksum. Определенный приоритет RateLimiter, указанный в ReadOptions, не передавался RateLimiter при запросе токена.
  • Устранена ошибка, которая могла привести к аварийной остановке процесса при ошибке ввода-вывода при чтении блока индекса в MultiGet().### Новые возможности
  • DB::GetLiveFilesStorageInfo готов к использованию в производстве.
  • Добавлены новые статистики PREFETCHED_BYTES_DISCARDED и POLL_WAIT_MICROS, которые записывают количество предварительно прочитанных байтов, выброшенных RocksDB FilePrefetchBuffer, и время ожидания завершения API FS::Poll соответственно.
  • Поддержка удалённого компактирования с переопределением table_properties_collector_factories на этапе компактирования.
  • Начата регистрация уникального ID SST в MANIFEST, который будет использоваться для проверки с SST свойствами при открытии базы данных, чтобы гарантировать, что файл SST не был перезаписан или перемещён. Введено новое опциональное свойство базы данных verify_sst_unique_id_in_manifest для включения/выключения проверки. Если включено, все файлы SST будут открываться при открытии базы данных для проверки уникального ID (по умолчанию false). Рекомендуется использовать его с max_open_files = -1 для предварительного открытия файлов.
  • Добавлена возможность одновременного чтения блоков данных из нескольких файлов в одном уровне в групповом MultiGet. Это можно включить, установив опцию async_io в ReadOptions. Использование этой функции требует FileSystem, поддерживающего ReadAsync (PosixFileSystem пока не поддерживается для этого), и RocksDB должно быть скомпилировано с folly и c++20.
  • Привязка использования памяти метаданных файла. RocksDB удерживает одну структуру метаданных файла в памяти за каждый дисковый файл таблицы. Если операция резервирования памяти для метаданных файла превышает доступное пространство в кэше блоков (то есть, вызывает заполнение кэша при LRUCacheOptions::strict_capacity_limit = true), создание будет неудачным с Status::MemoryLimit(). Чтобы активировать эту функцию, необходимо включить зарядку CacheEntryRole::kFileMetadata в BlockBasedTableOptions::cache_usage_options.

Изменения в публичном API

  • Добавлен обратный вызов rollback_deletion_type_callback к TransactionDBOptions, чтобы подготовленные записи знали, следует ли использовать Delete или SingleDelete для отмены предыдущей записи ключа во время предыдущей фазы подготовки. Цель этого изменения — предотвратить смешивание SingleDeletes и Deletes для одного и того же ключа, что может привести к непредсказуемому поведению для подготовленных записей.
  • EXPERIMENTAL: Добавлена новая API AbortIO в file_system для аборта асинхронно отправленных запросов чтения.
  • Decision в CompactionFilter имеет новый вариант: kRemoveWithSingleDelete. Если CompactionFilter возвращает этот вариант, то CompactionIterator будет использовать SingleDelete для отметки ключа как удаленного.
  • Переименовано CompactionFilter::Decision::kRemoveWithSingleDelete на kPurge, так как последнее звучит более общим и скрывает детали реализации того, как компакт-итератор обрабатывает ключи.
  • Добавлена возможность указывать функции для Prepare и Validate в OptionsTypeInfo. Добавлены методы в OptionTypeInfo для установки этих функций через API. Эти методы предназначены для разработчиков плагинов RocksDB для управления конфигурацией.
  • Добавлен новый неизменяемый параметр базы данных enforce_single_del_contracts. Если установлен в значение false (по умолчанию true), компакция НЕ будет считаться ошибочной из-за использования SingleDelete за которым следует Delete для одного и того же ключа. Эта временная опция предназначена для помощи существующим сценариям миграции.
  • Введен BlockBasedTableOptions::cache_usage_options и используется для замены BlockBasedTableOptions::reserve_table_builder_memory и BlockBasedTableOptions::reserve_table_reader_memory.
  • Изменено GetUniqueIdFromTableProperties для возврата уникального идентификатора размером 128 бит, который теперь является стандартным размером. Старая функциональность (192 бит) доступна через GetExtendedUniqueIdFromTableProperties. Обе функции больше не являются экспериментальными и готовы к использованию в производстве.
  • В IOOptions помечен prio как устаревший для будущего удаления.
  • В file_system.h помечен IOPriority как устаревший для будущего удаления.
  • Добавлен параметр CompressionOptions::use_zstd_dict_trainer, чтобы указать, следует ли использовать zstd словарь тренер для генерации словарей сжатия zstd. По умолчанию это значение равно true для обратной совместимости. Когда этот параметр установлен в значение false, используется zstd API ZDICT_finalizeDictionary для генерации словарей сжатия.
  • API Seek, который позиционирует каждый LevelIterator на правильный блок данных в правильном SST файле, может быть параллелизирован, если включена опция ReadOptions.async_io.
  • Добавлен новый статистический показатель number_async_seek в PerfContext, который указывает количество асинхронных вызовов сделанных seek для предварительной загрузки данных.
  • Добавлена поддержка пользовательских меток времени для чтения только базы данных.### Исправление ошибок
  • RocksDB использует FileSystem::Poll API во время уничтожения объекта, что влияет на производительность, поскольку он ждет завершения запросов чтения, что больше не требуется. Вызов FileSystem::AbortIO для аборта этих запросов решает эту проблему производительности.
  • Устранена ненужная блокировка кэша блока при выполнении запросов внутри пакета MultiGet и между параллельными пакетами, что ранее могло привести к значительному снижению производительности в этом необычном случае. (В более типичных случаях MultiGet эта фиксация ожидается принести небольшое или незначительное улучшение производительности.)

Изменение поведения

  • Принудительно применяется существующий контракт SingleDelete таким образом, что SingleDelete не может быть смешан с Delete, так как это приводит к непредсказуемому поведению. Исправлено несколько тестов единицы, которые нарушают контракт, но случайно проходят.
  • Для ldb --try_load_options по умолчанию установлено значение true, если указан --db и не создается новая база данных. Пользователь все еще может явно отключить это с помощью --try_load_options=false (или явно включить это с помощью --try_load_options).
  • Во время операции Flush записи или Compaction записи/чтения используется WriteController для определения, заблокированы ли записи базы данных или замедлены. Приоритет (Env::IOPriority) затем определяется и передается в IOOptions файловой системы.

Улучшения производительности

  • Исключен вызов malloc_usable_size() в mutex LRU Cache.
  • Уменьшен период удержания mutex базы данных при поиске устаревших файлов для удаления. Когда файл просто перемещается на другой уровень, внутренние файлы будут дважды ссылаться внутри и иногда открываться дважды. Если кандидат на удаление файла не является последней ссылкой, нам потребуется уничтожить ссылку и закрыть файл, но не удалять его. Сейчас мы определяем это путем создания множества всех живых файлов. С улучшением мы проверяем файл против всех версий LSM-дерева.

7.2.0 (15/04/2022)

Исправление ошибок

  • Исправлена ошибка, которая привела к отказу работы RocksDB в ситуации, когда RocksDB был доступен с помощью UNC пути.
  • Исправлено конкурентное состояние, когда 2PC выключено и отслеживание WAL в MANIFEST включено. Конкурентное состояние возникает между двумя фоновыми потоками Flush, пытающимися установить результаты Flush, что приводит к удалению WAL, которое не было отслежено в MANIFEST. Будущее открытие базы данных может завершиться ошибкой.
  • Исправлено конкурентное состояние с использованием после-освобождения кучи с DropColumnFamily.
  • Исправлено, когда rocksdb.read.block.compaction.micros не может отслеживать статистику компактирования (#9722).
  • Исправлены поля file_type, relative_filename и directory, возвращаемые GetLiveFilesMetaData(), которые были добавлены в наследование от FileStorageInfo.
  • Исправлено, когда track_and_verify_wals_in_manifest приводит к корректному отображению ошибки "open error: Corruption: Missing WAL with log number". Коррупция является ложным сигналом, но препятствует открытию базы данных (#9766).
  • Исправлен SegFault в FilePrefetchBuffer с async_io, так как он не ждет завершения ожидающих задач при уничтожении.
  • Исправлен статистический показатель ERROR_HANDLER_AUTORESUME_RETRY_COUNT, значение которого было установлено неверно в portal.h.
  • Исправлено поведение RocksDB DB::Open(), которое может создавать и записывать два новых файла MANIFEST даже до успешного завершения восстановления. Теперь записи в MANIFEST сохраняются только после успешного завершения восстановления.### Новые возможности
  • Для db_bench при --seed=0 или если --seed не установлен, используется текущее время как значение семени. Ранее использовалось значение 1000.
  • Для db_bench при --benchmark, который перечисляет несколько тестов и каждый тест использует семя для ГНЧ, семена между тестами больше не повторяются.
  • Добавлен параметр для динамического учета обновляемого оцениваемого использования памяти читающего таблицы на основе блока в блочном кэше, если блочный кэш доступен. Чтобы активировать эту функцию, установите BlockBasedTableOptions::reserve_table_reader_memory = true.
  • Добавлен новый статистический показатель ASYNC_READ_BYTES, который вычисляет количество прочитанных байтов во время асинхронного чтения и пользователи могут проверить, используют ли они асинхронный код пути, автоматически запрошенный RocksDB для последовательного чтения.
  • Активирован асинхронный предварительный просмотр, если ReadOptions.readahead_size установлен вместе с ReadOptions.async_io в FilePrefetchBuffer.
  • Добавлена поддержка прослушивания событий на стороне удаленного компактора.
  • Добавлен специализированный целочисленный свойство базы данных rocksdb.live-blob-file-garbage-size, которое раскрывает общую сумму мусора в файлах blob в текущей версии.
  • RocksDB выполняет внутренний автоматический предварительный просмотр, если заметил последовательное чтение. Он начинает с размера предварительного просмотра initial_auto_readahead_size, который теперь можно настроить через BlockBasedTableOptions.
  • Добавлен оператор слияния, который позволяет пользователям регистрировать конкретную функцию агрегации, чтобы они могли выполнять агрегацию с использованием различных типов агрегации для разных ключей. Смотрите комментарии в include/rocksdb/utilities/agg_merge.h для реального использования. Эта функция экспериментальная и формат может измениться, и мы не предоставим инструмент миграции.
  • Мета-внутренняя / Экспериментальная: Улучшение производительности процессора путем замены многих использований std::unordered_map с folly::F14FastMap при сборке RocksDB вместе с Folly.
  • Экспериментальная: Добавлен CompressedSecondaryCache, конкретная реализация rocksdb::SecondaryCache, которая интегрируется с библиотеками сжатия (например, LZ4) для хранения сжатых блоков.

Изменение поведения

  • Запрещено использование commit-time-write-batch для write-prepared/write-unprepared транзакций, если TransactionOptions::use_only_the_last_commit_time_batch_for_recovery установлено в значение false, чтобы предотвратить наличие двух (или более) незакоммиченных версий одного и того же ключа в базе данных. В противном случае нижнестоящее компактирование может нарушить внутреннюю инвариантность ключей SST, если последовательные номера обоих внутренних ключей обнулены (#9794).
  • Сделано DB::GetUpdatesSince() возвращать NotSupported рано для write-prepared/write-unprepared транзакций, так как контракт API указывает.

Изменения в публичном API

  • Раскрыты API для анализа результатов сбора статистики блочного кэша в структурированном виде. В частности, пользователи GetMapProperty() с свойством kBlockCacheEntryStats теперь могут использовать функции в BlockCacheEntryStatsMapKeys для поиска статистики в карте.
  • Добавлен выходной параметр is_in_sec_cache к SecondaryCache::Lookup(). Это для указания, следует ли считать, что обработчик может быть удален из вторичного кэша после Lookup.

7.1.0 (03/23/2022)

Новые возможности

  • Разрешено использование WriteBatchWithIndex для индексации WriteBatch, который включает ключи с пользовательскими временными метками. Сам индекс временным метками не имеет.
  • Добавлена поддержка пользовательских временных меток для транзакций write-committed без изменения API. API уровня TransactionDB не позволяют использовать временные метки, так как все операции, осознающие временные метки пользователя, должны проходить через API уровня Transaction.
  • Добавлены опции BlobDB в ldb.
  • BlockBasedTableOptions::detect_filter_construct_corruption теперь может динамически конфигурироваться с помощью DB::SetOptions.
  • Автоматическое восстановление от повторяемых ошибок чтения во время фонового сброса/уплотнения.
  • Экспериментальная поддержка сохранения температур файлов при резервном копировании и восстановлении, а также обновления метаданных базы данных для внешних изменений температур файлов (UpdateManifestForFilesState или ldb update_manifest --update_temperatures).
  • Экспериментальная поддержка асинхронного чтения в ReadOptions, используемого FilePrefetchBuffer для асинхронной предварительной загрузки части данных, если чтение последовательное и автоматическая предварительная загрузка включена внутренне в RocksDB.### Исправления ошибок
  • Устранена серьёзная производительная проблема, связанная с тем, что Bloom фильтры, созданные версией до 7.0, не могут быть прочитаны ранними версиями 7.0.x (и наоборот) из-за изменений в FilterPolicy::Name() в #9590. Это может существенно влиять на производительность чтения и I/O чтения при обновлении или понижении версий с уже существующей базой данных, но не влияет на корректность данных.
  • Устранён раскол данных на versions_ между DBImpl::ResumeImpl() и потоками, ожидающими завершения восстановления (#9496).
  • Устранена ошибка, вызванная гонкой среди сброса, входящих записей и создания снимков. Запросы к снимкам, созданным с этими условиями гонки, могут вернуть неверные данные, например, возобновив удалённые данные.
  • Устранена ошибка, когда DB сбрасывает использует options.compression даже если options.compression_per_level установлен.
  • Устранена ошибка, когда DisableManualCompaction может выдавать утверждение при отключении не запланированного ручного сброса.
  • Устранён раскол данных при отмене ручного сброса с помощью DisableManualCompaction. Также закрытие базы данных может отменить поток ручного сброса.
  • Устранён возможный сбой таймера при одновременном открытии и закрытии базы данных.
  • Устранён раскол данных для alive_log_files_ в режиме без двух очередей записи. Раскол происходит между write_thread_ в WriteToWAL() и другим потоком, выполняющим FindObsoleteFiles(). Раскол будет зафиксирован, если __glibcxx_requires_nonempty активирован.
  • Устранена ошибка, когда Iterator::Refresh() читает устаревшие ключи после выполнения DeleteRange().
  • Устранён раскол данных при отключении и повторном включении ручного сброса.
  • Устранена ошибка автоматического восстановления при атомарном сбросе.
  • Устранён раскол данных при mmap'инге WritableFile на POSIX.

Изменения публичного API

  • Добавлено чистое виртуальное метод FilterPolicy::CompatibilityName(), которое требуется для исправления серьёзной производительной проблемы, связанной с названием FilterPolicy в метаданных SST без затрагивания пользовательской настройки FilterPolicy. Это изменение затрагивает только тех, кто использует свои собственные пользовательские или обёртки классы FilterPolicy.
  • options.compression_per_level теперь может динамически изменяться с помощью SetOptions().
  • Добавлено поле WriteOptions::rate_limiter_priority. Когда значение отличается от Env::IO_TOTAL, внутренний ограничитель скорости (DBOptions::rate_limiter) будет заряжаться по указанному приоритету для записей, связанных с API, которому предоставлены WriteOptions. В настоящее время поддерживается автоматический сброс WAL, который происходит во время живых обновлений (Put(), Write(), Delete(), и т.д.), когда WriteOptions::disableWAL == false и DBOptions::manual_wal_flush == false.
  • Добавлен API DB::OpenAndTrimHistory. Этот API открывает базу данных и обрезает данные до временной метки, указываемой trim_ts (Данные с временной меткой больше указанного значения будут удалены). Этот API следует использовать только при восстановлении колонок с включенными временнymi метками. Если колонка не имеет включённых временных меток, этот API не удалит никаких данных. Этот API не совместим с опцией avoid_flush_during_recovery.
  • Удалено поле BlockBasedTableOptions.hash_index_allow_collision, которое уже не оказывало эффекта.

7.0.0 (02/20/2022)

Исправления ошибок

  • Устранена серьёзная ошибка, связанная с тем, что многократное получение (MultiGet) могло вернуть старые значения для ключей, удалённых с помощью DeleteRange, когда включён мемтаблицный Bloom фильтр (memtable_prefix_bloom_size_ratio > 0). (Исправление включает значительное повышение производительности MultiGet в случае обоих memtable_whole_key_filtering и prefix_extractor.)
  • Устранены ещё несколько случаев вызова EventListener::OnTableFileCreated с состоянием OK, размер файла==0, и отсутствие SST файла. Теперь состояние равно Aborted.
  • Устранена ошибка чтения после освобождения памяти в DB::GetMergeOperands().
  • Устранена ошибка потери данных для 2PC write-committed транзакции, вызванная конкурентным завершением транзакции и переключением мемтаблицы (#9571).
  • Устранены статистики NUM_INDEX_AND_FILTER_BLOCKS_READ_PER_LEVEL, NUM_DATA_BLOCKS_READ_PER_LEVEL и NUM_SST_READ_PER_LEVEL, чтобы они отображались один раз на каждый уровень для каждого батча MultiGet.### Улучшение производительности
  • Снижена стоимость построения хэш-таблицы местоположений файлов, используемых проверками согласованности онлайн LSM деревьев, что может повысить производительность для некоторых рабочих нагрузок (см. #9351).
  • Переключение на использование отсортированного std::vector вместо std::map для хранения объектов метаданных для файлов blob, что может повысить производительность для некоторых рабочих нагрузок, особенно когда количество файлов blob велико.
  • Отключение ручного сброса (DisableManualCompaction()) не требует ожидания выполнения запланированного ручного сброса в пуле потоков для его отмены.

Изменения в публичном API

  • Требуется компилятор, совместимый с C++17 (GCC >= 7, Clang >= 5, Visual Studio >= 2017) для сборки RocksDB и любого кода, использующего заголовочные файлы RocksDB. Смотрите #9388.
  • Добавлено поле ReadOptions::rate_limiter_priority. Когда установлено значение отличное от Env::IO_TOTAL, внутренний ограничитель скорости (DBOptions::rate_limiter) будет взиматься за приоритет, указанный для чтения файлов, связанных с данным API.
  • Удалена поддержка HDFS из основного репозитория.
  • Удалена поддержка librados из основного репозитория.
  • Удалены устаревшие файлы backupable_db.h и тип алиаса BackupableDBOptions. Используйте backup_engine.h и BackupEngineOptions. Аналогичные переименования присутствуют в C и Java API.
  • Удалены устаревшие файлы utility_db.h и метод UtilityDB::OpenTtlDB. Используйте db_ttl.h и DBWithTTL::Open.
  • Удалено устаревшее API DB::AddFile из основного репозитория.
  • Удалено устаревшее API ObjectLibrary::Register() и устаревший публичный API Regex. Используйте ObjectLibrary::AddFactory() с PatternEntry вместо этого.
  • Удалено устаревшее опция DBOption::table_cache_remove_scan_count_limit.
  • Удалено устаревшее API AdvancedColumnFamilyOptions::soft_rate_limit.
  • Удалено устаревшее API AdvancedColumnFamilyOptions::hard_rate_limit.
  • Удалено устаревшее API DBOption::base_background_compactions.
  • Удалено устаревшее API DBOptions::purge_redundant_kvs_while_flush.
  • Удалены устаревшие перегрузки API DB::CompactRange.
  • Удалено устаревшее опция DBOptions::skip_log_error_on_recovery.
  • Удалено поле ReadOptions::iter_start_seqnum, которое было помечено как устаревшее.
  • Удалены устаревшие поля DBOptions::preserved_deletes и метод DB::SetPreserveDeletesSequenceNumber().
  • Удалено устаревшее API AdvancedColumnFamilyOptions::rate_limit_delay_max_milliseconds.
  • Удалён временный штамп времени из WriteOptions. Соответственно, добавлены новые аргументы 'timestamp' в методы Put, Delete, SingleDelete и т.д. в API DB. Также добавлены новые аргументы 'timestamp' в методы WriteBatch. Удалён метод WriteBatch::AssignTimestamps(vector<Slice>). Переименован метод WriteBatch::AssignTimestamp() в WriteBatch::UpdateTimestamps() с уточнёнными комментариями.
  • Изменён тип буфера кэша, передаваемого в Cache::CreateCallback с void* на const void*.
  • Великие обновления в API и конфигурации, связанные с фильтрами:
  • Удалена поддержка устаревших, неэффективных блочных фильтров (включая use_block_based_builder=true).
  • Код и строки конфигурации, которые ранее активировали эти фильтры, теперь тихо активируют полные фильтры. Любые встроенные фильтры могут всё ещё читать блочные фильтры. Это также включает изменение долгоживущего поведения Java API.
  • Удалены устаревшие методы FilterPolicy::CreateFilter() и FilterPolicy::KeyMayMatch().
  • Удалён метод rocksdb_filterpolicy_create() из C API, так как единственная поддержка пользовательских фильтров через этот API стала устаревшей.
  • Если временное использование памяти при создании полного фильтра является проблемой, рассмотрите использование разделённых фильтров, меньших SST файлов или установку reserve_table_builder_memory=true.
  • Удалена поддержка конфигурационной строки "filter_policy=experimental_ribbon". Используйте что-то вроде "filter_policy=ribbonfilter:10" вместо этого.
  • Разрешено использование конфигурационной строки типа "filter_policy=bloomfilter:10" без логического значения, чтобы минимизировать признание устаревших блочных фильтров.
  • Теперь FilterPolicy можно настраивать. Конфигурация filter_policy точно сохраняется в OPTIONS файле и может быть загружена с помощью LoadOptionsFromFile. (Загрузка OPTIONS файла, созданного более ранней версией, позволяет только считывать существующие фильтры, но не создаёт новые.)
  • Изменено значение nullptr возвращаемое из GetBuilderWithContext() с "использовать блочный фильтр" на "не генерировать фильтр".
  • Кроме того, если пользователь указывает bits_per_key < 0.5, мы теперь округляем это до "нет фильтра", поскольку ожидается, что фильтр с ≥ 80% FP-темпами маловероятно будет стоить затраты процессора на его доступ (особенно при cache_index_and_filter_blocks=1 или partition_filters=1).
  • bits_per_key >= 0.5 и < 1.0 всё ещё округляются до 1.0 (для 62% FP темпов).
  • Удалены определения классов FilterBitsBuilder и FilterBitsReader из публичного API, чтобы они могли эволюционировать как детали реализации. Пользовательский FilterPolicy всё ещё может решать, какой вид встроенного фильтра использовать в зависимости от условий.
  • Также удалены устаревшие функции:
  • FilterPolicy::GetFilterBitsBuilder()
  • NewExperimentalRibbonFilterPolicy()
  • Удалена дефолтная реализация Name() из FileSystemWrapper.
  • Переименовано поле SizeApproximationOptions.include_memtabtles в SizeApproximationOptions.include_memtables.
  • Удалено устаревшее опция DBOptions::max_mem_compaction_level.
  • Возвращено Status::InvalidArgument из ObjectRegistry::NewObject, если существует фабрика, но объект не может быть создан (возвращает NotFound, если фабрики нет).
  • Удалены устаревшие перегрузки API DB::GetApproximateSizes.
  • Удалено устаревшее опция DBOptions::new_table_reader_for_compaction_inputs.
  • Добавлены методы Transaction::SetReadTimestampForValidation() и Transaction::SetCommitTimestamp(). Дефолтная реализация возвращает NotSupported().
  • Добавлена поддержка десятичных шаблонов в ObjectLibrary::PatternEntry.
  • Удалены устаревшие удалённые API CompactionService::Start() и CompactionService::WaitForComplete(). Пожалуйста, используйте CompactionService::StartV2() и CompactionService::WaitForCompleteV2(), которые предоставляют ту же информацию, плюс дополнительные данные, такие как приоритет, id базы данных и т.д.
  • ColumnFamilyOptions::OldDefaults и DBOptions::OldDefaults помечены как устаревшие, так как больше не поддерживаются.
  • Добавлены обратные вызовы подкомпакций: OnSubcompactionBegin() и OnSubcompactionCompleted().
  • Добавлена информация о температуре файла в FileOperationInfo в API слушателя событий.
  • Изменён тип SizeApproximationFlags с enum на enum class. Также обновлён сигнатура API DB::GetApproximateSizes с uint8_t на SizeApproximationFlags.
  • Добавлена информация о подсказках температуры из RocksDB в API NewSequentialFile(). операции резерва и точки восстановления должны открывать исходные файлы с помощью NewSequentialFile(), который имеет подсказки температуры. Остальные операции не рассматриваются.### Изменения поведения
  • Запрещено сочетание DBOptions.use_direct_io_for_flush_and_compaction == true и DBOptions.writable_file_max_buffer_size == 0. Это сочетание может привести к бесконечному циклу в WritableFileWriter::Append(), и это мало имеет смысл при использовании прямого ввода-вывода.
  • Поле ReadOptions.total_order_seek больше не влияет на DB.Get(). Исходное мотивационное поведение стало устаревшим с момента, когда RocksDB начал распознавать, совместим ли текущий префикс-экстрактор с тем, который был использован для создания таблиц.

Новые возможности

  • Введено новое опция BlockBasedTableOptions.detect_filter_construct_corruption для обнаружения corruption во время построения фильтров Bloom (format_version >= 5) и Ribbon.
  • Улучшено SstDumpTool для чтения сравнителя из свойств таблицы и использования его для чтения SST файла.
  • Расширены статистики колонок семей в информационном журнале, чтобы общее количество мусора в blob файлах и коэффициент увеличения пространства blob файлов были также записаны. Коэффициент увеличения пространства blob файлов также доступен через свойство базы данных rocksdb.blob-stats.
  • Введен новый API rocksdb_create_dir_if_missing в c.h, который вызывает API CreateDirIfMissing системы файлов для создания директории.
  • Добавлены статистики последнего уровня и не последнего уровня чтения: LAST_LEVEL_READ_*, NON_LAST_LEVEL_READ_*.
  • Экспериментально: добавлена поддержка новых API ReadAsync в FSRandomAccessFile, которая читает данные асинхронно, и API Poll в системе файлов, проверяющий завершение запрошенного запроса чтения. ReadAsync принимает обратный вызов. API Poll проверяет завершение запросов чтения и вызывает обратные вызовы для указания завершения запросов чтения.

Версия 6.29.0 (01/21/2022)

Примечание: следующая версия будет значительным выпуском 7.0. Подробнее см. https://github.com/facebook/rocksdb/issues/9390.

Изменения в публичном API

  • Добавлены значения к TraceFilterType: kTraceFilterIteratorSeek, kTraceFilterIteratorSeekForPrev, и kTraceFilterMultiGet. Они могут быть установлены в TraceOptions для фильтрации типов операций, после которых они указаны.
  • Добавлено поле TraceOptions.preserve_write_order. При включенном состоянии гарантирует, что записи будут трассированы в том же порядке, в котором они были записаны в журнал и применены к базе данных. По умолчанию выключено (ложь), чтобы соответствовать старому поведению и предотвратить регрессию.
  • Объект Env теперь наследует от Customizable. Реализации должны быть зарегистрированы в ObjectRegistry и реализовать метод Name() для создания через этот метод.
  • Options.OldDefaults помечен как устаревший, так как больше не поддерживается.
  • Добавлены классы ObjectLibrary.AddFactory и ObjectLibrary.PatternEntry. Этот метод и связанный класс являются предпочитаемым механизмом регистрации фабрик с ObjectLibrary в будущем. Метод ObjectLibrary.Register, использующий регулярные выражения и потенциально проблемный, помечен как устаревший и будет удален в будущем выпуске.
  • Изменён тип BlockBasedTableOptions.block_size с size_t на uint64_t.
  • Добавлено предупреждение API против использования Iterator.Refresh() вместе с DB.DeleteRange(), которые несовместимы и всегда рискуют привести к неправильным результатам в обновленном итераторе.
  • Объект AdvancedColumnFamilyOptions.bottommost_temperature стал динамически изменяемым с помощью SetOptions().

Изменения поведения

  • Метод DB.DestroyColumnFamilyHandle() теперь возвращает Status.InvalidArgument(), если вызван с DB.DefaultColumnFamily().
  • На платформах с 32-битной архитектурой, тихое отключение mmap чтений больше не происходит, просто рекомендовано избегать.

Новые возможности

  • Добавлен метод Options::DisableExtraChecks(), который может использоваться для повышения пиковой производительности записи путём отключения проверок, которые в отсутствие ошибок программной логики или аппаратных ошибок процессора и памяти должны быть лишними. (По умолчанию параметры настроены таким образом, чтобы медленно переходить к некоторым избыточным затратам времени для дополнительной проверки корректности.)

Улучшения производительности

  • Улучшена производительность чтения при использовании префиксного извлечения (Seek, Get, MultiGet), даже по сравнению с базовым уровнем версии 6.25 (см. исправление ошибки ниже), за счет оптимизации частого случая использования префиксного извлечения совместимого с таблицей файла и неизменяемого.

Исправления ошибок

  • Исправлена ошибка, когда FlushMemTable может вернуть ok даже если очистка не удалась.
  • Исправлена ошибка в Sync() и Fsync(), которая не использовала fcntl(F_FULLFSYNC) на ОС Mac OS X и iOS.
  • Исправлена значительная регрессия производительности в версии 6.26 при использовании префиксного извлечения на пути чтения (Seek, Get, MultiGet). (Больше времени тратилось на SliceTransform::AsString().)
  • Исправлена проблема конкурентного доступа в коде восстановления ошибок SstFileManagerImpl, что могло привести к аварийному завершению программы во время закрытия процесса.

Новые возможности

  • Добавлена поддержка RocksJava для универсального двоичного файла MacOS (ARM+x86).

Версия 6.28.0 (2021-12-17)

Новые возможности

  • Введён новый тег 'CommitWithTimestamp'. На данный момент нет API для пользователя, чтобы запустить запись с этим тегом в журнал транзакций. Это часть усилий по поддержке транзакций с записью, подтвержденной пользовательским временем.
  • Введен SimulatedHybridFileSystem, который может помочь имитировать задержку жесткого диска в db_bench. Имитация задержки хранения в несколько слоёв может быть включена с помощью параметра -simulate_hybrid_fs_file (учтите, что это не работает, если db_bench был прерван посередине). Параметр -simulate_hdd также можно использовать для имитации всех файлов на жестком диске.### Исправления ошибок
  • Исправлена ошибка в автоматическом неявном предварительном чтении rocksdb, которое было сломано из-за нового свойства адаптивного предварительного чтения и внутреннего предварительного чтения, которое было выключено при перемещении итератора между файлами.
  • Исправлена ошибка в TableOptions.prepopulate_block_cache, которая вызывала сегментацию при использовании вместе с TableOptions.partition_filters = true и TableOptions.cache_index_and_filter_blocks = true.
  • Исправлена ошибка, влияющая на пользовательские memtable фабрики, которые не зарегистрированы с ObjectRegistry. Эта ошибка могла привести к невозможности сохранения файла OPTIONS.
  • Исправлена ошибка, которая приводила к добавлению двух дублирующихся записей в файл, открытый в режиме непрямого доступа и отслеживаемый FaultInjectionTestFS.
  • Исправлена ошибка в TableOptions.prepopulate_block_cache для поддержки блочных фильтров.
  • Ключи блочной кэшированной памяти больше не используют FSRandomAccessFile::GetUniqueId() (ранее использовался, если доступен), так что файловая система, рециклирующая уникальные id, больше не сможет привести к неверному результату или аварийному завершению программы (#7405). Для файлов, созданных RocksDB >= OnClickListener, ключи кэша стабильны между DB::Open и перемещением/копированием/экспортом/импортом/миграцией каталога DB, хотя коллизии теоретически возможны, они (а) невозможны в многих обычных случаях, (б) не зависят от внешних факторов и (в) намного менее вероятны, чем мiscalculation процессора при выполнении RocksDB.
  • Исправлена ошибка в связях C, которая приводила к неверному результату итератора (#9343).

Изменение поведения

  • MemTableList::TrimHistory теперь использует распределенные байты при max_write_buffer_size_to_maintain > 0 (по умолчанию в TransactionDB, введено в PR#5022). Исправляет #8371.

Изменение публичного API

  • Расширено WriteBatch::AssignTimestamp и AssignTimestamps API так, чтобы оба эти метода принимали опциональный аргумент checker, выполняющий дополнительную проверку размеров временных меток.
  • Введен новый EventListener обратный вызов, который будет вызван по окончании автоматического восстановления ошибок.
  • Добавлен метод IncreaseFullHistoryTsLow, чтобы пользователи могли продвинуть каждый полный_history_ts_low каждого семейства столбцов отдельно.
  • Добавлен метод GetFullHistoryTsLow, чтобы пользователи могли запросить текущее значение полного_history_ts_low указанного семейства столбцов.

Улучшения производительности

  • Заменено картографическое свойство TableProperties::properties_offsets с uint64_t свойством external_sst_file_global_seqno_offset для экономии памяти свойств таблицы.
  • Доступы к блочной кэшированной памяти стали быстрее благодаря RocksDB, использующему ключи кэша фиксированного размера (16 байтов).

Изменения Java API

  • Удален Java API TableProperties.getPropertiesOffsets(), поскольку он открывал внутренние детали для внешних пользователей.

Версия 6.27.0 (2021-11-19)

Новые возможности

  • Добавлен новый тип контрольной суммы kXXH3, который быстрее kCRC32c почти на всех x86_64 устройствах.
  • Добавлен новый онлайн-проверочный механизм для BlobDB, который проверяет, что количество/общий размер мусорных блобов не превышает количество/общий размер всех блобов в любом данном файле блобов.
  • Предоставлена поддержка для отслеживания информации о пользовательских временных метках для каждого sst в MANIFEST.
  • Добавлен новый параметр "adaptive_readahead" в ReadOptions. Для итераторов RocksDB делает авто-предварительное чтение при обнаружении последовательных чтений, и активируя этот параметр, размер предварительного чтения текущего файла (если чтения последовательны) будет передан следующему файлу вместо того, чтобы начинать заново на каждом уровне (кроме файлов уровня L0). Если чтения не являются последовательными, размер предварительного чтения будет установлен на 8КБ. Этот параметр применим только для внутреннего буфера предварительного чтения RocksDB и не поддерживается с предварительным чтением системы файлов.
  • Добавлены статистики относительно количества чтений и прочитанных байтов для горячих, теплых и холодных файлов в многоуровневом хранилище.
  • Добавлен параметр для динамической нагрузки на использование памяти при построении таблицы на основе блока, если доступна блочная кэшированная память. В настоящее время это включает только зарядку использования памяти при построении (нового) Bloom Filter и Ribbon Filter в блочной кэшированной памяти. Чтобы включить эту возможность, установите BlockBasedTableOptions::reserve_table_builder_memory = true.
  • Добавлен новый API OnIOError в listener.h, который уведомляет слушателей о возникновении ошибки ввода-вывода во время операции FileSystem, включая имя файла, статус и т.д.
  • Добавлена поддержка предварительного чтения компактирования для файлов blob в интегрированной реализации BlobDB, что может повысить производительность компактирования, когда база данных находится на устройстве с более высокой задержкой, таких как жесткие диски или удаленная файловая система. Размер предварительного чтения можно настроить с помощью параметра blob_compaction_readahead_size семейства столбцов.### Исправления ошибок
  • Предотвращена возможность corruption состояния LSM (CompactRange() с CompactRangeOptions::change_level == true) при параллельном выполнении другого ручного компактирования. Обратите внимание, что установка force_consistency_checks == true (по умолчанию) приведёт к тому, что база данных войдет в режим только для чтения в этом случае и вернет Status::Corruption, вместо того, чтобы подтвердить любую corruption.
  • Исправлена ошибка в CompactionIterator при использовании подготовленных для записи транзакций. Выпущенный самый ранний конфликтный снимок может вызвать утверждение ошибки в режиме отладки и неожиданный ключ в режиме оптимизации.
  • Исправлена ошибка тикера WRITE_WITH_WAL("rocksdb.write.wal"). Эта ошибка была вызвана плохим дополнительным RecordTick(stats_, WRITE_WITH_WAL) (в двух местах), эта правка удаляет дополнительные RecordTicks и исправляет соответствующий тестовый случай.
  • EventListener::OnTableFileCreated ранее вызывался со статусом OK и file_size==0 в случаях отсутствия содержимого SST файла (потому что не было ничего, что можно было бы добавить) и пустого файла, удаленного до вызова слушателя. Теперь статус равен Aborted.
  • Исправлена ошибка в CompactionIterator при использовании подготовленных для записи транзакций. Отпуск самого раннего снимка во время компактирования может привести к выходу после DELETE одного и того же пользователя ключа, чей seq был нулевым.
  • Добавлена санитизация входных данных для отрицательных байтов, переданных в GenericRateLimiter::Request.
  • Исправлена ошибка утверждения в CompactionIterator при использовании подготовленных для записи транзакций. Мы доказываем, что некоторые операции могут привести к тому, что DELETE следует за SINGLE_DELETE (один и тот же пользовательский ключ). Мы можем игнорировать SINGLE_DELETE.
  • Исправлена ошибка управления временными метками, которая может привести к удалению всех версий ключа под full_history_ts_low. Эта ошибка может быть активирована, когда некоторые ikeys имеют временные метки ниже full_history_ts_low, тогда как другие новые.
  • В некоторых случаях вне маршрутов чтения и компактирования базы данных, блочные контрольные суммы SST теперь проверяются там, где они не проверялись раньше.
  • Явно проверяется и запрещается использование BlockBasedTableOptions, если вставка в один из {block_cache, block_cache_compressed, persistent_cache} может показаться в другом из этих.
  • Пользователи, которые настроили специализированный путь потоков для нижней части компактирования, явно добавляя потоки в Env::Priority::BOTTOM, больше не будут видеть RocksDB планирующим автоматическое компактирование, превышающее ограничение параллелизма компактирования базы данных. Подробнее об ограничении параллелизма компактирования для каждой базы данных, см. документацию API max_background_compactions и max_background_jobs.
  • Исправлена ошибка фонового потока сброса, который выбирал больше memtables для сброса и преждевременно продвигал log_number семейства столбцов.
  • Исправлена ошибка утверждения в ManifestTailer.
  • Исправлена ошибка, которая могла случайным образом привести к ошибкам при включенном журнале транзакций, таких как ошибки резервного копирования, точки контроля и GetSortedWalFiles().### Изменение поведения
  • NUM_FILES_IN_SINGLE_COMPACTION теперь учитывает все входные файлы, а не только файлы первого уровня входа.
  • Метод TransactionUtil::CheckKeyForConflicts также выполняет проверку конфликтов на основе пользовательских временных меток, а не только на основе последовательностей.

Изменение публичного API

  • При использовании опций options.ttl с уровневой компактацией и приоритетом компактации kMinOverlappingRatio, файлы, превышающие половину значения TTL, будут иметь более высокий приоритет, чтобы к моменту достижения значения TTL было меньше лишних операций компактации. В то же время, при компактации файлов со старыми данными, превышающих половину значения TTL, выходные файлы могут быть отрезаны в соответствии с границами этих файлов, чтобы обеспечить правильную работу ранней компактации TTL.
  • Классы FileSystem и RateLimiter теперь расширяют класс Customizable и имеют метод CreateFromString. Реализации должны быть зарегистрированы в ObjectRegistry и реализовать метод Name() для создания через этот метод.
  • Уточнено в комментариях к API, что RocksDB не является безопасным для исключений при вызовах обратных вызовов и пользовательских расширений. Исключение, распространяющееся в RocksDB, может привести к непредсказуемому поведению, включая потерю данных, невидимым corruption, deadlock и другое.
  • Метод WriteBufferManager помечен как final, так как он не предназначен для расширения.
  • Незначительные детали реализации удалены из файла table_properties.h.
  • Добавлен метод API FSDirectory::FsyncWithDirOptions(), который предоставляет дополнительную информацию, такую как причина синхронизации директории в DirFsyncOptions. Файловые системы, такие как btrfs, используют это для пропуска синхронизации директории при создании нового файла или переименовании файла, а также для синхронизации целевого файла вместо директории, что увеличивает скорость выполнения DB::Open() примерно на 20%.
  • Вызов DB::Open() больше не будет заблокирован очисткой устаревших файлов, если опция DBOptions::avoid_unnecessary_blocking_io установлена в значение true.
  • В сборках, где glibc предоставляет gettid(), строки журнала информации ("LOG") теперь выводят системный идентификатор потока из gettid() вместо локального процессного идентификатора потока pthread_self(). Для всех пользователей формат идентификатора потока изменён с шестнадцатеричного на десятичное число.
  • В сборках, где glibc предоставляет pthread_setname_np(), имена фоновых потоков больше не содержат суффикса ID. Например, "rocksdb:bottom7" (и все остальные потоки в пуле приоритета Env::Priority::BOTTOM) теперь называются "rocksdb:bottom". Предыдущие большие пулы потоков могли нарушать ограничение размера имени (например, имя "rocksdb:bottom10" было бы недействительно).
  • Устарели методы ReadOptions::iter_start_seqnum и DBOptions::preserve_deletes; рекомендуется использовать функциональность пользовательского временного метки вместо них. Эти опции будут удалены в будущих версиях, в настоящее время они генерируют предупреждение при использовании.

Оптимизация производительности

  • Отпуск некоторого связанного с фильтрами памяти раньше в BlockBasedTableBuilder для случаев FullFilter и PartitionedFilter (#9070).

Изменение поведения

  • NUM_FILES_IN_SINGLE_COMPACTION теперь учитывает все входные файлы, а не только файлы первого уровня входа.

6.26.0 (2021-10-20)

Исправление ошибок

  • Исправлена ошибка в режиме направленного ввода-вывода при вызове MultiGet() для бинарных объектов в одном и том же файле бинарных объектов. Ошибка вызвана тем, что запросы чтения бинарных объектов не были отсортированы по смещениям файлов.
  • Исправлена некорректная отмена ограничения скорости удаления SST файлов при расположении WAL и базы данных в разных директориях. Только ограничение скорости удаления WAL должно быть отключено, если оно находится в другой директории.
  • Исправлен метод DisableManualCompaction(), чтобы отменять компактацию даже когда она ждет завершения автоматической компактации из-за CompactRangeOptions::exclusive_manual_compactions == true.
  • Исправлен контракт методов Env::ReopenWritableFile() и FileSystem::ReopenWritableFile() для указания того, что существующий файл не должен быть удален или обрезан.
  • Исправлена ошибка в вызовах IngestExternalFiles() для файлов нескольких колонок семей. Эта ошибка могла привести к задержкам видимости ключей после возврата IngestExternalFiles(). Кроме того, изменения ключей во время их невидимости могли быть потеряны (не обязательно сразу).
  • Исправлен возможный конфликт потоков, влияющий на пользователей WriteBufferManager, которые создали его с allow_stall == true. Конфликт приводил к непредсказуемому поведению (по нашему опыту, обычно к аварийному завершению процесса).
  • Исправлена ошибка, при которой застрявшие записи остаются застрявшими вечно после вызова пользователя WriteBufferManager::SetBufferSize() с new_size == 0 для динамического отключения ограничения памяти.
  • Обеспечено многопоточное безопасное закрытие DB::close().
  • Исправлена ошибка в атомной синхронизации, где один фоновый поток синхронизации будет бесконечно ждать предыдущего фонового потока синхронизации для коммита результата в MANIFEST, но сталкивается с ошибкой, которая преобразуется в мягкую ошибку (база данных не остановлена).
  • Исправлена ошибка в BackupEngine, где некоторые внутренние вызовы GenericRateLimiter::Request() не учитывают условие bytes <= GetSingleBurstBytes().### Новые возможности
  • Вывод информации о файлах бинарных объектов при использовании команды ldb list_live_files_metadata.
  • Поддержка одиночного удаления с пользовательским временем метки.
  • Экспериментальная новая функция DB::GetLiveFilesStorageInfo, которая предлагает унифицированную версию других функций, таких как GetLiveFiles, GetLiveFilesChecksumInfo и GetSortedWalFiles. Чекпоинты и резервы могут демонстрировать небольшие поведенческие изменения и/или улучшенную производительность, поскольку они теперь используют эту новую API.
  • Добавлены статистики чтения/записи байтов удаленной компактации: REMOTE_COMPACT_READ_BYTES, REMOTE_COMPACT_WRITE_BYTES.
  • Введен экспериментальный функционал для выгрузки блоков из блочной кэшированной памяти и загрузки их во вторичную кэшированную память для снижения времени прогрева кэша (например, используется при миграции экземпляра базы данных). Более подробная информация доступна в классах CacheDumper и CacheDumpedLoader в файле rocksdb/utilities/cache_dump_load.h. Обратите внимание, что эта функция подвергается потенциальному изменению в будущем, она пока экспериментальная.
  • Введена новая конфигурационная опция blob_garbage_collection_force_threshold для триггеринга компактации, ориентированной на SST файлы, которые ссылаются на самые старые файлы бинарных объектов, когда отношение мусора в этих файлах бинарных объектов достигает или превышает указанное пороговое значение. Это может снизить пространственную амплитуду при сквозных нагрузках, где затронутые SST файлы могут не получать компактации в противном случае.
  • Добавлена EXPERIMENTAL поддержка уникальных идентификаторов файлов таблиц (SST), которые являются стабильными и универсально уникальными, доступны с помощью новой функции GetUniqueIdFromTableProperties. Только SST файлы из RocksDB >= OnClickListener 6.24 поддерживают уникальные идентификаторы.
  • Добавлена поддержка свойства карты "rocksdb.dbstats" (DB::Properties::kDBStats). Как свойство карты, оно включает внутренние статистики уровня базы данных, накопленные за всю жизнь базы данных, такие как статистика, связанная с записями пользователей, и время работы.

Изменение публичного API

  • Класс SystemClock теперь расширяет класс Customizable и имеет метод CreateFromString. Реализации должны быть зарегистрированы в ObjectRegistry и реализовать метод Name() для создания через этот метод.
  • Класс SliceTransform теперь расширяет класс Customizable и имеет метод CreateFromString. Реализации должны быть зарегистрированы в ObjectRegistry и реализовать метод Name() для создания через этот метод. Классы Capped и Prefixed возвращают короткое имя (без длины); используйте GetId для полного квалифицированного имени.
  • Классы FileChecksumGenFactory, SstPartitionerFactory, TablePropertiesCollectorFactory и WalFilter теперь расширяют класс Customizable и имеют метод CreateFromString.
  • Некоторые поля SstFileMetaData устарели для совместимости с новым базовым классом FileStorageInfo.
  • Добавлено поле file_temperature в IngestExternalFileArg, чтобы при импорте SST файлов можно было указать температуру этого набора файлов.
  • Если вызов DB::Close() завершился ошибкой с состоянием отличным от прерывания, повторный вызов DB::Close() вернет первоначальное состояние вместо Status::OK.
  • Добавлено поле cache_tier в advanced_options.h для описания используемого уровня кэша. Добавлено неизменяемое поле lowest_used_cache_tier в DBOptions и передано в BlockBasedTableReader. По умолчанию это CacheTier::kNonVolatileBlockTier, что означает использование обоих блочных кэшей (kVolatileTier) и вторичных кэшей (kNonVolatileBlockTier). Установка его в CacheTier::kVolatileTier сделает базу данных не использующей вторичный кэш.
  • Даже если options.max_compaction_bytes достигнут, выходные файлы компактации будут отрезаться только тогда, когда они совпадают с границами файлов родителей. options.max_compaction_bytes может слегка нарушаться с этим изменением, но нарушение не превышает размер одного целевого файла SST, который обычно намного меньше.

Оптимизация производительности

  • Улучшена эффективность использования ЦП при построении блочных файлов таблиц (SST) (#9039 и #9040).### Изменение Java API
  • Добавлены Java API для новых интегрированных опций BlobDB.
  • Метод keyMayExist() теперь поддерживает ByteBuffer.
  • Исправлена ошибка многократного получения, выбрасывающая исключение NullPointerException для более чем 70К ключей (https://github.com/facebook/rocksdb/issues/8039).

6.25.0 (2021-09-20)

Исправление ошибок

  • Разрешено вторичному экземпляру обновлять итератор. Присвоение последовательности чтения после ссылки на SuperVersion.
  • Устранена проблема с регрессией последней последовательности в вторичном экземпляре, что приводило к невозможности видеть недавние изменения от основного экземпляра.
  • Устранена проблема, которая могла привести к дублированию ID базы данных или сессий базы данных в окружении POSIX без доступа к /proc/sys/kernel/random/uuid.
  • Устранено гонку в методе DumpStats() при разрушении столбца семьи из-за отсутствия использования Ref для каждого элемента во время итерации ColumnFamilySet.
  • Устранено гонку в методе учета ссылок в LRUCache при продвижении элемента из SecondaryCache.
  • Устранено гонку в BackupEngine при переконфигурировании RateLimiter во время параллельных операций восстановления.
  • Устранена проблема на POSIX, когда неудачное создание файла блокировки может препятствовать будущим попыткам создания этого файла блокировки в том же процессе.
  • Устранены проблемы с ограничением скорости чтения для backup_rate_limiter и restore_rate_limiter в BackupEngine.
  • Устранена проблема реализации prepopulate_block_cache = kFlushOnly, теперь применима только к флешам, а не ко всем сгенерированным файлам.
  • Устранена проблема корruptions данных журнала WAL при использовании DBOptions.manual_wal_flush(true) и WriteOptions.sync(true) вместе. Синхронизация журнала должна работать с заблокированным log_write_mutex_.
  • Добавлены проверки на валидность записей завершения IO uring и отказ выполнения MultiGet подпакета BlockBasedTableReader при наличии невалидной записи завершения.
  • Добавлен интерфейс RocksDbIOUringEnable(), который позволяет пользователям включать/отключать использование IO uring в RocksDB.
  • Устранена проблема, когда использование прямого ввода-вывода и получение короткого результата в MultiRead() приводили к тому, что RandomAccessFileReader::MultiRead() все еще возвращал полный буфер, даже если результат был короче.

Новые возможности

  • Интерфейс удаленного компактирования теперь включает db_name, db_id, session_id, что помогает уникально идентифицировать задачи компактирования между экземплярами базы данных и сессиями.
  • Добавлен счетчик статистики "rocksdb.verify_checksum.read.bytes", отражающий количество прочитанных байтов из файла для запросов VerifyChecksum() и VerifyFileChecksums().
  • Добавлены счетчики статистик "rocksdb.backup.read.bytes" и "rocksdb.backup.write.bytes", отражающие количество прочитанных и записанных байтов во время резервного копирования.
  • Добавлены свойства для BlobDB: rocksdb.num-blob-files, rocksdb.blob-stats, rocksdb.total-blob-file-size, и rocksdb.live-blob-file-size. Существующее свойство rocksdb.estimate_live-data-size было расширено для включения живых байтов, находящихся в файлах Blob.
  • Добавлены два новых уровня приоритета RateLimiter: Env::IO_USER, Env::IO_MID. Env::IO_USER имеет более высокий приоритет над всеми другими RateLimiter IOPriorities без необходимости соблюдения условий справедливого планирования.
  • SstFileWriter теперь поддерживает Puts и Deletes с пользовательски определенными метками времени. Важно отметить, что сама логика загрузки пока не осведомлена о метках времени.
  • Разрешено использовать один пакет записи для ключей из нескольких семейств колонок с различными форматами меток времени. Например, некоторые семейства могут иметь отключенными метками времени, тогда как другие — включенными.
  • Добавлена информация о приоритете компактирования в удаленном компактировании, которую можно использовать для планирования задач с высоким приоритетом первыми.
  • Добавлены новые вызываемые методы OnBlobFileCreationStarted, OnBlobFileCreated и OnBlobFileDeleted в классе EventListener. Они уведомляют слушателей во время создания/удаления отдельных файлов Blob в интегрированном BlobDB. Также регистрируются события завершения создания и удаления файлов Blob в LOG файле.
  • Объединены запросы многократного чтения для DB::MultiGet с помощью MultiRead.
  • Добавлена поддержка перехода к локальному компактированию, где пользователи могут вернуть CompactionServiceJobStatus::kUseLocal для инструкций RocksDB запустить компактирование локально вместо ожидания результата удаленного компактирования.
  • Добавлен внутренний реализации RateLimiter::GetTotalPendingRequest(int64_t* total_pending_requests, const Env::IOPriority pri) для общего числа ожидающих запросов в RateLimiter.
  • Подсчет использования памяти во время буферизации данных, из которых собираются образцы обучения для сжатия словаря, теперь выполняется в блоке кэша. Отбуферизация данных теперь может быть активирована, если блок кэша становится полным и strict_capacity_limit=true.### Изменения в публичном API
  • Удалены устаревшие детали реализации FullKey и ParseFullKey из публичного API.
  • Изменено SstFileMetaData::size с size_t на uint64_t.
  • Теперь Statistics расширяет Customizable класс и добавлен метод CreateFromString. Реализации Statistics должны быть зарегистрированы в ObjectRegistry и реализовать метод Name() для создания через этот метод.
  • Расширены FlushJobInfo и CompactionJobInfo в listener.h для предоставления информации о файлах Blob, сгенерированных флешем/компактированием и очищенных во время компактирования в интегрированном BlobDB. Добавлены члены структур blob_file_addition_infos и blob_file_garbage_infos, содержащие эту информацию.
  • Расширено параметр output_file_names API CompactFiles для включения путей файлов Blob, сгенерированных компактированием в интегрированном BlobDB.
  • Большинство функций BackupEngine теперь возвращают IOStatus вместо Status. Большинство существующих кодов должны быть совместимы с этим изменением, но некоторые вызовы могут потребовать обновления.
  • Добавлен новый параметр level_at_creation в TablePropertiesCollectorFactory::Context для захвата уровня при создании SST файла (таблицы), для которого собираются свойства.

Разное

  • Добавлено строгое тестирование, где в случае, если уровень файловой системы не заполняет буфер, но возвращает успешный результат, контроль сумма будет неправильной, даже если буфер содержит предыдущую часть. Изменённый байт не полезен, поэтому это не должно изменять поведение, если файловая система удовлетворяет своему контракту.

6.24.0 (2021-08-20)

Исправление ошибок

  • Если текущий файл PRIMARY недоступен, вторичная инстанция не должна зависать, пытаясь переключиться на новый MANIFEST. Она должна вместо этого вернуть код ошибки, встреченной при доступе к файлу.
  • Восстановление резервных копий с помощью BackupEngine стало логически атомарной операцией, чтобы обеспечить целостность при прерывании операции восстановления. Использование BackupEngineOptions::sync гарантирует атомарность даже при потере питания или аварийном завершении ОС.
  • Устранена проблема гонки, связанная с разрушением объектов ColumnFamilyData. Ранее логика разблокировала DB mutex перед уничтожением объекта, что могло привести к состоянию гонки.

Изменение публичного API

  • Добавлены API для декодирования и воспроизведения файла трассировки через класс Replayer. Добавлен метод DB::NewDefaultReplayer() для создания экземпляра Replayer по умолчанию. Добавлен метод TraceReader::Reset() для повторного запуска чтения файла трассировки. Созданы файлы trace_record.h, trace_record_result.h и utilities/replayer.h для доступа к декодированным записям трассировки, их воспроизведению и запросу реальных результатов операций.
  • Добавлен метод Configurable::GetOptionsMap в публичный API для использования при создании новых Customizable классов.
  • Обобщены параметры bits_per_key в C API с типа int на тип double для большей конфигурироваемости. Хотя это совместимое изменение для существующего C исходного кода, любые зависимости от сигнатур C API, такие как внешние функциональные интерфейсы, потребуют обновления.

Улучшения производительности

  • По возможности избегайте обновления DBOptions если SetDBOptions() не меняет значение ни одного параметра.

Изменения поведения

  • StringAppendOperator дополнительно принимает строку в качестве разделителя.
  • Опция BackupEngineOptions::sync (по умолчанию true) теперь применяется к восстановлению резервных копий помимо создания резервных копий. Это может замедлить восстановление, но гарантирует полное сохранение перед возвратом OK. (Рассмотрите увеличение max_background_operations для улучшения производительности.)### Новые возможности
  • ldb имеет новую возможность list_live_files_metadata, которая показывает живые SST-файлы, а также уровень LSM-хранения и семейство колонок, к которым они принадлежат.
  • Новая реализация BlobDB теперь отслеживает количество мусора в каждом blob-файле в MANIFEST.
  • Интегрированная BlobDB теперь поддерживает слияние с базовыми значениями (Put/Delete и т.д.).
  • Поддержка под-компактации в RemoteCompaction, ID задачи в пользовательском интерфейсе изменено с int на uint64_t для поддержки ID под-компактации.
  • Выставлены опции статистики в RemoteCompaction рабочем процессе.

Изменение публичного API

  • Добавлены API к классу Customizable для позволения разработчикам создавать свои собственные Customizable классы. Создан файл utilities/customizable_util.h для хранения вспомогательных методов для разработки новых Customizable классов.
  • Изменена сигнатура метода SecondaryCache::Name(). SecondaryCache сделана настраиваемой и добавлен метод SecondaryCache::CreateFromString.

6.22.0 (2021-06-18)

Изменения поведения

  • Добавлены два дополнительных тикера, MEMTABLE_PAYLOAD_BYTES_AT_FLUSH и MEMTABLE_GARBAGE_BYTES_AT_FLUSH. Эти метрики могут использоваться для оценки отношения "мусора" (устаревших данных) в memtable, которое выбрасывается при флеше.
  • Добавлены комментарии к API, уточняющие безопасное использование Disable/EnableManualCompaction и обратных вызовов EventListener для компактации.

Исправления ошибок

  • fs_posix.cc GetFreeSpace() всегда отображает свободное место на диске для root даже при выполнении как non-root. Линуксовские дефолты часто имеют монтирование дисков с 5 до 10 процентов общего места зарезервированным только для root. Для non-root пользователей это может привести к исчерпанию места на диске.
  • Под-компактации теперь отключаются при использовании пользовательских меток времени, поскольку логика выбора границ под-компактации пока не осознает метки времени, что может привести к некорректным результатам при обработке ключей различающихся только по меткам времени.
  • Исправлен баг, при котором DeleteFilesInRange() может вызвать сообщение об ошибке corruption exception или ASSERT для отладочной сборки при активной компактации. На самом деле нет фактической потери данных или повреждения, которое мы нашли.
  • Исправлены дважды выведенные данные в LOG для периодических статистик ("DUMPING STATS"), включая "Compaction Stats" и "File Read Latency Histogram By Level".
  • Исправлены проблемы производительности при фоновом сборе статистики блока кэша, которые могли потреблять много CPU при наличии многих семейств колонок с общим блоком кэша.

Новые возможности

  • Отмечены фильтры Ribbon и оптимизация фильтров для памяти как готовые для производства, каждый из которых позволяет экономить память для фильтров типа Bloom. Используйте NewRibbonFilterPolicy вместо NewBloomFilterPolicy для использования фильтров Ribbon вместо Bloom, или ribbonfilter вместо bloomfilter в строке конфигурации.
  • Разрешено использовать DBWithTTL с API DeleteRange так же, как и другие DBs. Метод DeleteRangeCF(), который выполняет WriteBatchInternal::DeleteRange(), был добавлен в обработчик в DBWithTTLImpl::Write() для его реализации.
  • Добавлен параметр BlockBasedTableOptions.prepopulate_block_cache. Если он включен, он предварительно заполняет теплые/горячие блоки данных, которые уже находятся в памяти, в блок кэше при флеше. При флеше данные блока, которые находятся в памяти (в memtables), записываются на устройство. Если используется Direct IO, возникают дополнительные операции ввода-вывода для чтения этих данных обратно в память, что можно избежать путем включения этого параметра, что также помогает с распределённой файловой системой. Более подробно в include/rocksdb/table.h.
  • Добавлено поле cancel в CompactRangeOptions, позволяющее отменить отдельные в процессе ручные диапазонные компактации.

Новые возможности

  • Добавлен BlobMetaData в ColumnFamilyMetaData для возврата информации о blob-файлах.

Изменение публичного API

  • Добавлен метод GetAllColumnFamilyMetaData для получения ColumnFamilyMetaData обо всех семействах колонок.## 6.21.0 (2021-05-21)

Исправления ошибок

  • Исправлен баг в обработке ошибки переименования файла в распределённых/сетевых файловых системах, когда сервер успешно завершает операцию, но клиент возвращает ошибку. Этот баг может привести к тому, что CURRENT файл будет указывать на несуществующий MANIFEST файл, следовательно, DB не сможет быть открыт.
  • Исправлен баг, при котором заингестированные файлы были записаны с неверной метаданными границы ключа. В редких случаях это могло привести к неверному порядку файлов уровня и неверным результатам запросов для границ ключей.
  • Исправлен конфликт между вставками в memtables и получением свойств DB rocksdb.cur-size-active-mem-table, rocksdb.cur-size-all-mem-tables, и rocksdb.size-all-mem-tables.
  • Исправлено ложное положительное предупреждение при восстановлении из WAL файла. Исключение "SST файл впереди WAL" не должно отображаться для нового пустого семейства колонок, если предыдущий WAL файл поврежден.
  • Исправлен баг, при котором выход GetLiveFiles() включал несуществующий файл "OPTIONS-000000". Резервы и точки контроля, использующие GetLiveFiles(), не работали на DB, затронутых этим багом. Читаемо-записываемые DB были затронуты, когда последний OPTIONS файл не смог записаться и fail_if_options_file_error == false. Только-чтение DB были затронуты, когда не было OPTIONS файлов.
  • Обработка кода возврата io_uring_submit_and_wait() и io_uring_wait_cqe().
  • В API IngestExternalFile(), попытка синхронизации заингестированного файла происходит только если файл связан и FileSystem/Env поддерживают перезапуск записи файла.
  • Исправлен баг, при котором AdvancedColumnFamilyOptions.max_compaction_bytes недооценен для ручной компактации (CompactRange()). Ручная компактация делится на несколько компактаций, если размер компактации превышает max_compaction_bytes. Этот баг создаёт гораздо более крупную компактацию, размер которой превышает настройку пользователя. С другой стороны, больший размер ручной компактации может увеличить параллелизм под-компактации, которую можно настроить, установив max_compaction_bytes.

Изменения поведения

  • Из-за исправления ложного положительного предупреждения "SST файл впереди WAL", все семейства колонок без SST файла (пустое семейство) будут проходить обход проверки согласованности. Мы исправили ложное положительное, но ввели очень редкий истинный отрицательный случай, который будет активирован при следующих условиях: Семейство колонок с некоторыми операциями удаления в последнем нескольких запросах, которые приведут к пустому семейству колонок (эти операции были записаны в SST файл и триггер компактации, которая объединяет этот файл со всеми другими SST файлами и генерирует пустое семейство колонок, или есть другая причина для записи записи MANIFEST для этого семейства после флеша, который не создаёт SST файл из пустого семейства колонок). Записи удаления были зарегистрированы в WAL и этот WAL был поврежден, в то время как номер лога семейства колонок указывает на следующий WAL (из-за флеша). Поэтому DB может восстановиться до состояния без этих последних удалений и привести к несогласованному состоянию DB.

Новые возможности

  • Добавлена новая опция allow_stall при создании экземпляра WriteBufferManager. Когда allow_stall установлена, WriteBufferManager будет приостанавливать всех писателей, общих для нескольких баз данных и столбцов, если использование памяти превышает указанное значение WriteBufferManager::buffer_size (мягкий лимит). Приостановка снимается после освобождения памяти после сброса и снижения использования памяти ниже значения buffer_size.
  • Разрешено применение CompactionFilter в более широких сценариях создания таблиц, таких как сброс и восстановление. Для совместимости CompactionFilter по умолчанию применяются во время компактации. Пользователи могут настроить это поведение путём переопределения метода CompactionFilterFactory::ShouldFilterTableFileCreation().
  • Добавлены дополнительные поля в FilterBuildingContext с деталями LSM для пользовательских политик фильтров, поведение которых зависит от положения в дереве LSM.
  • Добавлено поле DB::Properties::kBlockCacheEntryStats для запроса статистики по процентному использованию различных типов блоков кэша блока с помощью методов DB::GetProperty и DB::GetMapProperty. Та же информация теперь периодически выводится в журнал info согласно значению stats_dump_period_sec.
  • Введён экспериментальный удалённый механизм компактации, который позволяет пользователю выполнять компактацию на другом хосте или процессе. Эта возможность находится в разработке и пока работает только для некоторых базовых случаев. Интерфейс может быть изменён без обратной совместимости.
  • RocksDB проверяет общее количество прочитанных записей при сбросе и сравнивает его с колич�数字需要翻译吗?这个文本中包含了一些数字,但是它们都是数学表达式的一部分,并不需要进行文字描述的翻译。所以这里保持原样即可。

RocksDB проверяет общее количество прочитанных записей при сбросе и сравнивает его с количеством вставленных записей. Если flush_verify_memtable_count = true (по умолчанию), сброс завершится ошибкой. В противном случае, сообщение будет отправлено в журнал info.

  • Добавлено поле TableProperties::num_filter_entries, которое можно использовать вместе с TableProperties::filter_size для вычисления эффективного количества бит на каждую запись фильтра (уникальный ключ пользователя или префикс) для файла таблицы.

Улучшение производительности

  • BlockPrefetcher используется итераторами для предварительной загрузки данных, если они ожидают дальнейшего использования этих данных. Этот механизм активируется неявно RocksDB. Изменения были сделаны для учёта последовательных чтений. Это отключает предварительную загрузку для случайных чтений в MultiGet и итераторах, когда размер предварительной загрузки увеличивается экспоненциально。### Изменения в публичном API
  • Удалён один параметр из TableFactory::NewTableBuilder, который не должен вызываться пользовательским кодом, так как TableBuilder не является публичным API.
  • Удалён незадействованный структурный объект CompactionFilterContext.
  • Параметр skip_filters для SstFileWriter теперь считается устаревшим. Используйте BlockBasedTableOptions::filter_policy для управления генерацией фильтров.
  • ClockCache известен своими ошибками, которые могут привести к аварийному завершению работы или corruption. Его следует избегать до исправления. Используйте NewLRUCache вместо него.
  • Добавлен новый чистый виртуальный метод ApplyToAllEntries к Cache, чтобы заменить ApplyToAllCacheEntries. Кастомные реализации Cache должны добавить свою реализацию этого метода. Поскольку этот метод используется для сбора статистики, пустая реализация может быть допустимой для некоторых приложений.
  • Добавлен ObjectRegistry в класс ConfigOptions. Этот регистр будет использоваться для поиска любых настраиваемых загружаемых объектов во время инициализации.
  • Расширены возможности ObjectRegistry для поддержки вложенных ObjectRegistry. Добавлены методы для регистрации набора функций с регистром/библиотекой как группы.
  • Устарела функциональность backupable_db.h и BackupableDBOptions в пользу новых версий с подходящими названиями: backup_engine.h и BackupEngineOptions. Старое API остаётся совместимым.

Изменения по умолчанию

  • Когда options.arena_block_size <= 0 (значение по умолчанию 0), всё равно использует writer_buffer_size / 8, но ограничивает до 1МБ. Слишком большие размеры аллоцирования могут быть неудобны для аллокатора и могут вызвать проблемы производительности в крайних случаях.

Сборка

  • По умолчанию, попытка сборки с liburing. Для make, если ROCKSDB_USE_IO_URING не установлен, он рассматривается как включен, что означает, что RocksDB попытается собраться с liburing. Пользователи могут отключить это с помощью ROCKSDB_USE_IO_URING=0. Для cmake, добавьте WITH_LIBURING для контроля этого, с дефолтом включенным.

6.20.0 (2021-04-16)

Изменения поведения

  • ColumnFamilyOptions::sample_for_compression теперь влияет на создание всех блочных таблиц. Ранее это влияло только на блочные таблицы, созданные сбросом.
  • CompactFiles() больше не может компактировать файлы с нижнего уровня на верхний уровень, что представляет риск повреждения БД (подробнее: #8063). Проверка также добавлена ко всем операциям компактации.
  • Исправлены некоторые случаи, когда DB::OpenForReadOnly() мог бы записывать в файловую систему. Если вам нужен Logger с доступом только для чтения к БД, вы должны теперь самостоятельно указать DBOptions::info_log, например, используя CreateLoggerFromOptions().
  • get_iostats_context() никогда не вернёт nullptr. Если поддержка поточно-безопасной локальности недоступна, и пользователь не отключил контекст iostats, то компиляция завершится ошибкой. То же самое относится к контексту производительности.
  • Поддержана возможность использования WriteBatchWithIndex::NewIteratorWithBase при overwrite_key=false. Ранее эта комбинация была не поддерживаема и вызывала утверждение или возвращение nullptr.
  • Улучшено поведение WriteBatchWithIndex для операций слияния. Теперь больше операций могут быть сохранены для правильного объединенного результата.

Исправления ошибок

  • Использование поточно-безопасной функции strerror_r() для получения сообщений об ошибках.
  • Исправлен возможный зависший сбой при закрытии БД, у которой Env имеет отключенный высокоприоритетный пул потоков (Env::GetBackgroundThreads(Env::Priority::HIGH) == 0).
  • Обеспечено поточно-безопасное поведение BackupEngine и добавлены комментарии документации для ясности того, что безопасно для множества объектов BackupEngine, обращающихся к одному каталогу резервного копирования.
  • Исправлен сбой (деление на ноль) при применении словаря сжатия к файлу, содержащему только диапазонные отметки удаления.
  • Исправлен сбой обратного итерирования с включенным разделённым фильтром: не включение префикса последнего ключа предыдущего раздела фильтра в текущий раздел фильтра может привести к неверному результату итерирования.
  • Исправлен сбой, позволяющий DBOptions::max_open_files быть установленным с положительным целым числом при ColumnFamilyOptions::compaction_style = kCompactionStyleFIFO.

Улучшение производительности

  • На платформе ARM используется yield вместо wfe для расслабления CPU для лучшей производительности.

Изменения в публичном API

  • Добавлены поля TableProperties::slow_compression_estimated_data_size и TableProperties::fast_compression_estimated_data_size. Когда ColumnFamilyOptions::sample_for_compression > 0, они оценивают, какой был бы размер TableProperties::data_size, если бы было использовано "быстрое" или "медленное" (см. описание API ColumnFamilyOptions::sample_for_compression) сжатие.
  • Обновлены методы DB::StartIOTrace и удалён объект Env из аргументов, поскольку он избыточен и DB уже передаёт объект Env в IOTracer::StartIOTrace.
  • Добавлены поля FlushReason::kWalFull и FlushReason::kWriteBufferManager. Первое отображается при сбросе мемтаблицы из-за достижения размера WAL, второе — при сбросе, вызванном менеджером буферов записи.
  • Расширен командный файл checksum_dump ldb и API DB::GetLiveFilesChecksumInfo для Интегрированной БД Blob и получения контрольной суммы файлов Blob вместе со свёрнутыми файлами SST.### Новые возможности
  • Добавлена возможность открывать резервные копии BackupEngine как только для чтения БД, используя BackupInfo::name_for_open и env_for_open, предоставленные BackupEngine::GetBackupInfo() с include_file_details=true.
  • Добавлена поддержка интегрированной БД Blob для BackupEngine, с использованием общих файлов Blob между резервными копиями при использовании общих файлов таблиц. Из-за текущих ограничений файлы Blob всегда используют схему именования kLegacyCrc32cAndFileSize, и инкрементальные резервные копии должны читать и проверять контрольную сумму всех файлов Blob в БД, даже для файлов, которые уже были резервированы.
  • Добавлен обязательный выходной параметр в BackupEngine::CreateNewBackup(WithMetadata) для возврата ID резервной копии.
  • Добавлены методы BackupEngine::GetBackupInfo и GetLatestBackupInfo для запроса информации о конкретных резервных копиях.
  • Ribbon фильтр стал долгосрочным поддерживаемым функционалом в отношении схемы файлов SST (совместим с версией >= OnClickListener).

6.19.0 (2021-03-21)

Исправления ошибок

  • Исправлено срезание ошибки, найденной в API/инструментах при дампе блочных SST файлов в человекочитаемом формате. После исправления, блочный файл таблицы может быть полностью дампирован как читаемый файл.
  • При встрече условия замедления записи, нет задержки записи (ранее 1 миллисекунда) до тех пор, пока delayed_write_rate действительно превышен, с начальным разрешением всплеска в 1 миллисекунду данных. Также, за пределами начального разрешения всплеска, delayed_write_rate теперь строго контролируется, особенно при работе с несколькими семействами колонок.

Изменение публичного API

  • Установлено значение по умолчанию для BackupableDBOptions::share_files_with_checksum в true и отмечено использование значения false как устаревшее из-за потенциального риска потери данных. Обратите внимание, что принятие этого изменения поведения может временно увеличить использование места для резервного копирования из-за того, что файлы не будут совместно использоваться между резервными копиями с использованием двух различных значений. Также удалена устаревшая опция kFlagMatchInterimNaming.
  • Добавлена новая опция BlockBasedTableOptions::max_auto_readahead_size. RocksDB автоматически выполняет предварительную загрузку для итераторов при обнаружении более чем двух чтений для файла таблицы, если пользователь не предоставляет размер предварительной загрузки. Размер предварительной загрузки начинается с 8КБ и удваивается при каждом последующем чтении до достижения значения max_auto_readahead_size. Теперь max_auto_readahead_size можно настроить динамически. Было установлено, что размер предварительной загрузки 256 КБ обеспечивает лучшую производительность на основе экспериментов для автоматической предварительной загрузки. Экспериментальные данные находятся в запросе PR #3282. Если значение установлено в 0, то никакая автоматическая предварительная загрузка не будет выполнена RocksDB. Также изменение значения будет влиять только на файлы, открытые после изменения.
  • Добавлена поддержка расширения API DB::VerifyFileChecksums для проверки контрольных сумм файлов-блобов.
  • При использовании нового BlobDB количество записываемых данных во время сбросов/компактаций теперь разделено на файлы таблиц и файлы-блобы в статистике компактации; то есть, Write(GB) указывает на объем данных, записанных в файлы таблиц, а Wblob(GB) — на объем данных, записанных в файлы-блобы.
  • Новое значение по умолчанию для BlockBasedTableOptions::format_version=5 для активации новой реализации фильтра Bloom по умолчанию, совместимое с версиями RocksDB >= 6.6.0.
  • Добавлена новая опция SetBufferSize API для WriteBufferManager для динамического управления выделенной памятью для всех буферов записи. Это позволяет пользовательскому коду корректировать мониторинг памяти, предоставленное WriteBufferManager, когда меняются требования к памяти процесса или наборы данных увеличиваются или уменьшаются.
  • Уточнены необходимые семантики функций Read() в API FileSystem и Env. Убедитесь, что любые пользовательские реализации соответствуют этим требованиям.
  • Для нового интегрированного BlobDB компактация теперь включает в себя объем данных, прочитанных из файлов-блобов во время компактации (из-за сборки мусора или фильтров компактации). Метрики увеличения записи также были расширены для учета данных, прочитанных из файлов-блобов.
  • Добавлен метод EqualWithoutTimestamp() в Comparator.
  • Расширенная поддержка для отслеживания файлов-блобов в SSTFileManager при создании или удалении файлов-блобов. Файлы-блобы будут планироваться для удаления через SSTFileManager, и SSTFileManager теперь будет учитывать файлы-блобы при расчетах размера и ограничений пространства вместе со файлами SST.
  • Добавлены новые API Append и PositionedAppend с передачей контрольной суммы для устаревшей реализации Env.### Новые возможности
  • Поддержка фильтров компактации для нового BlobDB. Добавлен метод FilterBlobByKey() в CompactionFilter. Подклассы могут переопределить этот метод, чтобы фильтры компактации могли определять, следует ли читать фактические значения блобов во время компактации. Используется новый kUndetermined в CompactionFilter::Decision для указания необходимости дальнейших действий для фильтров компактации.
  • Добавлена поддержка получения контрольных сумм для файлов-блобов из MANIFEST при создании точки восстановления. Во время резервного копирования RocksDB может обнаруживать повреждения в файлах-блобах во время копирования файлов.
  • Добавлены новые опции для db_bench --benchmarks: flush, waitforcompaction, compact0, compact1.
  • Добавлена опция для BackupEngine::GetBackupInfo для включения имени и размера каждого резервированного файла. Особенно полезно это в присутствии совместного использования файлов между резервными копиями, так как это предлагает детализированное представление использования пространства резервного копирования.
  • Включен обратный итерационный режим для ключей с пользовательски определенными метками времени.
  • Добавлены статистика и информационные логи для обработчика ошибок: счетчики для bg_error, bg_io_error, bg_retryable_io_error, auto_resume_count, auto_resume_total_retry_number, и auto_resume_success; Гистограмма для количества попыток повторного запуска в каждой вызове восстановления. Обратите внимание, что каждая попытка автоматического возобновления имеет одну или несколько попыток повторного запуска.

Изменения поведения

  • Во время сброса, только повторяемые ошибки ввода-вывода WAL преобразуются в жесткую ошибку, которая замедляет записи. Когда используется WAL, но только файлы SST имеют повторяемые ошибки ввода-вывода, они преобразуются в мягкую ошибку, и записи не затрагаются.

6.18.0 (2021-02-19)

Изменения поведения

  • Когда происходит повторяемая ошибка ввода-вывода во время компактации, она преобразуется в мягкую ошибку и устанавливается ошибка в фоновом режиме. Однако автоматическое возобновление не вызывается для очистки мягкой ошибки, поскольку компактация сама перезапланирует. В этом изменении, когда происходит повторяемая ошибка ввода-вывода во время компактации, ошибка в фоновом режиме не устанавливается. Пользователи будут проинформированы об ошибке через EventHelper.
  • Введен новый формат файла трассировки для трассировки запросов и воспроизведения, а версия файла трассировки увеличена до 0.2. Добавлен словарь данных в качестве первой части данных. Мы не будем иметь обратных совместимостей проблем при добавлении новых записей в записи трассировки. Добавлены iterator_upper_bound и iterator_lower_bound в функциях трассировки Seek и SeekForPrev. Они добавлены как новые поля данных для трассировки итератора.

Новые возможности

  • Добавлена поддержка защиты целостности ключ-значения в реальном времени из пользовательских буферов, предоставленных WriteBatch через внутренний буфер обновления RocksDB (memtable). Это предназначено для обнаружения некоторых случаев повреждения данных в памяти, вызванного как программными, так и аппаратными ошибками. Пользователи могут активировать защиту, создавая свой WriteBatch с protection_bytes_per_key == 8.
  • Добавлена поддержка обновления опции full_history_ts_low в ручной компактации, предназначенной для сборки мусора старых меток времени.
  • Введен механизм для использования Makefile для сборки внешнего кода плагина в библиотеки/бинарии RocksDB. Это направлено на упрощение совместимости и распространения для плагинов (например, специальных FileSystem) с кодом, расположенным вне репозитория RocksDB. Смотрите "plugin/README.md" для подробностей для разработчиков, и "PLUGINS.md" для списка доступных плагинов.
  • Добавлена предварительная загрузка памяти для экспериментальной версии Ribbon фильтра, особенно оптимизирующей производительность с групповым получением MultiGet.
  • Новая экспериментальная версия BlobDB (разделение ключ-значения) теперь доступна. Новая реализация интегрирована в ядро RocksDB, то есть она доступна через обычный API rocksdb::DB, в отличие от отдельного интерфейса rocksdb::blob_db::BlobDB используемого ранней версией, и может быть настроена на уровне семейства столбцов с помощью конфигурационных опций enable_blob_files, min_blob_size, blob_file_size, blob_compression_type, enable_blob_garbage_collection, и blob_garbage_collection_age_cutoff. Она расширяет гарантии согласованности RocksDB для блобов и предлагает больше возможностей и лучшую производительность. Обратите внимание, что некоторые возможности, особенно Merge, фильтры компактации и резервное копирование/восстановление, еще не поддерживаются, и нет поддержки миграции базы данных, созданной старым исполнением.

Исправления ошибок

  • С версии 6.15.0, TransactionDB возвращает ошибочные Statusы из вызовов DeleteRange() и вызовов Write(), где WriteBatch содержит операцию удаления диапазона. Ранее такие операции могли успешно завершиться, не предоставляя ожидаемых гарантий транзакций. Есть определенные случаи, когда удаление диапазона все еще может использоваться на таких базах данных; см. документацию API на TransactionDB::DeleteRange() для подробностей.
  • OptimisticTransactionDB теперь возвращает ошибочные Statusы из вызовов DeleteRange() и вызовов Write(), где WriteBatch содержит операцию удаления диапазона. Ранее такие операции могли успешно завершиться, не предоставляя ожидаемых гарантий транзакций.
  • Исправлено поведение WRITE_PREPARED, WRITE_UNPREPARED TransactionDB MultiGet(), которое могло возвращать неподтвержденные данные с помощью снимка.
  • В DB::OpenForReadOnly, если произошла ошибка при проверке пути файла MANIFEST, она была перекрыта Status::NotFound. Это было исправлено, и теперь возвращается настоящая ошибка.### Изменение публичного API
  • Добавлена опция only_mutable_options в ConfigOptions. Когда эта опция установлена в "true", функции конфигурирования и удобные методы (например, GetDBOptionsFromString) будут работать только с опциями, помеченными как изменяемые. Когда эта опция установлена в "true", только опции, помеченные как изменяемые, могут быть настроены (будет возвращен Status::InvalidArgument), а опции, помеченные как неизменяемые, не будут возвращены или сравнены. По умолчанию значение этой опции равно "false", что означает сравнение всех опций.
  • Добавлены новые методы Append и PositionedAppend в FileSystem для передачи информации о проверке данных (информация о контрольных суммах данных) от верхнего уровня (например, WritableFileWriter) до уровня хранения. Таким образом, пользовательская реализация FileSystem сможет в реальном времени проверять правильность данных, записываемых в хранилище. Добавлена опция checksum_handoff_file_types в DBOptions. Пользователи могут использовать эту опцию для контроля над типами файлов (текущие поддерживаемые типы файлов: kWALFile, kTableFile, kDescriptorFile.), которые должны использовать новые методы Append и PositionedAppend для передачи информации о проверке. В настоящее время RocksDB использует CRC32C для вычисления контрольных сумм для передачи информации о проверке.
  • Добавлена опция CompressionOptions::max_dict_buffer_bytes, чтобы ограничить внутреннее кэширование для выбора образцов для генерации/обучения словаря. Ограничение текущего времени является примерным.

Исправленные ошибки

  • Версия старше 6.15 не может декодировать VersionEdits WalAddition и WalDeletion, исправлена путём изменения закодированного формата этих данных так, чтобы они были игнорируемыми старыми версиями.
  • Устранена проблема конкурентного доступа между запусками и завершениями базы данных при управлении периодическими фоновыми рабочими потоками. Одним из последствий этой проблемы могло быть принудительное завершение процесса.

Изменения в публичном API

  • Добавлен публичный метод API WriteBufferManager::dummy_entries_in_cache_usage(), который отображает размер псевдоэлементов, хранящихся в кеше (переданных WriteBufferManager). Псевдоэлементы используются для учета блоков данных.
  • Добавлен класс SystemClock, содержащий методы, связанные со временем, из Env. Оригинальные методы в Env могут быть отключены в будущих выпусках. Этот класс позволит легче тестировать, развивать и расширять функциональность, связанную с временем.
  • Добавлены публичные методы API GetRocksBuildProperties и GetRocksBuildInfoAsString для получения свойств текущего сборки. Эти свойства могут включать настройки, связанные с параметрами GIT (ветка, время). Это изменение также устанавливает "дату сборки" на основе параметров GIT, а не фактического времени сборки, что позволяет создавать более воспроизводимые сборки.

6.16.0 (2020-12-18)

Изменения поведения

  • Попытка записи оператора слияния без явной конфигурации merge_operator теперь немедленно проваливается, заставляя базу данных переходить в режим чтения только. Ранее, провал был отложен до того момента, как merge_operator стал необходимым для пользователя или фоновой операции.

Исправленные ошибки

  • Отрезанные WALs, оконченные незаконченными записями, больше не могут приводить к пробелам в восстановленных данных при использовании WALRecoveryMode::kPointInTimeRecovery. Пробелы всё ещё возможны при отрезке WALs точно на границах записей; для полной защиты пользователи должны активировать track_and_verify_wals_in_manifest.
  • Исправлён баг, когда сжатые блоки, прочитанные через MultiGet, не вставляются в кеш сжатых блоков при use_direct_reads = true.
  • Исправлено полное сканирование устаревших файлов при наличии слишком большого количества ожидающих компакций при активированном ConcurrentTaskLimiter.
  • Исправлена логика заполнения внутренней структуры данных для read_amp_bytes_per_bit при парсинге файла OPTIONS на архитектуре с большим порядком байтов. Без этого исправления, оригинальный код, введённый в PR7659, при выполнении на машине с большим порядком байтов, мог случайно хранить read_amp_bytes_per_bit (uint32) в маленьком порядке байтов. Будущие обращения к read_amp_bytes_per_bit будут давать неверные значения. Архитектура с маленьким порядком байтов не затронута.
  • Исправлен префиксный извлечник с проблемами временных меток.
  • Исправлен атомарный флеш: в двухфазном режиме коммита минимальное число WAL логов для сохранения указано неверно.
  • Исправлен баг, связанный с точкой контроля в PR7789: если есть несколько семейств столбцов, и точка контроля не открыта в режиме чтения только, то в редких случаях может произойти потеря данных в точке контроля. Поскольку движок резервного копирования зависит от точки контроля, он тоже может быть затронут.
  • При использовании ldb --try_load_options с опцией --column_family, ColumnFamilyOptions для указанного семейства столбцов не загружались из файла OPTIONS. Исправлено, теперь они загружаются из OPTIONS и затем заменяются командными строковыми параметрами.

Новые возможности

  • Возможность определения временной метки пользователем поддерживает CompactRange и GetApproximateSizes.
  • Поддерживается получение свёрнутых свойств таблицы (kAggregatedTableProperties и kAggregatedTablePropertiesAtLevel) с помощью DB::GetMapProperty, для удобного доступа к данным в структурированном формате.
  • Экспериментальная опция BlockBasedTableOptions::optimize_filters_for_memory теперь работает с экспериментальным Ribbon фильтром (а также Bloom фильтром).### Изменения в публичном API
  • Устарела публичная, но редко используемая опция FilterBitsBuilder::CalculateNumEntry, которая была заменена на ApproximateNumEntries, принимающую параметр типа size_t и возвращающую значение типа size_t.
  • Для улучшения совместимости функции Env::GetChildren и Env::GetChildrenFileAttributes больше не будут возвращать записи для специальных директорий . или ...
  • Добавлена новая опция track_and_verify_wals_in_manifest. Если true, номера логов и их размеры отслеживаются в MANIFEST, а во время восстановления базы данных, если синхронизированный WAL отсутствует на диске, или размер WAL не соответствует записанному размеру в MANIFEST, будет выдана ошибка и восстановление будет прекращено. Обратите внимание, что эта опция не работает с вторичными экземплярами.
  • В C API функции rocksdb_approximate_sizes и rocksdb_approximate_sizes_cf теперь требуют указатель на ошибку (char** errptr) для передачи любой ошибки.
  • Все перегрузки DB::GetApproximateSizes теперь возвращают статус, чтобы любое неудачное получение размеров было показано вызывающему.

6.15.0 (2020-11-13)

Исправленные ошибки

  • Исправлен баг в следующем сочетании функций: индексы с ключами пользователя (format_version >= 3), индексы разделены (index_type == kTwoLevelIndexSearch), и некоторые части индексов закреплены в памяти (BlockBasedTableOptions::pin_l0_filter_and_index_blocks_in_cache). Баг мог привести к обрезанию ключей при чтении из индекса, что приводило бы к неверным результатам чтения или другому непредвиденному поведению.
  • Исправлен баг при разделении индексов (index_type == kTwoLevelIndexSearch), некоторых частей индексов закреплены в памяти (BlockBasedTableOptions::pin_l0_filter_and_index_blocks_in_cache), и чтение частей могло смешиваться между кешем блока и прямым чтением из файла (например, при enable_index_compression == 1 и mmap_read == 1, части, хранившиеся без сжатия из-за плохого отношения сжатия, читаются прямо из файла через mmap, в то время как части, хранившиеся сжатыми, читаются из кеша блока). Баг мог привести к тому, что части индексов считались пустыми при чтении, что приводило бы к неверным результатам чтения.
  • С 6.12, поиск в memtable должен сообщать об ошибке при неизвестном типе значения (value_type) (#7121).
  • С 6.14, исправлено ложноположительное сообщение об ошибке при флеше/компакции Status::Corruption при paranoid_file_checks == true и записи диапазонных тумблеров в выходные файлы компакции.
  • С 6.14, исправлен баг, который мог привести к аварийному завершению записи при смешанном использовании no_slowdown и slowdown (WriteOptions.no_slowdown=true).
  • Исправлен баг, который приводил к зависанию при закрытии базы данных при установке уровня рефита в опциях сборки. Это происходило потому, что ContinueBackgroundWork() вызывалось в утверждении, которое является бесполезным действием. Это было введено в 6.14.
  • Исправлен баг, который приводил к неверному результату при запросе Get() при применении оператора слияния дважды. Это может произойти, если поток, выполняющий Get(), работает параллельно с фоновым потоком флеша и другим потоком записи в файл MANIFEST (PR6069).
  • Возвращено ранее введенное поведение в 6.14.2, где эффекты флага ignore_unknown_options (используемого в функциях анализа/загрузки опций) снова стали прежними.
  • Возвращено ранее введенное поведение в 6.14, где функции анализа/загрузки опций начали возвращать NotFound вместо InvalidArgument для несуществующих опций в текущей версии.
  • Исправлены баги MultiGet, которые не возвращают корректные данные при определении временной метки пользователем.
  • Исправлен потенциальный баг, возникающий при оценке TableBuilder::NeedCompact() до TableBuilder::Finish() в задаче компакции. Например, метод NeedCompact() объекта CompactOnDeletionCollector, созданного встроенным CompactOnDeletionCollectorFactory, требует завершения BlockBasedTable::Finish() для правильного результата. Баг может привести к тому, что сгенерированный файл компакции не будет помечен для будущей компакции на основе соотношения удалений.
  • Исправлен баг поиска с префиксным извлечником и временной меткой.
  • Исправлен баг кодирования и парсинга BlockBasedTableOptions::read_amp_bytes_per_bit как 64-битного целого числа.
  • Исправлен баг восстановления, подробности в PR7621.

Изменения в публичном API

  • Устарели опции BlockBasedTableOptions::pin_l0_filter_and_index_blocks_in_cache и BlockBasedTableOptions::pin_top_level_index_and_filter. Эти опции продолжают работать до тех пор, пока пользователи не перейдут на новые API в BlockBasedTableOptions::metadata_cache_options. Инструкции по миграции можно найти в комментариях к устаревшим опциям.
  • Добавлен новый метод API DB::VerifyFileChecksums для проверки контрольных сумм SST файлов с соответствующими записями в MANIFEST, если они существуют. Текущая реализация требует сканирования и повторного вычисления контрольных сумм файлов.

Изменения поведения

  • Настройки сжатия словаря, указанные в ColumnFamilyOptions::compression_opts, теперь дополнительно влияют на файлы, сгенерированные флешем и компакцией на уровень выше нижнего. Ранее эти настройки влияли максимум на файлы, сгенерированные компакцией на нижний уровень, в зависимости от того, переопределялись ли они ColumnFamilyOptions::bottommost_compression_opts. Пользователи, рассчитывавшие на то, что настройки сжатия словаря в ColumnFamilyOptions::compression_opts влияют только на нижний уровень, могут сохранить это поведение, переместив свои настройки словаря в ColumnFamilyOptions::bottommost_compression_opts и установив его флаг enabled.
  • Когда установлен флаг enabled в ColumnFamilyOptions::bottommost_compression_opts, эти настройки сжатия теперь применяются независимо от значения в ColumnFamilyOptions::bottommost_compression. Ранее, эти настройки применялись только тогда, когда ColumnFamilyOptions::bottommost_compression != kDisableCompressionOption. Теперь они также применяются, когда ColumnFamilyOptions::bottommost_compression == kDisableCompressionOption (такое значение приводит к тому, что тип сжатия на нижнем уровне падает обратно к ColumnFamilyOptions::compression_per_level, если он настроен, и в противном случае падает обратно к ColumnFamilyOptions::compression).### Новые возможности
  • Экспериментальная альтернатива Bloom фильтру, которая экономит около 30% места по сравнению с Bloom фильтрами, с примерно 3-4 разным временем построения и аналогичным временем запросов, доступна с помощью NewExperimentalRibbonFilterPolicy.## 6.14 (2020-10-09)

Исправление ошибок

  • Устранена ошибка после выполнения CompactRange() с установленной опцией CompactRangeOptions::change_level, которая приводила к конфликту при шаге изменения уровня, что вызывало последующие вызовы CompactRange() с этой опцией завершаться с ошибкой Status::NotSupported("another thread is refitting").
  • Устранена ошибка, при которой нижний уровень компактации мог все еще быть простым перемещением, даже если была установлена опция BottommostLevelCompaction.kForce или kForceOptimized.

Изменение публичного API

  • Методы создания и управления EncryptedEnv были изменены. Теперь EncryptionProvider передается в метод NewEncryptedEnv как указатель на объект shared_ptr вместо обычного указателя. Аналогично, CTREncryptedProvider принимает указатель на объект shared_ptr вместо ссылки на объект BlockCipher. Добавлены методы CreateFromString для BlockCipher и EncryptionProvider для предоставления единого API для создания различных шифров и провайдеров соответственно.
  • Внутренние классы (CTREncryptionProvider, ROT13BlockCipher, CTRCipherStream), связанные с EncryptedEnv, были выведены за рамки публичного API. Для создания CTREncryptionProvider можно использовать EncryptionProvider::NewCTRProvider или EncryptionProvider::CreateFromString("CTR"). Для создания нового ROT13BlockCipher можно использовать BlockCipher::NewROT13Cipher или BlockCipher::CreateFromString("ROT13").
  • Добавлен метод EncryptionProvider::AddCipher для добавления ключей в EncryptionProvider. Этот API позволит будущим провайдерам поддерживать несколько ключей шифрования.
  • Добавлена новая опция "allow_data_in_errors". Когда эта опция установлена пользователями, она позволяет пользователям выбирать получение сообщений об ошибках, содержащих поврежденные ключи/значения. Поврежденные ключи и значения будут записаны в логах, сообщениях, статусах и т.д., что поможет пользователям получить полезную информацию о затронутых данных. По умолчанию значение этой опции равно false для предотвращения случайного раскрытия данных пользователей.
  • Опция AdvancedColumnFamilyOptions::force_consistency_checks теперь имеет значение true по умолчанию, чтобы более активно обнаруживать коррупцию базы данных практически бесплатно (оценено два дополнительных цикла процессора на миллион операций основной рабочей нагрузки). Коррупции, отчеты о которых содержатся в этих проверках, упоминают "force_consistency_checks", что может помочь определить, является ли это ложноположительным отчетом о коррупции и требуется ли отключить эту опцию (что маловероятно).

Общее улучшение

  • Настройки DBOptions и ColumnFamilyOptions теперь управляются объектами Configurable (см. Новые возможности). Те же удобные методы для настройки этих опций все еще существуют, но реализация в фоновом режиме объединена в общую реализацию.

Новые возможности

  • Методы для сериализации, сравнения и конфигурации — такие как TableFactory — теперь доступны непосредственно через базовый класс Configurable (к которому эти объекты наследуются). Это изменение позволит лучше и более полно управлять и получать конфигурационные данные в будущем. Опции для объекта Configurable могут быть установлены с помощью методов ConfigureFromMap, ConfigureFromString или ConfigureOption. Сериализованная версия опций объекта может быть получена с помощью методов GetOptionString, ToString или GetOption. Список поддерживаемых опций объекта может быть получен с помощью метода GetOptionNames. "Чистый" объект (например, BlockBasedTableOption) для опции может быть получен с помощью метода GetOptions. Конфигурируемые опции могут сравниваться с помощью метода AreEquivalent. Настройки внутри объекта Configurable могут быть проверены с помощью метода ValidateOptions. Объект может быть подготовлен (в этот момент могут быть обновлены только изменяемые опции) с помощью метода PrepareOptions.
  • Введен новый параметр options.check_flush_compaction_key_order со значением по умолчанию true. При этом параметре порядок ключей будет проверяться во время записи в каждый SST-файл при флеше и компактации. Если порядок нарушен, флэш или компактация завершится ошибкой.
  • Добавлен параметр is_full_compaction в CompactionJobStats, чтобы информация стала доступной через интерфейс EventListener.
  • Добавлены новые метрики для MultiGet в гистограмме для получения количества прочитанных блоков данных, индексных блоков, блоков фильтров и SST-файлов на каждом уровне.
  • SST-файлы имеют новое свойство таблицы db_host_id, которое по умолчанию устанавливается в имя хоста. Новая опция в DBOptions, db_host_id, позволяет переопределить значение этого свойства пользовательским строковым значением или полностью отключить его, сделав строковое значение опции пустой.
  • Методы для создания настраиваемых расширений — таких как TableFactory — теперь доступны непосредственно через базовый класс Customizable (к которому эти объекты наследуются). Это изменение позволит этим настраиваемым классам быть загружены и настроены стандартным образом (через CreateFromString). Более подробная информация о том, как создавать и использовать настраиваемые классы, находится в заголовочном файле customizable.h.## 6.13 (2020-09-12)

Исправление ошибок

  • Устранена проблема снижения производительности, введенная в версии 6.4, которая выполняет проверку верхней границы для каждого вызова Next(), даже если ключи находятся внутри блока данных, который находится внутри верхней границы.
  • Устранена возможность коррупции состояния LSM (перекрывающиеся файлы на одном уровне) при выполнении CompactRange() для уровней рефитинга (CompactRangeOptions::change_level == true) и другого ручного компактирования параллельно.
  • Санитизация recycle_log_file_num до нуля при попытке пользователя включить её вместе с WALRecoveryMode::kTolerateCorruptedTailRecords. Ранее две функции допускались вместе, что компрометировало гарантии восстановления после аварийного сброса, настроенные пользователем.
  • Устранена ошибка, когда рефитинг уровня в CompactRange() мог конкурировать с автоматическим компактированием, которое помещает данные в целевой уровень рефитинга. Эта ошибка существовала годами.
  • Устранена ошибка в версии 6.12, при которой BackupEngine::CreateNewBackup мог периодически завершиться с ошибками при резервировании читаемо-записываемой базы данных, настроенной с использованием DBOptions::file_checksum_gen_factory.
  • Устранена бесполезная операция NoOp компактирования, запланированная при освобождении снимка, когда опция disable-auto-compactions установлена в true.
  • Устранена ошибка, при которой уничтожение снимка могло привести к некорректному поведению при наличии нескольких потоков, работающих с одним и тем же снимком.
  • Добавлен новый API, который позволяет добавлять ключи в EncryptionProvider. Этот API позволит будущим провайдерам поддерживать несколько ключей шифрования.
  • Добавлена новая опция "allow_data_in_errors". Когда эта опция установлена пользователями, она позволяет пользователям выбирать получение сообщений об ошибках, содержащих поврежденные ключи/значения. Поврежденные ключи и значения будут записаны в логах, сообщениях, статусах и т.д., что поможет пользователям получить полезную информацию о затронутых данных. По умолчанию значение этой опции равно false для предотвращения случайного раскрытия данных пользователей.
  • Опция AdvancedColumnFamilyOptions::force_consistency_checks теперь имеет значение true по умолчанию, чтобы более активно обнаруживать коррупцию базы данных практически бесплатно (оценено два дополнительных цикла процессора на миллион операций основной рабочей нагрузки). Коррупции, отчеты о которых содержатся в этих проверках, упоминают "force_consistency_checks", что может помочь определить, является ли это ложноположительным отчетом о коррупции и требуется ли отключить эту опцию (что маловероятно).

Общее улучшение

  • Настройки DBOptions и ColumnFamilyOptions теперь управляются объектами Configurable (см. Новые возможности). Те же удобные методы для настройки этих опций все ещё существуют, но реализация в фоновом режиме объединена в общую реализацию.### Новые возможности
  • Методы для сериализации, сравнения и конфигурации — такие как TableFactory — теперь доступны непосредственно через базовый класс Configurable (к которому эти объекты наследуются). Это изменение позволит лучше и более полно управлять и получать конфигурационные данные в будущем. Опции для объекта Configurable могут быть установлены с помощью методов ConfigureFromMap, ConfigureFromString или ConfigureOption. Сериализованная версия опций объекта может быть получена с помощью методов GetOptionString, ToString или GetOption. Список поддерживаемых опций объекта может быть получен с помощью метода GetOptionNames. "Чистый" объект (например, BlockBasedTableOption) для опции может быть получен с помощью метода GetOptions. Конфигурируемые опции могут сравниваться с помощью метода AreEquivalent. Настройки внутри объекта Configurable могут быть проверены с помощью метода ValidateOptions. Объект может быть подготовлен (в этот момент могут быть обновлены только изменяемые опции) с помощью метода PrepareOptions.
  • Введен новый параметр options.check_flush_compaction_key_order со значением по умолчанию true. При этом параметре порядок ключей будет проверяться во время записи в каждый SST-файл при флеше и компактации. Если порядок нарушен, флэш или компактация завершится ошибкой.
  • Добавлен параметр is_full_compaction в CompactionJobStats, чтобы информация стала доступной через интерфейс EventListener.
  • Добавлены новые метрики для MultiGet в гистограмме для получения количества прочитанных блоков данных, индексных блоков, блоков фильтров и SST-файлов на каждом уровне.
  • SST-файлы имеют новое свойство таблицы db_host_id, которое по умолчанию устанавливается в имя хоста. Новая опция в DBOptions, db_host_id, позволяет переопределить значение этого свойства пользовательским строковым значением или полностью отключить его, сделав строковое значение опции пустой.
  • Методы для создания настраиваемых расширений — таких как TableFactory — теперь доступны непосредственно через базовый класс Customizable (к которому эти объекты наследуются). Это изменение позволит этим настраиваемым классам быть загружены и настроены стандартным образом (через CreateFromString). Более подробная информация о том, как создавать и использовать настраиваемые классы, находится в заголовочном файле customizable.h.

Изменения поведения

  • По умолчанию статус возврата метода абстракции файла FSRandomAccessFile.Prefetch() был изменён с OK на NotSupported. Если пользовательское наследованное файловое устройство не реализует предварительную загрузку, RocksDB создаёт внутренний буфер предварительной загрузки для улучшения производительности чтения.
  • При возникновении повторяемой ошибки ввода/вывода во время операции Flush (исключение записи манифеста не учитывается) и отключённом журнале транзакций (WAL), ранее она была отображена как kHardError. Теперь она отображается как мягкая ошибка. Поэтому база данных не будет приостанавливать записи, пока памятная таблица не заполнится полностью. В то же время, при активации автоматического восстановления для восстановления повторяемой ошибки ввода/вывода во время Flush, вызов метода SwitchMemtable не осуществляется для предотвращения создания слишком большого количества маленьких неизменяемых памятных таблиц. Если журнал транзакций включен, поведение не изменено.
  • При проверке того, существует ли уже резервная копия файла таблицы в общем разделе каталога резервного копирования, BackupEngine уже запрашивает размеры исходного (БД) и существующего целевого (резервной копии) файлов. Теперь BackupEngine использует эти размеры файлов для выявления корruptions, так как хотя бы один из следующих случаев указывает на наличие корruptions: старая резервная копия, резервная копия в процессе создания или текущая БД имеет неправильный размер.

Другое

  • Ошибки при предварительной загрузке блоков индекса, разделённых на части, больше не будут игнорироваться. Они приведут к завершению запроса и возврату ошибки IOError пользователям.

6.12 (2020-07-28)

Изменения публичного API

  • Классы файловых шифров теперь доступны для наследования в env_encryption.h
  • Объект слушатель файлового ввода/вывода расширен до более широкого охвата операций ввода/вывода. Теперь класс EventListener в listener.h содержит новые обратные вызовы: OnFileFlushFinish(), OnFileSyncFinish(), OnFileRangeSyncFinish(), OnFileTruncateFinish() и OnFileCloseFinish().
  • FileOperationInfo теперь отслеживает duration, измеренный с помощью std::chrono::steady_clock и start_ts, измеренный с помощью std::chrono::system_clock, вместо начальных и конечных меток времени, измеренных с помощью system_clock. Учесть, что system_clock вызывается перед steady_clock в порядке выполнения операции.
  • Добавлен метод DB::GetDbSessionId(std::string& session_id). session_id хранит уникальный идентификатор, который сбрасывается каждый раз при открытии БД. Этот идентификатор сессии БД должен быть уникальным среди всех открытых экземпляров БД на всех хостах и должен быть уникальным среди повторных открытий одной и той же или другой БД. Этот идентификатор записывается в файл LOG на строке, начинающейся со слова "DB Session ID:".
  • Метод DB::OpenForReadOnly() теперь возвращает Status::NotFound, если указанная директория БД не существует. Ранее тип ошибки зависел от базового окружения Env. Это изменение доступно во всех выпусках 6.11.
  • Добавлен параметр verify_with_checksum в метод BackupEngine::VerifyBackup, значение которого по умолчанию равно false. Если он равен true, BackupEngine::VerifyBackup проверяет контрольные суммы и размеры файлов резервной копии. Чтобы сохранить прежнее поведение и производительность BackupEngine::VerifyBackup, передайте false для параметра verify_with_checksum.### Изменения поведения
  • Лучшие усилия восстановления полностью игнорируют файл CURRENT. Если файл CURRENT отсутствует во время восстановления, лучшие усилия продолжаются с использованием файла MANIFEST.
  • В случае лучших усилий восстановления, любая ошибка, которая не является Corruption или IOError::kNotFound или IOError::kPathNotFound, будет замаскирована. Для исправления этого следует проверять все случаи, отличные от OK, и возвращаться заранее.
  • Когда file_checksum_gen_factory установлен на GetFileChecksumGenCrc32cFactory(), BackupEngine сравнивает контрольные суммы CRC32C таблицы файлов, рассчитанные при создании резервной копии, с ожидаемыми контрольными суммами, хранящимися в манифесте БД, и завершает CreateNewBackup() при несоответствии (corruption). Если file_checksum_gen_factory не установлен или установлен на любой другой пользовательский фабрикатор, нет проверки контрольных сумм для выявления corruption SST файлов в БД при чтении, копировании и независимом вычислении контрольных сумм BackupEngine.
  • Когда БД устанавливает stats_dump_period_sec > 0, как первоначальное значение при открытии БД или как динамическое изменение опции, первый вывод статистики откладывается на следующие X секунд, где X — это целое число в диапазоне [0, stats_dump_period_sec). Последующие выводы статистики всё ещё происходят через каждые stats_dump_period_sec секунды.
  • Когда опция параноидальной проверки файлов установлена на true, генерируется хэш всех ключей и значений при записи SST файла, а затем значения читаются обратно для проверки файла. Corruption сигнализируется, если два хэша не совпадают.

Исправление ошибок

  • Сжатый кеш блока автоматически отключался при работе с только для чтения БД по ошибке. Теперь это исправлено: сжатый кеш блока будет действовать также для только для чтения БД.
  • Исправлена ошибка неверного результата итератора, если другая нить завершает обновление и очистку БД между двумя заявками.
  • Отложенное удаление файлов после неудачной записи/синхронизации MANIFEST до повторного открытия БД или вызова Resume(), чтобы последующее открытие не видело MANIFEST, который ссылается на удалённые SST файлы.
  • Исправлена ошибка при index_type == kTwoLevelIndexSearch в PartitionedIndexBuilder для обновления FlushPolicy, чтобы указывать на внутреннего делителя ключей при переходе от режима ключей пользователя к режиму ключей внутренней системы в разделении индекса.
  • Реализация отчета об internal_key corruption при прохождении входных данных.
  • Исправлена ошибка, которая может сделать MultiGet медленным, потому что она может прочитать больше данных, чем требуется, но это не повлияет на правильность. Эта ошибка была введена в версии OnClickListener.VERSION_6_10.
  • Прекращение восстановления и отчёт при встрече с несоответствием контрольной суммы физической записи лога, при чтении MANIFEST. RocksDB не должна продолжать обработку MANIFEST дальше.
  • Исправлена ошибка в универсальном компактировании, активированном увеличением размера и периодическим триггерингом, где настройки сжатия первого уровня входных данных использовались вместо настроек сжатия выходного (нижнего) уровня.### Новые возможности
  • Добавлены идентификатор базы данных (db_id) и идентификатор сессии базы данных (db_session_id) в свойства таблицы и сохранены в SST файлах. SST файлы, сгенерированные из SstFileWriter и Repairer, имеют идентификатор базы данных «SST Writer» и «DB Repairer», соответственно. Их идентификаторы сессий генерируются тем же способом, что и DB::GetDbSessionId. Идентификатор сессии для SstFileWriter (соответственно, Repairer) сбрасывается каждый раз при вызове SstFileWriter::Open (соответственно, Repairer::Run).
  • Добавлен экспериментальный параметр BlockBasedTableOptions::optimize_filters_for_memory для снижения размера выделенной памяти для фильтров Bloom (~10% экономии при использовании Jemalloc), сохранив ту же общую точность. Для применения этого параметра требуется версия формата 5 и malloc_usable_size. Активация этого параметра совместима как вперед, так и назад с существующими версиями формата 5.
  • Добавлен параметр BackupableDBOptions::share_files_with_checksum_naming с новым поведением по умолчанию для имени файлов резервной копии с share_files_with_checksum, чтобы решить проблемы производительности и целостности резервной копии. Подробности см. в комментариях к API.
  • Добавлена функция автовосстановления для автоматического восстановления БД из фоновой повторяемой ошибки ввода/вывода. При возникновении повторяемой ошибки ввода/вывода во время очистки и записи WAL, ошибка отображается как жёсткая ошибка и БД переходит в режим только для чтения. При возникновении повторяемой ошибки ввода/вывода во время компактирования, ошибка отображается как мягкая ошибка. БД остаётся в режиме записи/чтения. Функция автовосстановления создаёт поток для БД для вызова DB->ResumeImpl() для попытки восстановления повторяемой ошибки ввода/вывода во время очистки и записи WAL. Компактирование будет пересохранено само собой, если возникает повторяемая ошибка ввода/вывода. Автовосстановление может также вызвать другие повторяемые ошибки ввода/вывода во время восстановления, поэтому восстановление может провалиться. Повтор автовосстановления может решить проблему, поэтому мы используем max_bgerror_resume_count для определения общего числа циклов автовосстановления. Если это <=0, автовосстановление повторяемых ошибок ввода/вывода отключено. По умолчанию это INT_MAX, что приведёт к бесконечному автовосстановлению. bgerror_resume_retry_interval определяет временной интервал между двумя автовосстановлениями.
  • Параметр max_subcompactions можно динамически установить с помощью DB::SetDBOptions().
  • Добавлен экспериментальный параметр ColumnFamilyOptions::sst_partitioner_factory для определения разделения SST файлов. Это помогает компактированию разделять файлы на интересных границах (префиксы ключей), чтобы сделать распространение SST файлов менее пищеварительно усиленным (перекрывая весь пространственный ключ).

Улучшение производительности

  • Исключение копий ключей для внутренних сравнений при доступе к внесенным блочным таблицам.
  • Уменьшение сравнений ключей при случайном доступе во всех блочных таблицах.
  • BackupEngine избегает лишних повторных вычислений контрольных сумм при резервном копировании файла таблицы в каталог shared_checksum при использовании share_files_with_checksum_naming = kUseDbSessionId (новое значение по умолчанию), за исключением SST файлов, сгенерированных до этой версии RocksDB, которые используются kLegacyCrc32cAndFileSize.

6.11 (2020-06-12)

Исправление ошибок

  • Исправлено отслеживание ошибок согласованности в некоторых случаях при options.force_consistency_checks = true.
  • Исправлена возможная неверная ошибка NotFound при выполнении многопоточного MultiGet с использованием типа индекса kHashSearch.
  • Исправлена коррозия, вызванная активацией компактации, запущенной удалением (NewCompactOnDeletionCollectorFactory) в универсальном режиме компактации вместе с параллельной компактацией. Эта ошибка может привести к тому, что два параллельных процесса выберут одинаковые входные файлы, что приведёт к воскрешению более старых и удалённых версий некоторых ключей.
  • Исправлено использование после освобождения памяти в попытках лучшего усилия восстановления. column_family_memtables_ должно указывать на действительный объект ColumnFamilySet.
  • Добавлено игнорирование поврежденных файлов во время загрузки таблиц.
  • Исправлено чтение поврежденного ключа из импортированного файла при изменении направления итератора с обратного на прямое при ключе, который является префиксом другого ключа в том же файле. Это возможно только в файлах с ненулевой глобальной последовательностью.
  • Исправлено некорректное значение при получении приближенного размера (GetApproximateSizes) при начале диапазона близко к концу одного SST файла и близко к началу следующего. Теперь GetApproximateSizes постоянно и справедливо включает размер метаданных SST, а также блоки данных, распределяя метаданные пропорционально среди блоков данных на основе их размера.
  • Исправлен потенциальный утечка файловых дескрипторов в методах IsDirectory() и NewRandomAccessFile() класса PosixEnv.
  • Исправлено ложное отрицательное значение от API VerifyChecksum() при несоответствии контрольных сумм в блоках индексного раздела в файле таблицы на основе блока (индексный тип kTwoLevelIndexSearch).
  • Исправлено возвращение ненулевого кода завершения при использовании sst_dump, если указанный файл не является признанным SST файлом или проверка запроса не проходит.
  • Исправлены некорректные результаты при выполнении многопоточного MultiGet для дубликатных ключей, когда дубликатный ключ совпадает с наибольшим ключом SST файла и тип значения для этого ключа в файле — это объединяемое значение.### Изменения в общественном API
  • Метод Flush(..., column_family) теперь может возвращать Status::ColumnFamilyDropped() вместо Status::InvalidArgument(), если column_family был удален во время обработки запроса на флэш.
  • BlobDB теперь явно запрещает использование хранилищ по умолчанию как хранилища для блобов.
  • Метод DeleteRange теперь возвращает Status::InvalidArgument, если конечный ключ диапазона находится перед начальным ключом в соответствии с пользовательским компаратором. Ранее поведение было неопределенным.
  • Программа ldb теперь использует options.force_consistency_checks = true по умолчанию и добавляет опцию --disable_consistency_checks для её отключения.
  • Метод DB::OpenForReadOnly больше не создаёт файлы или директории, если указанная база данных не существует, за исключением случаев, когда установлен параметр create_if_missing.
  • Проверки согласованности, выполняемые при изменениях состояния LSM (добавление/удаление файлов таблиц при флэш и компактации), стали строже, эффективнее и обязательными, то есть они выполняются даже если force_consistency_checks равен false.
  • Отключение компактации, запущенной удалением (NewCompactOnDeletionCollectorFactory) в универсальном режиме компактации и при num_levels = 2, для предотвращения ошибки коррозии.
  • Опция pin_l0_filter_and_index_blocks_in_cache больше не применяется к файлам L0 размером более 1.5 * write_buffer_size для обеспечения более предсказуемого использования памяти. Такие файлы могут существовать из-за внутренней компактации L0, внешнего импорта файлов или динамического изменения write_buffer_size пользователем (хотя уже закреплённые файлы продолжат оставаться закреплёнными даже после такого динамического изменения).
  • В режиме восстановления по времени, отказ восстановления базы данных при возникновении ошибки чтения WAL для предотвращения потери данных.
  • Добавлен новый метод Env::LowerThreadPoolCPUPriority(Priority, CpuPriority) для возможности понижения приоритета до конкретного уровня, такого как CpuPriority::kIdle.

Новые возможности

  • Добавлен новый аргумент --readahead_size для sst_dump. Пользователи могут указать размер чтения при сканировании данных. sst_dump также пытается предварительно загружать хвостовые части SST файлов, поэтому обычно некоторые операции ввода-вывода экономятся таким образом.
  • Генерация контрольной суммы файла в SstFileWriter, если установлена опция Options.file_checksum_gen_factory. Контрольная сумма и имя генерирующей функции контрольной суммы сохраняются в ExternalSstFileInfo после завершения записи SST файла.
  • Добавлена опция value_size_soft_limit в опции чтения, которая ограничивает общую сумму значений ключей, считываемых в группах при выполнении MultiGet. Как только общая сумма значений найденных ключей превышает read_options.value_size_soft_limit, все остальные ключи будут возвращены со статусом Abort без дальнейшего поиска их значений. По умолчанию value_size_soft_limit равно std::numeric_limits<uint64_t>::max().
  • Активирована возможность импорта SST файлов с информацией о контрольных суммах при вызове IngestExternalFiles(const std::vector<IngestExternalFileArg>& args). Добавлены поля files_checksums и files_checksum_func_names в IngestExternalFileArg для возможности импорта SST файлов с их информацией о контрольных суммах. Добавлен параметр verify_file_checksum в IngestExternalFileOptions (по умолчанию True). Для обратной совместимости, если база данных не активирует контрольные суммы или пользователь не предоставляет информацию о контрольных суммах (вектора files_checksums и files_checksum_func_names оба пусты), проверка контрольных сумм всегда успешна. Если база данных активирует контрольные суммы, она будет всегда генерировать контрольную сумму для каждого импортированного файла SST на этапе подготовки и сохранять её в манифесте, если verify_file_checksum равно False и информация о контрольных суммах предоставляется программой. В этом случае мы только проверяем имя генерирующей функции контрольной суммы и сразу сохраняем импортированную контрольную сумму в манифесте. Если verify_file_checksum установлено в True, база данных будет проверять импортированную контрольную сумму и имя генерирующей функции против сгенерированных. Любое несоответствие приведёт к провалу импорта. Обратите внимание, что если IngestExternalFileOptions::write_global_seqno равно True, последовательность будет изменена в импортированном файле. Поэтому контрольная сумма файла тоже изменится. В этом случае новая контрольная сумма будет сгенерирована после обновления последовательности и сохранена в манифесте.

Улучшение производительности

  • Исключен лишний сравнение ключей при случайном доступе в блочных таблицах.## 6.10 (2020-05-02)

Исправление ошибок

  • Исправлено чтение неверного результата из импортированного файла. Может произойти, если ключ в файле является префиксом другого ключа в том же файле. Эта проблема может привести к еще большей коррозии данных. Проблема существует с rocksdb >= OnClickListener 5.0.0 с момента введения метода DB::IngestExternalFile().

  • Завершено реализование BlockBasedTableOptions::IndexType::kBinarySearchWithFirstKey. Теперь он готов к использованию. Значительно снижает увеличение чтения в некоторых конфигурациях, особенно для итерационных поисков.

  • Исправлено создание файла CURRENT таким образом, чтобы он указывал на правильный файл MANIFEST после попытки восстановления лучших усилий.

  • Исправлено удаление объектов ColumnFamilyHandle в случае ошибки при открытии BlobDB после открытия базовой базы данных.

  • Исправлено потенциально неопределенное поведение, вызванное попыткой обращения к null-указателю (аргумент timestamp) в методе DB::MultiGet.

  • Исправлено чтение неверного результата из-за отсутствия учета пользователя timestamp при создании LookupKey в MultiGet. Это может привести к неверному результату запроса, поскольку последние байты пользователя ключа, если они не короче timestamp, могут быть приняты за timestamp пользователя.

  • Исправлено использование неверной функции сравнения при сортировке входных ключей MultiGet с временными отметками.

  • Обновлено использование библиотеки bzip (1.0.6 -> 1.0.8) для работы с RocksJava для решения потенциальных уязвимостей, если злоумышленник может манипулировать сжатыми данными, сохраненными и загруженными RocksDB (не нормально). Смотрите задачу #6703.

Изменения в общественном API

  • Добавлен аргумент ConfigOptions в методы, связанные с конвертацией опций в и из строк и файлов. Этот аргумент заменяет некоторые опции (например, input_strings_escaped и ignore_unknown_options) и позволяет передавать больше параметров без изменения сигнатуры функции.

  • Добавлен метод NewFileChecksumGenCrc32cFactory в публичный API контрольных сумм, чтобы встроенный генератор контрольных сумм на основе CRC32c мог использоваться приложениями.

  • Добавлен метод IsDirectory в классы Env и FS для определения, является ли путь каталогом.

Новые возможности

  • Поддержка пайплайнной и параллельной оптимизации сжатия для BlockBasedTableBuilder. Эта оптимизация делает сбор блоков, сжатие блоков и добавление блоков в файл пайплайном процессом и использует несколько потоков для ускорения сжатия блоков. Пользователи могут установить CompressionOptions::parallel_threads больше чем 1 для активации параллельного сжатия. Эта функция экспериментальная.

  • Предоставлен аллокатор для memkind для использования с блоками кэша. Это работает с технологиями памяти (Intel DCPMM — одна из таких технологий, доступных сегодня), требующими различных библиотек для выделения и управления памятью (например, PMDK и memkind). Высокие емкости позволяют использовать большие кэши (до нескольких терабайтов в размере) сверх того, что достижимо с помощью DRAM.

  • Опция max_background_flushes может быть динамически установлена через метод DB::SetDBOptions().

  • Добавлена возможность в инструменте sst_dump для проверки размера сжатого файла для разных уровней сжатия и вывода затраченного времени на сжатие файлов с каждым типом сжатия. Добавлены аргументы --compression_level_from и --compression_level_to для отчета о размерах всех уровней сжатия и одного типа сжатия, чтобы отчет содержал размеры сжатия одного типа сжатия с различными уровнями.

  • Добавлены статистики для избыточных вставок в блочный кэш: rocksdb.block.cache.*add.redundant. (Существует текущее отсутствие координации для обеспечения того, что только один поток загружает блок таблицы, когда многие потоки пытаются получить доступ к этому блоку таблицы.)

Исправленные ошибки

  • Исправлена ошибка при динамическом изменении параметров options.bottommost_compression, options.compression_opts и options.bottommost_compression_opts: изменённые значения не записываются в файлы с параметрами или не возвращаются обратно пользователям при запросах.

  • Исправлена ошибка, когда сравнение ключей индекса не учитывалось в PerfContext::user_key_comparison_count для поисков в файлах, созданных с format_version >= 3.

  • Исправлено множество проблем с обновлением статистики bloom.filter в режиме многофайлового MultiGet.

Улучшения производительности

  • Улучшение производительности батчевого MultiGet с разделёнными фильтрами за счет совместного использования блочного кэша для применимых блоков фильтров.

  • Уменьшение копий памяти при получении и распаковке сжатых блоков из sst файлов.## Версия 6.9.0 (2020-03-29)

Изменения поведения

  • С версии RocksDB 6.8 TTL-основанная FIFO компакция может удалить файл, если самый старый ключ становится старше чем options.ttl, хотя остальные ключи этого файла еще нет. Это исправление отменяет это поведение и делает TTL-основанную FIFO компакцию использующей время записи файла как критерий. Для корректной работы данного исправления требуется установка max_open_files = -1 и compaction_options_fifo.allow_compaction = false.

Изменения публичного API

  • Исправлено правильное написание состояния транзакций API, теперь используется правильно написанное имя состояния COMMITTED, а старое неправильно написанное COMMITED остается доступным как псевдоним.
  • Обновлено значение по умолчанию параметра BlockBasedTableOptions.format_version с 2 до 4. SST файлы, созданные с новым значением по умолчанию, могут быть прочитаны версиями RocksDB 5.16 и выше, и используют более эффективное кодирование ключей в блоках индекса.
  • Добавлен новый параметр CreateBackupOptions в методы BackupEngine::CreateNewBackup и BackupEngine::CreateNewBackupWithMetadata, позволяющий уменьшить приоритет процессора фоновых потоков BackupEngine путем установки параметров decrease_background_thread_cpu_priority и background_thread_cpu_priority в CreateBackupOptions.
  • Обновлен публичный API проверки контрольных сумм SST файлов. Введенное использование FileChecksumGenFactory для создания объекта FileChecksumGenerator для каждого SST файла, таким образом контрольная сумма генератора не будет общим и сможет быть более универсальной для реализации контрольных сумм. Интерфейс FileChecksumGenerator изменен с Value, Extend и GetChecksum на Update, Finalize и GetChecksum. Метод Finalize следует вызывать только один раз после завершения всех данных для получения окончательной контрольной суммы. Временные данные должны храниться внутри самого объекта FileChecksumGenerator.

Исправленные ошибки

  • Исправлена ошибка некорректного кэширования блоков диапазона tombstones во время импорта файлов. Если блоки tombstones были прочитаны из некорректно кэшированных блоков, ключи, покрываемые этими блоками, могли быть выявлены.
  • Исправлен конфликт данных, который мог привести к аварийному завершению программы при вызове DB::GetCreationTimeOfOldestFile() с малой вероятностью. Ошибка была введена в выпуске 6.6.
  • Исправлена ошибка, где логическое значение optimize_filters_for_hits было установлено для максимального количества потоков при вызове load_table_handles после сброса или компакции. Значение должно быть равно 1. Эта ошибка не должна привести к видимым пользователями проблемам.
  • Исправлена ошибка, которая могла привести к аварийному завершению сервиса при неудачной попытке вставки временного обработчика в блочный кэш менеджера записи.

Улучшения производительности

  • В CompactRange, начиная с уровня 0, если уровень не имеет ни одного файла с ключом, входящим в указанный диапазон, то этот уровень пропускается. Таким образом, вместо всегда начинающегося с уровня 0, компакция начинается с первого уровня, содержащего ключи в указанном диапазоне, и продолжается до последнего такого уровня.
  • Уменьшено количество копий памяти при чтении sst footer и blobdb в режиме прямого ввода-вывода.
  • При запуске базы данных с большим количеством sst файлов большое количество времени ЦП тратится на получение логического размера блока sst файлов, что замедляет прогресс запуска. Эта неэффективность была оптимизирована внутренним кешем для логических размеров блоков.

Новые возможности

  • Базовая поддержка временной метки пользователя в итераторе. Поддерживаются операции Seek, SeekToFirst, Next и границы нижней/верхней. Обратная итерация не поддерживается. Объединение также не рассматривается.
  • Когда возникает ошибка блочной блокировки, если блокировка удерживается текущим процессом, в сообщении об ошибке возвращается время получения и ID потока.
  • Добавлен новый параметр best_efforts_recovery (по умолчанию: false), чтобы позволить базе данных открываться в директории с отсутствующими таблицами. Во время попытки восстановления усилиями все отсутствующие таблицы игнорируются, и база данных восстанавливается до самой свежей точки без отсутствующих таблиц. Сохранение целостности между столбцами даже при активации журнала событий не гарантируется.
  • Параметры options.bottommost_compression, options.compression_opts и options.bottommost_compression_opts теперь динамически изменяемы.

Версия 6.8.0 (2020-02-24)

Изменения Java API

  • Основные изменения в Java компараторах, направленные на стандартизацию на ByteBuffer для быстрого и независимого от локали выполнения операций над ключами (#6252).
  • Добавлены перегрузки обычных методов API, использующие прямые ByteBuffers для ключей и значений (#2283).### Исправленные ошибки
  • Исправлены неверные результаты при использовании блочной таблицы с kHashSearch, вместе с Prev() и SeekForPrev().
  • Исправлена ошибка, препятствующая открытию базы данных после двух последовательных аварийных ситуаций с TransactionDB, где первая авария восстанавливается из поврежденного журнала событий с kPointInTimeRecovery, но вторая не может.
  • Исправлено Issue #6316, которое может привести к повреждению файла MANIFEST в середине при невозможности записи из-за недостатка места на диске.
  • Добавлен параметр DBOptions::skip_checking_sst_file_sizes_on_db_open, который отключает потенциально дорогостоящую проверку всех размеров sst файлов при открытии базы данных.
  • BlobDB теперь игнорирует тривиально перемещаемые файлы при обновлении отображения между blob файлами и SST. Это должно устранять Issue #6338, где неупорядоченные уведомления о сбросе/компакции могут спровоцировать утверждение с ранним кодом.
  • Batched MultiGet() игнорирует ошибки ввода-вывода при чтении данных блоков, что может привести к продолжительному поиску ключа и возврату устаревших результатов.
  • WriteBatchWithIndex::DeleteRange возвращает Status::NotSupported. Ранее он возвращал успех, хотя чтения из партии не учитывали диапазон tombstones. Соответствующие языковые привязки больше не могут быть использованы. В C это включает rocksdb_writebatch_wi_delete_range, rocksdb_writebatch_wi_delete_range_cf, rocksdb_writebatch_wi_delete_rangev, и rocksdb_writebatch_wi_delete_rangev_cf. В Java это включает WriteBatchWithIndex::deleteRange.
  • Присваивание нового номера файла MANIFEST, когда вызывается LogAndApply(..., new_descriptor_log=true). Эта ошибка может привести к перезаписи MANIFEST во время восстановления, если options.write_dbid_to_manifest = true и есть файлы журнала событий.

Улучшения производительности

  • Чтение вперед при чтении из файлов параметров. Внутри DB, параметр options.log_readahead_size используется как размер чтения вперед. В других случаях используется значение по умолчанию 512 КБ.

Изменения публичного API

  • GarbageCollector BlobDB теперь выводит статистику BLOB_DB_GC_NUM_FILES (количество blob файлов, сделанных устаревшими во время GC), BLOB_DB_GC_NUM_NEW_FILES (количество новых blob файлов создано во время GC), BLOB_DB_GC_FAILURES (количество неудачных проходов GC), BLOB_DB_GC_NUM_KEYS_RELOCATED (количество blob, перемещенных во время GC), и BLOB_DB_GC_BYTES_RELOCATED (общий размер blob, перемещенных во время GC). С другой стороны, следующие статистики, которые не относятся к новой реализации GC, теперь устарели: BLOB_DB_GC_NUM_KEYS_OVERWRITTEN, BLOB_DB_GC_NUM_KEYS_EXPIRED, BLOB_DB_GC_BYTES_OVERWRITTEN, BLOB_DB_GC_BYTES_EXPIRED, и BLOB_DB_GC_MICROS.
  • Отключение повторного использования номера файла журнала при запросе несовпадающих режимов восстановления: kPointInTimeRecovery и kAbsoluteConsistency.

Новые возможности

  • Добавлена контрольная сумма для каждого SST файла, созданного Flush или Compaction. Добавлен параметр sst_file_checksum_func в Options, чтобы пользователи могли использовать свою собственную функцию контрольной суммы SST файла через переопределение класса FileChecksumFunc. Если пользователь не установил sst_file_checksum_func, расчет контрольной суммы SST файла не будет активирован. Информация о контрольной сумме включает uint32_t значение контрольной суммы и название функции контрольной суммы (string). Информация о контрольной сумме хранится в FileMetadata в хранилище версий и также регистрируется в MANIFEST. Добавлен новый инструмент в LDB, чтобы пользователи могли выгрузить список информации о контрольных суммах файлов из MANIFEST (хранящихся в unordered_map).
  • db_bench теперь поддерживает параметры value_size_distribution_type, value_size_min, value_size_max для генерации случайных значений переменного размера. Добавлен параметр blob_db_compression_type для BlobDB для включения сжатия blob.
  • Замена пространства имен RocksDB "rocksdb" на флаг "ROCKSDB_NAMESPACE", который, если не определен, определяется как "rocksdb" в заголовочном файле rocksdb_namespace.h.## Версия 6.7.0 (2020-01-21)

Изменения публичного API

  • Добавлен класс rocksdb::FileSystem в include/rocksdb/file_system.h для упаковки операций создания, чтения и записи файлов, и параметр DBOptions::file_system для передачи экземпляра rocksdb::FileSystem пользователем. Если значение не null, это будет иметь приоритет над DBOptions::env для операций с файлами. Новый API rocksdb::FileSystem::Default() возвращает платформенный объект по умолчанию. Параметр DBOptions::env и API Env::Default() будут продолжать использоваться для многопоточности и других системных функций, и где DBOptions::file_system не указан, для операций с файлами. Для разработчиков хранения, привыкших к rocksdb::Env, интерфейс в rocksdb::FileSystem является новым и, возможно, претерпит некоторые изменения, поскольку больше систем хранения портятся к нему от rocksdb::Env. На данный момент, кроме POSIX, ни одна другая система не была портирована на новый интерфейс.
  • Новый API rocksdb::NewSstFileManager(), который позволяет вызывающему передать отдельные объекты Env и FileSystem.
  • Изменены Java API для функций RocksDB.keyMayExist на использование Holder<byte[]> вместо StringBuilder, чтобы извлеченные значения не требовались декодировать в строки.
  • Новый параметр OptimisticTransactionDBOptions, который позволяет пользователям настроить политику проверки OCC. По умолчанию политика изменена с kValidateSerial на kValidateParallel для снижения конкуренции мьютексов.

Исправленные ошибки

  • Устранена ошибка, которая может привести к планированию ненужной фоновой потока выполнения (#6104).
  • Устранена ошибка, вызванная конкурентным выполнением циклов CF и отменой (#6147).
  • Устранено состояние гонки между cfd->log_number_ при смене манифеста и переключении памятной таблицы (PR 6249), когда количество семейств колонок больше одного.
  • Устранена ошибка в индексе дробного каскадирования, когда несколько файлов на одном уровне содержат одинаковый самый маленький ключ пользователя, и эти ключи являются операндами слияния. В этом случае метод Get() точно совпадающего ключа может пропустить некоторые операнды слияния.
  • Объявлено, что тип индекса kHashSearch несовместим с значением index_block_restart_interval большим одного.
  • Устранена проблема, при которой пулы потоков не пересоздаются при установке max_background_jobs динамически через интерфейс SetDBOptions.
  • Устранена ошибка, которая может привести к зависанию потоков записи при замедлении/остановке и наличии смешанного набора записей с установленным/unset WriteOptions::no_slowdown.
  • Устранена проблема, при которой неверное значение «количества входных записей» использовалось для вычисления статистики «записей удалённых» для компактаций.
  • Устранена регрессия, которая приводит к аварийному завершению работы при использовании хэша, max_open_files != -1 и полного порядка поиска, а также при переключении обратно.

Новые возможности

  • Теперь можно включить периодическую компактацию базового DB при использовании BlobDB.
  • BlobDB теперь выполняет сборку мусора для ненулевых сроков жизни блоебов при установке enable_garbage_collection в true в BlobDBOptions. Сборка мусора происходит во время компактации: любые действительные блоебы, расположенные в старейших N файлах (где N — это число файлов с ненулевой срокой жизни, умноженное на значение BlobDBOptions::garbage_collection_cutoff), перемещаются в новые файлы блоебов, а старые файлы блоебов удаляются, если они больше не нужны. Примечание: рекомендуется включить периодическую компактацию для базового DB при использовании этой функции для решения проблемы, когда некоторые старые файлы блоебов остаются активными благодаря SST, которые иначе не выбираются для компактации.
  • db_bench теперь поддерживает опцию garbage_collection_cutoff для BlobDB.
  • Введен параметр ReadOptions.auto_prefix_mode. При установке его в true, итератор вернет тот же результат, как полный порядковый поиск, но может выбрать использовать префиксный поиск внутренне на основе ключа поиска и верхней границы итератора.
  • MultiGet() может использовать IO Uring для параллелизации чтения из одного и того же SST файла. Эта функциональность по умолчанию отключена. Она может быть включена с помощью переменной окружения ROCKSDB_USE_IO_URING.

Версия 6.6.2 (2020-01-13)

Исправленные ошибки

  • Устранена ошибка, при которой входные файлы для не-L0 компактации не учитывались при вычислении времени создания новых выходных файлов компактации.

Версия 6.6.1 (2020-01-02)

Исправленные ошибки

  • Устранена ошибка в WriteBatchWithIndex::MultiGetFromBatchAndDB, вызываемая Transaction::MultiGet, которая приводит к доступу к устаревшим указателям при количестве ключей > 32.
  • Устранены две проблемы производительности, связанные с обрезкой истории памятных таблиц. Во-первых, новый SuperVersion создается только тогда, когда какие-то памятные таблицы действительно были обрезаны. Во-вторых, обрезка запланирована только при наличии хотя бы одной закаченной памятной таблицы, которая остается в памяти для целей проверки конфликтов транзакций.
  • BlobDB больше не обновляет карту SST к файлам блоебов после неудачной компактации.
  • Устранена ошибка, при которой чтение через итератор снимка могло быть затронуто удалением диапазона после снимка (#6062).
  • Устранена ошибка, при которой BlobDB сравнивал указатели ColumnFamilyHandle вместо ID семейств колонок при проверке использования дефолтного семейства колонок.
  • Удаление superversion в BackgroundCallPurge.
  • Устранены ошибки использования после освобождения и двойного удаления файлов в BackgroundCallPurge().## 6.6.0 (2019-11-25)

Исправленные ошибки

  • Устранена ошибка корruptions данных, вызванная внутренней компактацией уровня L0 на заингестированных файлах, которые не были помещены в правильном порядке в L0.
  • Устранена ошибка состояния гонки между Version::GetColumnFamilyMetaData() и Compaction::MarkFilesBeingCompacted() для доступа к being_compacted (#6056). Текущее исправление получает db mutex во время Version::GetColumnFamilyMetaData(), что может вызвать регрессию.
  • Устранена ошибка в DBIter, где состояние is_blob_ не обновляется при обратном прохождении с помощью seek.
  • Устранена ошибка при использовании format_version=3, разделённых фильтров и префиксного поиска вместе. Ошибка могла привести к тому, что Seek::(prefix) вернула NotFound для существующего префикса.
  • Отменено исправление "Объединённый итератор для избежания ребусировки потомков для некоторых случаев (#5286)", так как оно могло вызывать сильные результаты при реусерске с другим верхним пределом итератора.
  • Устранена ошибка, приводящая к аварийному завершению работы при импорте внешнего файла, когда фоновая компактация вызывает серьёзную ошибку (файл не найден).
  • Устранена ошибка при использовании разделённых фильтров и префиксного поиска вместе, ::SeekForPrev могла вернуть недействительное для существующего префикса. ::SeekForPrev могла быть вызвана пользователем, или внутренне на ::Prev, или внутри ::Seek, если возвращаемое значение включает Delete или операнд Merge.
  • Устранена ошибка, при которой OnFlushCompleted был вызван до сохранения результата флеша в MANIFEST при наличии конкурентной задачи флеша. Ошибка существует с момента введения OnFlushCompleted в rocksdb 3.8.
  • Устранена ошибка аварийного завершения работы при декодировании некоторых plain table SST файлов.
  • Устранена утечка памяти при некоторых ошибках открытия plain table SST файлов.
  • Устранена ошибка, при которой аварийное завершение работы происходило при вызове WriteLevel0TableForRecovery для нескольких семейств колонок, что привело к большему номеру лога семейства колонок, чем первый повреждённый лог при открытии DB в режиме восстановления точки во времени (#5856).### Новые возможности
  • Поддержка универсальной компактации для опции options.periodic_compaction_seconds. Полная компактация будет запущена, если любой файл превышает порог.
  • GetLiveFilesMetaData и GetColumnFamilyMetaData теперь предоставляют номер файла SST файлов, а также самый старый файл блоебов, которому ссылается каждый SST.
  • Батчевый API MultiGet (DB::MultiGet()), который поддерживает получение ключей из нескольких семейств колонок.
  • Полные и разделённые фильтры в блочном таблице используют улучшенную реализацию Bloom фильтра, включённую с format_version 5 (или выше), потому что предыдущие выпуски не могут прочитать этот фильтр. Это замена быстрее и более точна, особенно для высоких битов на ключ или миллионов ключей в одном (полном) фильтре. Например, новый Bloom фильтр имеет ту же скорость ложноположительных ответов при 9.55 битах на ключ, как старый при 10 битах на ключ, и меньшую скорость ложноположительных ответов при 16 битах на ключ, чем старый при 100 битах на ключ.
  • Добавлены инструкции AVX2 к BUILD_WITH_SSE для ускорения нового Bloom фильтра и XXH3-основанной функции хеширования на совместимых платформах x86_64 (Haswell и выше, ~2014).
  • Поддержка опций ttl или options.periodic_compaction_seconds с options.max_open_files = -1. Самый старый предок файла и время создания будут записаны в манифест. Если информация доступна, она будет использоваться вместо времени создания и времени создания файла в свойствах таблицы.
  • Установка опции ttl для универсальной компактации теперь имеет то же значение, что и установка periodic_compaction_seconds.
  • Информация о создании файла и самом старом предке файла также возвращается.
  • Команда командной строки sst_dump recompress теперь показывает, сколько блоков было сжато и сколько нет, в частности, сколько не было сжато из-за несоответствия соотношения сжатия (пороговое значение 12.5% для GoodCompressionRatio), как видно в счетчике статистики number.block.not_compressed начиная с версии 6.0.0.
  • Использование блочной кэширования теперь учитывает перенос метаданных каждого элемента. Это приводит к более точному управлению памятью. Одним из побочных эффектов этой функции является то, что меньше элементов помещается в блочный кэш одного размера, что приводит к увеличенным темпам пропуска кэша. Этот эффект можно устранить путём увеличения размера блочного кэша или передачи kDontChargeCacheMetadata в конструктор для восстановления старого поведения.
  • При использовании BlobDB поддерживается картирование и сохранение в MANIFEST между каждым SST файлом и самым старым файлом блоебов, которому он ссылается.
  • db_bench теперь поддерживает и по умолчанию использует ненулевые TTL Puts для BlobDB. TTL Puts могут быть включены явно, указав ненулевое значение для параметра командной строки blob_db_max_ttl_range.
  • sst_dump теперь поддерживает печать индексов блоебов в читаемом человеком формате. Это можно включить, указав флаг decode_blob_index в командной строке.
  • Клиентская сторона теперь получает ряд новых информационных элементов через интерфейс EventListener. Для флешей, номера файлов нового SST файла и самого старого файла блоебов, которому он ссылается, передаются клиенту. Для компактаций, уровень, номер файла и самый старый файл блоебов передаются клиенту для каждого входного и выходного файла компактации.

Изменения в публичном API

  • Выпуск RocksDB версии 4.1 или старше не сможет открыть базу данных, созданную новой версией. Версия 4.2 была выпущена 23 февраля 2016 года.
  • TTL компактация теперь запускает последовательные цепочки компактаций по диапазону ключей так, чтобы они быстро достигали нижнего уровня при истечении срока годности. Таблица свойства creation_time для выходных файлов компактации теперь устанавливается как минимальное значение времени создания всех входных файлов компактации.
  • При использовании FIFO стиля компактации, опция options.periodic_compaction_seconds будет иметь то же значение, что и options.ttl. Будет выбрано более строгое значение. По умолчанию, если значение options.periodic_compaction_seconds равно значению по умолчанию, а значение options.ttl равно нулю, RocksDB установит значение по умолчанию равным 30 дням.
  • Добавлен метод API GetCreationTimeOfOldestFile(uint64_t* creation_time) для получения времени создания самого старого файла SST в базе данных.
  • Политика фильтрации FilterPolicy теперь предоставляет дополнительные методы API для выбора конфигураций фильтров на основе контекста, такого как уровень таблицы и стиль компактации. См. LevelAndStyleCustomFilterPolicy в файле db_bloom_filter_test.cc. Большинство существующих пользовательских реализаций FilterPolicy продолжат работать так же, как раньше, за исключением тех, которые оборачивают возврат NewBloomFilterPolicy, которым потребуется переопределение нового метода GetBuilderWithContext().
  • Недопустимое использование политики фильтрации больше не поддерживается. Вызов метода GetFilterBitsBuilder() на политике фильтрации, возвращаемой методом NewBloomFilterPolicy, вызовет нарушение утверждения в режиме отладки, поскольку RocksDB внутренне перешёл на более сложный интерфейс, который ожидается дальнейшего развития. Пользовательские реализации FilterPolicy должны продолжать работать так же, кроме тех, которые оборачивают возврат NewBloomFilterPolicy, которым потребуется новый перехват защищённого метода в FilterPolicy.
  • Метод NewBloomFilterPolicy теперь принимает bits_per_key как число с плавающей точкой вместо целого числа. Это позволяет более тонкое управление соотношением памяти и точности в новой реализации фильтра Блума и не должно менять совместимость исходного кода.
  • Опция BackupableDBOptions::max_valid_backups_to_open теперь используется только при открытии BackupEngineReadOnly. При открытии читающего/записывающего BackupEngine любое другое значение, кроме значения по умолчанию, выводит предупреждение и рассматривается как значение по умолчанию. Эта изменение гарантирует правильный учёт удаления резервных копий, чтобы гарантировать их удаление, когда они больше не используются.
  • Устарела опция snap_refresh_nanos.
  • Добавлены методы DisableManualCompaction и EnableManualCompaction для остановки и возобновления ручной компактации.
  • Добавлен метод TryCatchUpWithPrimary() для StackableDB в режиме, отличном от ЛИТЕ.
  • Добавлен перегруженный метод Env::LoadEnv() для возврата указателя shared_ptr на объект Env.### Изменения по умолчанию
  • Изменено значение по умолчанию для periodic_compaction_seconds на UINT64_MAX - 1, что позволяет RocksDB автоматически настраивать расписание периодической компактации. При использовании значения по умолчанию, периодическая компактация теперь автоматически активируется, если используется фильтр компактации. Значение 0 полностью отключает эту функцию.
  • Изменено значение по умолчанию для ttl на UINT64_MAX - 1, что позволяет RocksDB автоматически настраивать значение TTL. При использовании значения по умолчанию, TTL автоматически активируется до 30 дней, если эта функция поддерживается. Чтобы восстановить старое поведение, можно явно установить это значение равным нулю.

Улучшение производительности

  • Для 64-битного хэширования RocksDB стандартизирует на немного модифицированной версии XXH3. Этот метод теперь используется для многих временных хэшей, а также используется fastrange64() вместо оператора остатка, и некоторые тесты показывают небольшое улучшение производительности.
  • Уровневый итератор теперь чаще приводит к невалидации итератора при префиксном поиске и уровне, отфильтрованном префиксным блоум-фильтром.

6.5.2 (2019-11-15)

Исправления ошибок

  • Исправлено нарушение утверждения в методе MultiGet() при условии, что BlockBasedTableOptions::no_block_cache установлено в true и нет сжатого кэша блока.
  • Исправлено нарушение границ массива в методе BlockBasedTable::MultiGet() при включенном сжатии и отсутствии сжатого кэша блока.
  • Если вызов BackupEngine::PurgeOldBackups или BackupEngine::DeleteBackup завершился аварийным завершением программы, отказом питания или ошибкой ввода-вывода, файлы могли остаться от старых резервных копий, которые можно было бы очистить только с помощью вызова GarbageCollect. Теперь любой вызов PurgeOldBackups, DeleteBackup или GarbageCollect достаточно для очистки таких файлов.

6.5.1 (2019-10-16)

Исправления ошибок

  • Откат функциональности "слияние итератора для избежания повторного поиска дочерних итераторов в некоторых случаях (#5286)", так как она может привести к странным результатам при повторном поиске с другим верхним пределом итератора.
  • Исправлено ошибочное поведение в методе BlockBasedTableIterator при повторном поиске с другим верхним пределом итератора.
  • Исправлено ошибочное поведение при использовании разделённых фильтров и префиксного поиска вместе, где ::SeekForPrev мог вернуть недействительное значение для существующего префикса. Метод ::SeekForPrev может быть вызван пользователем, либо внутри ::Prev, либо внутри ::Seek, если возвращаемое значение включает операцию Delete или Merge.

6.5.0 (2019-09-13)

Исправления ошибок

  • Исправлено несколько проблем с конкурентным доступом в BlobDB.
  • Исправлено ошибочное поведение при использовании функции обновления снимков компактации, которая не отключалась, как заявлено, при установке snap_refresh_nanos в ноль.
  • Исправлено поведение поиска фильтра Блума через многократный запрос (MultiGet) при условии, что BlockBasedTableOptions::whole_key_filtering установлено в false, путём проверки того, что ключ находится в домене префиксного экстрактора и извлечение префикса перед поиском.
  • Исправлено ошибочное поведение при загрузке файлов, вызванное некорректным выделением номеров файлов при количестве семей столбцов, участвующих в загрузке, превышающем два.

Новые возможности

  • Введена опция DBOptions::max_write_batch_group_size_bytes для настройки максимального ограничения на количество байтов, записываемых в одиночную группу записей WAL или мемтабл. Она применяется, если размер записи лидера больше одной восьмой этого лимита.
  • Введены опции VerifyChecksum() для инициирования предварительного чтения. Разрешено передавать опции ReadOptions для изменения размера предварительного чтения. Для проверки контрольных сумм перед внешней загрузкой SST-файла добавлена опция IngestExternalFileOptions.verify_checksums_readahead_size для настройки предварительного чтения.
  • При использовании опции options.force_consistency_check в RocksDB теперь сообщение об ошибке отправляется обратно пользователю, а процесс не прекращается.
  • Добавлена опция memtable_insert_hint_per_batch в WriteOptions. Если она установлена в true, каждый WriteBatch будет поддерживать свои собственные подсказки вставки для каждого мемтабл в параллельной записи. Подробнее см. файл include/rocksdb/options.h.

Изменения в публичном API

  • Добавлена опция max_write_buffer_size_to_maintain для лучшего управления использованием памяти неизменяемыми мемтаблами.
  • Добавлен легковесный метод API GetCurrentWalFile() для получения имени и размера последнего действующего файла WAL. Предназначен для использования в качестве помощника для инструментов резервного копирования и восстановления в большем экосистеме, такой как MySQL с движком MyRocks.
  • Когда включен фильтр Блума для мемтабл, он всегда использует локальность кэша. Опция Options::bloom_locality теперь влияет только на формат SST PlainTable.

Улучшение производительности

  • Улучшена скорость работы фильтра Блума для мемтабл, снижая затраты на запись при его включении на треть до половины, с аналогичным улучшением производительности чтения.

6.4.0 (2019-07-30)

Изменения по умолчанию

  • Опция LRUCacheOptions.high_pri_pool_ratio теперь установлена по умолчанию в 0.5 (ранее 0.0), что означает, что средняя вставка теперь включена по умолчанию. То же изменение сделано для значения по умолчанию аргумента high_pri_pool_ratio в методе NewLRUCache(). Когда кэш блока не создаётся явно, маленький кэш блока, созданный BlockBasedTable, всё ещё имеет эту опцию равной 0.0.
  • Изменено значение по умолчанию для BlockBasedTableOptions.cache_index_and_filter_blocks_with_high_priority с false на true.### Изменения в публичном API
  • Фильтры и блоки словарей сжатия теперь обрабатываются аналогично блокам данных относительно кэша блока: вместо хранения объектов в кэше, кэшируются только сами блоки. Кроме того, блоки фильтров и словарей сжатия (а также части фильтров) больше не выгоняются из кэша при закрытии таблицы.
  • Из-за вышеупомянутой рефакторизации, статистика эвристики выгрузки блоков кэша для фильтров и словарей сжатия временно повреждена. Мы планируем её восстановить в следующей фазе.
  • Семантика типовых блоков типа блока в контексте производительности теперь соответствует общему block_read_count.
  • Ошибки, связанные с получением словарей сжатия, теперь распространяются пользователю.
  • Добавлен новый параметр stats_history в db_bench, который выводит полную историю статистики.
  • Перегружены методы GetAllKeyVersions() для поддержки нестандартной семьи столбцов.
  • Добавлены новые методы API ExportColumnFamily() и CreateColumnFamilyWithImport() для поддержки экспорта и импорта семейств столбцов. https://github.com/facebook/rocksdb/issues/3469
  • Иногда ldb использует строковый объединитель слияния, если слиятельный оператор не указан. Это позволяет пользователям печатать ключи из базы данных с оператором слияния.
  • Заменён старый регистратор Registra на ObjectRegistry для создания пользовательских объектов из строки, также добавлен метод LoadEnv() для Env.
  • Добавлен перегруженный метод GetApproximateSizes, который получает объект SizeApproximationOptions и возвращает статус. Старые перегруженные методы перенаправляют вызовы к этому новому методу и больше не генерируют утверждения, если флаги include_flags не содержат ни одного из INCLUDE_MEMTABLES или INCLUDE_FILES. Рекомендовано использовать только этот новый метод, так как он безопаснее по типам и возвращает значимый статус при ошибках.
  • Метод LDBCommandRunner::RunCommand() теперь возвращает код состояния как целое число, вместо вызова exit() с этим кодом.

Новые возможности

  • Добавлен аргумент --secondary_path в ldb для открытия базы данных как вторичной экземпляры. Это позволит сохранить оригинальную базу данных нетронутой.
  • Блоки словарей сжатия теперь предварительно загружаются и закрепляются в кэше (в зависимости от настроек пользователя) так же, как и блоки индексов и фильтров.
  • Добавлена опция DBOptions::log_readahead_size, которая указывает количество байтов для предварительной загрузки при чтении журнала. Это полезно для удалённо расположенного журнала, поскольку может снизить число обращений. Если значение равно 0 (по умолчанию), то предварительная загрузка отключается.
  • В SizeApproximationOptions добавлена новая опция для использования с DB::GetApproximateSizes. При аппроксимации общего размера файлов, используемых для хранения диапазона ключей, допускается аппроксимация с погрешностью до total_files_size * files_size_error_margin. Это позволяет использовать некоторые упрощения при аппроксимации размеров файлов, что приводит к лучшей производительности, гарантируя при этом, что погрешность будет находиться в разумных пределах.
  • Поддерживается загрузка пользовательских объектов в юнит-тестах. В затронутых юнит-тестах RocksDB создаёт пользовательские объекты Env на основе переменной окружения TEST_ENV_URI. Пользователи должны убедиться, что типы пользовательских объектов правильно зарегистрированы. Например, статическая библиотека должна предоставлять функцию RegisterCustomObjects. Связывая юнит-тестовый исполняемый файл со статической библиотекой, можно выполнить эту функцию.

Улучшения производительности

  • Уменьшение сравнения ключей итератора для проверки верхнего/нижнего предела.
  • Улучшение производительности row_cache: чтения с более новыми снимками, чем данные в файле SST, используют одинаковый ключ кэша, за исключением некоторых случаев транзакций.
  • Блоки словарей сжатия больше не копируются в новый объект при получении.

Исправление ошибок

  • Исправлено, чтобы файлы, введенные в систему, и директории были fsync'нуты.
  • Возвращено состояние TryAgain вместо Corruption, если новый конец невидим для TransactionLogIterator.
  • Исправлен регресс, когда опция fill_cache влияет на блоки индексов.
  • Исправлено проблему, когда использование cache_index_and_filter_blocks == false также влияло на разделы разделённых индексов/фильтров.

6.3.2 (2019-08-15)

Изменение публичного API

  • Семантика считаемого количества блоков типа в контексте производительности теперь совпадает с семантикой общего block_read_count.

Исправление ошибок

  • Исправлен регресс, когда опция fill_cache влияет на блоки индексов.
  • Исправлено проблему, когда использование cache_index_and_filter_blocks == false также влияло на разделы разделённых индексов.

6.3.1 (2019-07-24)

Исправление ошибок

  • Исправлен автоматический процесс роллинга, введенный в 6.3.0, который вызывает segmentation fault при неудачном создании файла журнала.## 6.3.0 (2019-06-18)

Изменение публичного API

  • Теперь DB::Close() возвращает ошибку Aborted(), если есть нераскрытые снимки. Пользователи могут повторить попытку после освобождения всех снимков.
  • Блоки индексов теперь обрабатываются аналогично блокам данных относительно кэша блоков: вместо хранения объектов в кэше, кэшируются сами блоки. Кроме того, блоки индексов больше не выгоняются из кэша при закрытии таблицы, могут использовать сжатый кэш блоков (если он существует) и могут использоваться несколькими читателями таблиц.
  • Разделы разделённых индексов больше не влияют на статистики увеличения чтения.
  • По причине вышеупомянутой рефакторизации, статистика выгнанных блоков кэша индексов временно повреждена. Мы планируем восстановить её в следующих этапах.
  • Опция options.keep_log_file_num строго применяется всегда. Имена всех файлов журнала отслеживаются, что может потребовать значительное количество памяти, если options.keep_log_file_num большое и либо options.max_log_file_size, либо options.log_file_time_to_roll установлены.
  • Добавлена начальная поддержка операций Get/Put с временными метками пользователей. Пользователи могут указывать метки времени через ReadOptions и WriteOptions при вызовах DB::Get и DB::Put.
  • Доступ к разделу разделённого фильтра или индекса через закреплённое ссылочное представление больше не считается попаданием в кэш.
  • Добавлены C-биндинги для вторичного экземпляра, то есть DBImplSecondary.
  • Ограниченное удаление WAL активируется только если DBOptions::wal_dir не установлено, явно установлено на db_name переданное в DB::Open и DBOptions::db_paths пустое, или такое же, как db_paths[0].path.

Новые возможности

  • Добавлена опция snap_refresh_nanos (по умолчанию равна 0) для периодического обновления списка снимков в задачах компактирования. Установите её в 0, чтобы отключить функцию.
  • Добавлена опция unordered_write, которая обменивает гарантии снимков на большую пропускную способность записи. При использовании с WRITE_PREPARED транзакциями с two_write_queues=true она предлагает большую пропускную способность без компромиссов по гарантиям.
  • Разрешено DBImplSecondary удалять мемтаблицы с устаревшими данными после воспроизведения MANIFEST и WAL.
  • Добавлена опция failed_move_fall_back_to_copy (по умолчанию равна true) для внешней инъекции SST. Когда move_files равна true и жёсткая ссылка не удается, инъекция переходит к копированию, если failed_move_fall_back_to_copy равна true. В противном случае, инъекция сообщает об ошибке.
  • Добавлен командный запрос list_file_range_deletes в ldb, который выводит табулы в файлах SST.

Улучшения производительности

  • Уменьшение двоичного поиска при переброске итератора в тот же блок данных.
  • DBIter::Next() может пропустить проверку ключа пользователя, если последний номер последовательности равен 0.
  • Объединение итератора для избежания переброски дочерних итераторов в некоторых случаях.
  • Записывающий логгер будет выполнять флеш после завершения всего сообщения, а не его части.
  • Уменьшение задержки многократного получения данных путём параллельного чтения блоков данных с диска.

Общие улучшения

  • Добавлен новый статусный код kColumnFamilyDropped для отличия между удалением столбца семьи и процессом закрытия базы данных.
  • Улучшение валидации ColumnFamilyOptions при создании нового столбца семьи.

Исправление ошибок

  • Исправлено воспроизведение WAL вторичного экземпляра путём пропуска записей с меньшим номером последовательности, чем текущий последний номер последовательности.
  • Исправлено логическое условие слияния при флюссировании/компонировании, которое позволяло Put'ам, покрытым диапазонами табул, снова появляться. Примечание: Put'ам могут существовать даже если пользователь только вызывал Merge() из-за внутренней конвертации во время компонирования на нижнем уровне.
  • Исправлено/улучшено раннее назначение последовательностей в мемтаблицах и воспроизведение WAL, чтобы записи WAL нераскрытых столбцов семей не пропускались после воспроизведения MANIFEST и увеличения последовательности базы данных из-за другого раскрытого/скомпонированного столбца семьи.
  • Исправлено проблему, вызванное тем, что вторичный экземпляр не пропускал начало нового MANIFEST.
  • При открытии базы данных удалены файлы-мусор WAL, оставленные в wal_dir.## 6.2.0 (2019-04-30)

Новые возможности

  • Добавлена опция strict_bytes_per_sync, которая заставляет поток записи файлов блокироваться, а не превышать ограничение на количество байтов, ожидающих записи, указанное в bytes_per_sync или wal_bytes_per_sync.
  • Улучшение производительности диапазонного сканирования путём отказа от проверки верхнего предела для каждого ключа в BlockBasedTableIterator.
  • Введено периодическое компонирование для уровня стилевой компоновки. Файлы периодически компонируются и помещаются в тот же уровень.
  • Индекс блочной таблицы теперь содержит точный самый высокий ключ в файле, а не верхнюю границу. Это может улучшить производительность Get() и Seek() итератора в некоторых ситуациях, особенно когда используется прямое чтение и отключен кэш блоков. Вводится настройка BlockBasedTableOptions::index_shortening для контроля этого поведения. Установите её в kShortenSeparatorsAndSuccessor, чтобы получить старое поведение.
  • При чтении из файла опций/строки/карты, пользовательские окружения могут заполняться согласно регистрированному объекту.
  • Улучшение производительности диапазонного сканирования при использовании явного пользовательского предварительного чтения путём отказа от создания новых читателей таблиц для каждого итератора.
  • Добавлен тип индекса BlockBasedTableOptions::IndexType::kBinarySearchWithFirstKey. Он значительно снижает увеличение чтения в некоторых установках, особенно для Seek() итератора. Эта опция ещё не полностью реализована: ошибки ввода-вывода не обрабатываются правильно.

Изменение публичного API

  • Изменение поведения OptimizeForPointLookup(): переход от хэш-индекса блочной таблицы к фильтрации мемтаблицы по всему ключу.
  • Изменение поведения OptimizeForSmallDb(): использование 16МБ кэша блоков, помещение блоков индекса и фильтров в него и учет размера мемтаблицы к нему. DBOptions.OptimizeForSmallDb() и ColumnFamilyOptions.OptimizeForSmallDb() начинают принимать опциональный объект кэша.
  • Добавлена опция BottommostLevelCompaction::kForceOptimized для предотвращения двойного компонирования недавно компонированных файлов в компонировании нижнего уровня ручного компонирования. Примечание: эта опция может препятствовать ручному компонированию для производства одного файла в нижнем уровне.

Исправление ошибок

  • Адаптация размера фиктивного элемента WriteBufferManager к кэшу блоков с 1МБ до 256КБ.
  • Исправлено конкурентное состояние между WritePrepared::Get и ::Put с дубликатными ключами.
  • Исправлено аварийное завершение работы при включенной префиксной сетке мемтаблицы и чтении/записи ключа вне области префикса.
  • Закрытие файла WAL перед удалением другим потоком.
  • Исправлено утверждение IsFlushPending() == true, вызванное одним фоновым потоком, выпускающим db_mutex в ~ColumnFamilyData и другим потоком очищающим флаг flush_requested_.

6.1.1 (2019-04-09)

Новые возможности

  • При чтении из файла опций/строки/карты, пользовательские компараторы и/или объединители могут заполняться согласно регистрированному объекту.

Изменение публичного API

Исправление ошибок

  • Исправлено проблему в двухэтапном коммитировании, где последовательность подготовки транзакции, флюссировки мемтаблицы и аварийного завершения могла привести к потере подготовленной транзакции.
  • Исправлено проблему в окружении шифрования, которое могло привести к чтению за пределами границ файла зашифрованных файлов.

6.1.0 (2019-03-27)

Новые возможности

  • Введено два новых уровня статистики, kExceptHistogramOrTimers и kExceptTimers.
  • Добавлена возможность выборки блоков данных для оценки сжатия и отчета статистики пользователю.
  • Добавлена поддержка фильтрации трассировки.
  • Добавлена опция DBOptions.avoid_unnecessary_blocking_io. Если true, мы избегаем удаления файлов при уничтожении ColumnFamilyHandle и Iterator. Вместо этого запланирована работа для удаления файлов в фоновом режиме.

Изменение публичного API

  • Удалена встроенная библиотека fbson.
  • Переменная statistics.stats_level_ стала атомарной. Рекомендовано использовать методы statistics.set_stats_level() и statistics.get_stats_level() для доступа к ней.
  • Введен новый подкод ошибки IOError — PathNotFound, который указывает на попытку открытия несуществующего файла или директории для чтения.
  • Добавлена начальная поддержка нескольких экземпляров баз данных, использующих одно и то же хранилище в режиме однопользовательской записи и многопользовательского чтения.
  • Удалены некоторые строки "using std::xxx" из публичных заголовочных файлов.

Исправление ошибок

  • Исправлено отсутствие макроса JEMALLOC_CXX_THROW в старых версиях Jemalloc, что вызывало сбои сборки на некоторых платформах.
  • Исправлено отсутствие возможности открытия файла SstFileReader, заинжестированного с параметром write_global_seqno=true.## Версия 6.0.0 (2019-02-19)

Новые возможности

  • Включено создание контрольных точек для только для чтения баз данных (DBImplReadOnly).
  • База данных игнорирует удаленные семейства колонок при выполнении атомарного сброса.
  • RocksDB может предварительно открыть некоторые файлы даже если options.max_open_files != -1. Это может привести к более длительной инициализации базы данных.
  • Для пользователей сжатия словарями с использованием ZSTD v0.7.0+ теперь используется один и тот же распознанный словарь для каждого блока данных SST-файла для более быстрого сжатия.
  • Для всех пользователей сжатия словарями, установивших cache_index_and_filter_blocks == true, данные словаря используются для декомпрессии и хранятся в блочном кэше для лучшего управления памятью. Для пользователей ZSTD v1.1.4+ компилируемых с -DZSTD_STATIC_LINKING_ONLY, это также включает распознанный словарь, который увеличивает скорость декомпрессии.
  • Добавлена возможность проверки контрольных сумм блоков для внешних SST-файлов перед заинжестированием.
  • Введена история статистики, которая периодически сохраняет снимки статистики и добавлена API GetStatsHistory для получения этих снимков.
  • Добавлен placeholder в манифест, который указывает на запись будущего, которую можно безопасно проигнорировать.
  • Добавлена поддержка выборочной трассировки.
  • Включена проверка контрольных сумм блоков для блочно-ориентированных таблиц.
  • Для всех пользователей сжатия словарями теперь генерируется отдельный словарь для сжатия каждого нижнего уровня SST-файла. Ранее повторно использовался один словарь для всего процесса компактирования до нижнего уровня. Новый подход обеспечивает лучшие коэффициенты сжатия, но требует больше памяти и ЦПУ для буферизации и обучения словарей.
  • Добавлен поддержка целого ключа bloom-фильтра в memtable.
  • Файлы, созданные SstFileWriter, будут использовать сжатие словарями, если это указано в опциях сжатия файла.

Изменение публичного API

  • Запрещено использование CompactionFilter::IgnoreSnapshots() = false, так как это мало полезно и поведение является запутанным. Фильтр будет фильтровать всё, если нет объявленного снимка времени начала компактирования. Однако пользователи могут определить снимок после начала и до завершения компактирования, и этот новый снимок не будет воспроизводимым, поскольку после завершения компактирования некоторые ключи могут быть удалены.
  • Приоритет компактирования CompactionPri = kMinOverlappingRatio также использует скорректированный размер файла, что позволяет файлам с большим количеством отметок обнуления быть первыми в очереди на компактирование.
  • Метод Transaction::GetForUpdate расширен параметром do_validate со значением по умолчанию true. Если значение false, он пропускает проверку снимка перед чтением. Аналогично расширены методы ::Merge, ::Put, ::Delete, и ::SingleDelete параметром assume_tracked со значением по умолчанию false. Если значение true, это указывает на то, что вызов предполагается после ::GetForUpdate.
  • Поле TableProperties::num_entries и TableProperties::num_deletions теперь также учитывают количество диапазонных отметок обнуления.
  • Удалены модули geodb, spatial_db, document_db, json_document, date_tiered_db и redis_lists.
  • При использовании опции ldb ----try_load_options, когда указан каталог wal_dir в файле опций, и этот каталог не существует, он игнорируется.
  • Изменён временной разрешающий интервал в FileOperationInfo.
  • Удаление Blob-файлов также проходит через менеджер SStFileManager.
  • Удалён CuckooHash memtable.
  • Счётчик статистики number.block.not_compressed теперь также считает блоки, которые не были сжаты из-за плохого коэффициента сжатия.
  • Удалён параметр ttl из CompactionOptionsFIFO. Этот параметр был устаревшим, и вместо него используется ttl в ColumnFamilyOptions.
  • Поддержана заинжестировка внешних SST-файлов через несколько семейств колонок с помощью метода DB::IngestExternalFiles. Обратите внимание на примечания к этому методу относительно атомарности.
  • Удалён Lua-фильтр компактирования.

Исправление ошибок

  • Исправлено мёртвое пространство, вызванное ожиданием компактирования и заинжестирования файлов при наличии замедлений записи.
  • Исправлено утечка памяти при чтении файлов с диапазонными отметками обнуления в режиме mmap и активированном блочном кэше.
  • Исправлено обработку повреждённых блоков диапазонных отметок обнуления таким образом, чтобы они не могли привести к появлению удалённых ключей.
  • Реализован безблокировочный MultiGet.
  • Исправлено неверное значение NotFound при запросе конца файла, расширенного диапазонной отметкой обнуления.
  • Исправлено поведение пищевого протокола записи, где неудачный обратный вызов лидера записи приводил к провалу всей группы записи.

Изменение значений по умолчанию

  • Изменено значение по умолчанию для options.compaction_pri на kMinOverlappingRatio## Версия 5.18.0 (2018-11-30)

Новые возможности

  • Введен аллокатор памяти JemallocNodumpAllocator. Когда используется, блочный кэш будет исключен из дампа ядра.
  • Введен объект PerfContextByLevel как часть PerfContext, который позволяет хранить контекст производительности на каждом уровне. Также заменен __thread на ключевое слово thread_local для perf_context. Добавлен контекст производительности на каждом уровне для bloom-фильтра и запроса Get.
  • При активации level_compaction_dynamic_level_bytes = true, множитель уровней может автоматически корректироваться при отстающем компактировании уровня 0 до 1.
  • Введен параметр DBOptions::atomic_flush. Если установлено значение true, RocksDB поддерживает атомарное сбросивание нескольких семейств колонок и последующий атомарный сброс в MANIFEST. Полезно при отключённом журнале.
  • Добавлены поля num_deletions и num_merge_operands в TableProperties.
  • Добавлен параметр rocksdb.min-obsolete-sst-number-to-keep для базы данных, который указывает нижнюю границу номеров SST-файлов, которые должны быть сохранены от удаления, даже если эти SST-файлы устарели.
  • Добавлена поддержка контрольной суммы xxhash64.
  • Введен объект MemoryAllocator, который позволяет пользователю указывать специальный аллокатор памяти для блочно-ориентированных таблиц.
  • Улучшен метод DeleteRange для предотвращения снижения производительности чтения. Эта функциональность больше не помечена как экспериментальная.

Изменение публичного API

  • Параметр DBOptions::use_direct_reads теперь влияет на чтение, выданное BackupEngine на SST-файлах базы данных.
  • Количество счетчиков NO_ITERATORS разделено на два счетчика NO_ITERATOR_CREATED и NO_ITERATOR_DELETE. Оба счетчика теперь только увеличиваются, как и остальные счетчики.

Исправление ошибок

  • Исправлено случайное блокирование лидеров групп записи из-за замедления записи, которое блокировало других писателей в очереди с параметрами WriteOptions::no_slowdown.
  • Исправлено отрезание диапазонных отметок обнуления в памяти, чтобы избежать случайного покрытия новых ключей на более низком уровне, и включение диапазонных отметок обнуления в компактированные файлы, самый большой ключ которых равен началу диапазона отметки обнуления.
  • Корректно установлен ключ остановки для отрезанного ручного CompactRange.
  • Исправлено медленное сбросивание/компактирование при наличии большого количества данных.### Новые возможности
  • Изменён формат блоков индексов путём хранения ключей в их сыром виде вместо преобразования в InternalKey. Это позволяет экономить 8 байтов на каждом ключе индекса. Эта возможность обратно совместима, но не является прямым расширением старых версий. Деактивирована по умолчанию, если используется версия формата ниже 3.
  • Исключение вызова memcpy при чтении mmap-файлов с помощью OpenReadOnly и max_open_files == -1.
  • Динамическое изменение опции ColumnFamilyOptions::ttl через SetOptions().
  • Добавлено новое свойство таблицы "rocksdb.num.range-deletions", которое подсчитывает количество диапазонных удалений в таблице.
  • Улучшение производительности итераторов при выполнении длинных диапазонных сканирований с использованием предварительной загрузки при работе с прямым вводом/выводом.
  • В BlockBasedTableOptions можно использовать опцию pin_top_level_index_and_filter (по умолчанию true) вместе с cache_index_and_filter_blocks для предварительной загрузки и закрепления верхнего уровня индекса и блоков фильтрации в кеше. Это не влияет на работу, когда cache_index_and_filter_blocks равно false.
  • Сохранение метаблока свойств в конце блочного файла для экономии предварительной загрузки ввода/вывода.

Исправление ошибок

  • Устранено мёртвое пространство при активации enable_pipelined_write=true и max_successive_merges > 0.
  • Проверка конфликта на уровне выхода в CompactFiles.
  • Устранено повреждение при чтении без использования итератора при использовании mmap для чтения файлов.
  • Устранено повреждение при поиске по префиксу в фильтрах разделов, где общие префиксы игнорируются в более поздних разделах. Это могло привести к тому, что существующий ключ был отмечен как отсутствующий. Баг мог быть активирован, если prefix_extractor был установлен и фильтры разделов были активированы.
  • Изменено значение по умолчанию bytes_max_delete_chunk на 0 в NewSstFileManager() поскольку это плохо работает с контрольными точками.
  • Устранено повреждение при записи сжатых SST-файлов, прямого ввода/вывода, предварительной загрузки и отсутствия кеша сжатых блоков.
  • Устранено зависание записи при активации enable_pipelined_write=true. Проблема существует с момента введения прямой записи в версии 5.5.0.

5.14.0 (2018-05-16)

Изменение публичного API

  • Добавлена опция BlockBasedTableOption, которая выравнивает несжатые данные на границе меньшей из размера блока или страницы, чтобы минимизировать чтения через 4К страницы.
  • Конвенция названий потоков фона была изменена (на поддерживающих платформах) до "rocksdb:<приоритет потока><номер потока>", например, "rocksdb:низкий0".
  • Добавлен новый счетчик статистики rocksdb.number.multiget.keys.found, который подсчитывает количество успешно прочитанных ключей в вызовах MultiGet.
  • Обновлены счетчики, связанные с записью, в PerfContext. Добавлены новые счетчики: write_scheduling_flushes_compactions_time, write_thread_wait_nanos. Изменены поведение некоторых счетчиков: write_memtable_time, write_pre_and_post_process_time, write_delay_time.
  • Метод Posix Env's NewRandomRWFile() теперь завершается ошибкой, если файл не существует.
  • Теперь опция DBOptions::use_direct_io_for_flush_and_compaction применяется только к фоновым записям, а опция DBOptions::use_direct_reads применяется к обоим пользователям и фоновым чтениям. Это соответствует рекомендациям в руководстве по open(2), которое советует против одновременного чтения одного файла в режиме с буферизацией и без него из-за возможного неопределенного поведения и понижения производительности.
  • Метод Iterator::Valid() всегда возвращает false, если !status().ok(). Поэтому после выполнения Seek() и последующих Next(), нет необходимости проверять status() после каждого действия.
  • Методы Iterator::Seek(), SeekForPrev(), SeekToFirst(), SeekToLast() всегда сбрасывают состояние.

Новые возможности

  • Введено использование TTL для уровневой компактации, чтобы все файлы старше TTL прошли бы процедуру компактации для удаления старых данных.
  • Опция TransactionDBOptions::write_policy может быть настроена для активации двухэтапных транзакций WritePrepared. Читайте подробнее о них в вики.
  • Добавлены свойства базы данных "rocksdb.block-cache-capacity", "rocksdb.block-cache-usage", "rocksdb.block-cache-pinned-usage", показывающие использование кеша блоков.
  • Добавлен метод Env::LowerThreadPoolCPUPriority(Priority), который снижает приоритет процессора фоновых (особенно компактационных) потоков для минимизации воздействия на основные задачи.
  • Выполнение fsync родительской директории после удаления файла в планировщике удалений.
  • В уровневой компактации, если нижний приоритетный пусть потоков был создан с помощью Env::SetBackgroundThreads(), компактация в нижнем уровне будет делегирована этому пулу потоков.
  • prefix_extractor перемещён из ImmutableCFOptions в MutableCFOptions, что позволяет динамически менять его без перезапуска базы данных.

Исправление ошибок

  • Выполнение fsync после записи глобального номера последовательности в файл интеграции в ExternalSstFileIngestionJob.
  • Устранено повреждение журнала транзакций, вызванное гонкой между потоком записи пользователя и потоком FlushWAL, когда two_write_queue не установлен.
  • Устранено некорректное удаление файлов резерва при невозможности точно определить количество ссылок на файл.
  • Устранено утечка памяти при использовании pin_l0_filter_and_index_blocks_in_cache с разделёнными фильтрами.
  • Отключено возврат операндов слияния в транзакциях WritePrepared для работы со специальными случаями в MyRocks. Это можно снова активировать, установив TransactionDBOptions::rollback_merge_operands на true.
  • Устранено получение неверных результатов при использовании ReverseBytewiseComparator::FindShortSuccessor().

Изменения Java API

  • Добавлен метод BlockBasedTableConfig.setBlockCache, позволяющий использовать одинаковый кеш блоков для нескольких экземпляров базы данных.
  • Добавлен SstFileManager в Java API для управления SST-файлами между экземплярами базы данных.

5.13.0 (2018-03-20)### Изменение публичного API

  • Аргумент ignore_unknown_options в методе RocksDBOptionsParser::Parse() будет действовать только тогда, когда файл опций указывает, что он был сгенерирован с помощью более ранней версии RocksDB.
  • Удалён слушатель событий компактации CompactionEventListener.

Новые возможности

  • SstFileManager теперь может отменять компактацию, если она приведёт к ошибкам максимального размера. Пользователи SstFileManager могут использовать SetCompactionBufferSize, чтобы указать, какой минимальный размер свободного места должен остаться во время компактации для выполнения функций таких как логирование и флешивание.
  • Предотвращение неоправданного флешивания в CompactRange(), если указанный пользователем диапазон не пересекается с незаписанными мемтаблицами.
  • Если ColumnFamilyOptions::max_subcompactions установлен больше единицы, мы теперь параллелизуем крупные ручные уровневые компактации.
  • Добавлено свойство базы данных "rocksdb.live-sst-files-size", которое возвращает общее число байтов всех SST-файлов, принадлежащих текущему LSM-дереву.
  • В NewSstFileManager добавлен аргумент bytes_max_delete_chunk с значением по умолчанию 64МБ. Если файл больше 64МБ, он будет многократно урезаться до этого размера.

Исправление ошибок

  • Устранено утечка памяти в prepared_section_completed_, где нулевые записи не удалялись из карты.
  • Устранено повреждение журнала транзакций, вызванное гонкой между потоком записи пользователя и потоком резерва/представления контрольной точки.

5.12.0 (2018-02-14)

Изменение публичного API

  • Метод Iterator::SeekForPrev теперь является чисто виртуальным методом. Это предотвращает ошибочное реализование этого метода пользователями, которые внедряют интерфейс Iterator.
  • Добавлен параметр include_end для того чтобы сделать конец диапазона эксклюзивным при условии, что include_end == false в методе DeleteFilesInRange().
  • Добавлен параметр allow_write_stall в CompactRangeOptions, который позволяет начинать выполнение CompactRange сразу же, даже если это вызывает замедление записей пользователей. По умолчанию значение этого параметра равно false, что означает добавление задержки до тех пор, пока можно избежать замедления записей.
  • Создание контрольной точки с пустой директорией теперь возвращает Status::InvalidArgument; ранее это возвращало Status::IOError.
  • Добавлена опция BlockBasedTableOption для отключения сжатия индексного блока.
  • Метод Close() теперь возвращает статус при закрытии базы данных.

Новые возможности

  • Улучшение производительности итераторов при выполнении длинных сканирований диапазонов за счет использования функции предварительного чтения.
  • Добавлен новый метод DeleteFilesInRanges(), позволяющий удалить файлы из нескольких диапазонов одновременно для повышения производительности.
  • Поддержка сборки FreeBSD для RocksDB и RocksJava.
  • Улучшение производительности при выполнении длинных сканирований диапазонов за счет использования функции предварительного чтения.
  • Обновление до версии Visual Studio 2017 и непрерывное тестирование.

Исправления ошибок

  • Исправление проблемы, когда DisableFileDeletions() последует за GetSortedWalFiles(), в результате чего возвращаются устаревшие файлы WAL, которые PurgeObsoleteFiles() намерено удаляет.
  • Исправление обработки ошибок возврата из WriteBuffer() во время закрытия файла WAL и базы данных.
  • Исправление проблем с зарезервированным адресом блока арен.
  • Исправление обработки пустой строки как директории контрольной точки.

5.11.0 (2018-01-08)

Изменение публичного API

  • Добавлены методы autoTune и getBytesPerSecond() в RocksJava RateLimiter.

Новые возможности

  • Добавлен новый гистограммный статус rocksdb.db.flush.micros для сброса мемтаблиц.
  • Добавлен параметр --use_txn для использования транзакционного API в db_stress.
  • Отключение внутреннего кэша для выходных данных компактирования на платформе Windows.
  • Улучшение производительности итераторов при выполнении длинных сканирований диапазонов за счет использования функции предварительного чтения.

Исправления ошибок

  • Исправление ошибки использования после завершения области в ForwardIterator.
  • Исправление сборок на платформах, включая Linux, Windows и PowerPC.
  • Исправление переполнения буфера в механизме резервного копирования для баз данных с большим количеством файлов.
  • Исправление ошибки маркировки потоков нижнего уровня компактирования.
  • Исправление проблемы, когда DB::Flush продолжает ждать после завершения сброса при определённых условиях.

5.10.0 (2017-12-11)

Изменение публичного API

  • При запуске make с переменной окружения USE_SSE установленной и PORTABLE не установленной, будет использоваться все доступные локальные характеристики машины. Ранее эта комбинация компилировала только связанные с SSE функции.

Новые возможности

  • Предоставление подсказок о сроке службы при записи файлов на Linux. Это снижает множественный эффект записи на устройствах хранения, поддерживающих несколько потоков.
  • Добавлен статус базы данных NUMBER_ITER_SKIP, который показывает количество внутренних ключей, пропущенных во время итераций (например, из-за того, что они являются надгробиями или повторными версиями ключа).
  • Добавлены счетчики контекста производительности key_lock_wait_count и key_lock_wait_time, которые измеряют количество раз, когда транзакции ожидают блокировки ключей, и общее время ожидания.

Исправления ошибок

  • Исправление ошибки IOError при записи WAL, которая не распространяется до группы следования записи.
  • Исправление недействительности итератора при ошибке слияния.
  • Исправление проблемы производительности в IngestExternalFile() для баз данных с большим количеством файлов SST.
  • Исправление возможной коррозии структуры LSM при удалении подмножества файлов, охватываемых меткой DeleteRange().## 5.9.0 (2017-11-01)

Изменение публичного API

  • BackupableDBOptions::max_valid_backups_to_open == 0 теперь означает, что резервные копии не будут открываться при инициализации BackupEngine. Ранее это состояние отключало ограничение на количество открытых резервных копий.
  • DBOptions::preserve_deletes — новое определение, которое позволяет указывать, что база данных должна сохранять надгробия для обычных удалений, если они имеют номер последовательности больше, чем был установлен новым вызовом API DB::SetPreserveDeletesSequenceNumber(SequenceNumber seqnum). Отключено по умолчанию.
  • Вызов API DB::SetPreserveDeletesSequenceNumber(SequenceNumber seqnum) был добавлен; пользователи, желающие сохранять удаления, должны периодически вызывать эту функцию для продвижения границы последовательности (все удаления, сделанные перед этой последовательностью, могут быть удалены базой данных). Это обязанность пользователя определить, как продвигать последовательность таким образом, чтобы надгробия были сохранены на желаемый период времени, но в то же время были обработаны своевременно и не занимали слишком много места.
  • ReadOptions::iter_start_seqnum был добавлен; если он установлен на число больше 0, пользователь увидит два изменения в поведении итераторов: 1) только ключи, записанные с последовательностью большей, чем этот параметр, будут возвращены, и 2) Slice, возвращаемый iter->key(), теперь указывает на память, содержащую пользовательскую ориентированную представление внутреннего ключа, вместо пользовательского ключа. Был добавлен новый тип FullKey для представления внутренних ключей, вместе с новой вспомогательной функцией ParseFullKey(const Slice& internal_key, FullKey* result);.
  • Устаревший параметр trash_dir в NewSstFileManager был устранён; сейчас мы переименуем удаленные файлы в <name>.trash вместо перемещения их в директорию trash.
  • Возможность установки пользовательской границы соотношения размера корзины/размера базы данных, после которой файлы, предназначенные для удаления, будут немедленно удалены, независимо от любого ограничения скорости удаления.
  • Возврат ошибки при записи, если write_options.sync = true и write_options.disableWAL = true, чтобы предупредить пользователя о несовместимых опциях. Ранее мы игнорировали эти опции и не выполняли запись в WAL.

Новые возможности

  • CRC32C теперь использует трехканальный алгоритм SSE crc32c_3way на поддерживаемых платформах для улучшения производительности. Система автоматически выбирает использование этого алгоритма на всех поддерживаемых платформах, где это возможно. Если PCLMULQDQ не поддерживается, используется старый алгоритм Fast_CRC32.
  • DBOptions::writable_file_max_buffer_size может теперь изменяться динамически.
  • DBOptions::bytes_per_sync, DBOptions::compaction_readahead_size, и DBOptions::wal_bytes_per_sync также могут изменяться динамически, DBOptions::wal_bytes_per_sync будет выполнять сброс всех мемтаблиц и переход к новому файлу WAL.
  • Поддержка динамического регулирования скорости в соответствии с потребностями фоновых операций ввода-вывода. Эта возможность может быть включена путём передачи true параметру auto_tuned в NewGenericRateLimiter(). Значение, переданное как rate_bytes_per_sec, всё ещё будет учитываться как верхний предел.
  • Поддержка динамического изменения ColumnFamilyOptions::compaction_options_fifo.
  • Введение обратного вызова EventListener::OnStallConditionsChanged(). Пользователи могут реализовать его для получения уведомлений о том, когда записи пользователей замедлены, прекращены или возобновлены.
  • Добавлен новый свойство базы данных "rocksdb.estimate-oldest-key-time", которое возвращает самую раннюю отметку времени данных. Это свойство доступно только для FIFO компактирования с compaction_options_fifo.allow_compaction = false.
  • После освобождения снимка, рекомпактируются самые нижние файлы, содержащие удалённые/перезаписанные ключи, которые ранее не могли быть удалены из-за наличия снимка. Это уменьшает эффект увеличения пространства, вызванного длительно сохраняемыми снимками.
  • Поддержка нижней границы итераторов, указанной через ReadOptions::iterate_lower_bound.
  • Поддержка дифференциальных снимков (через итератор, выдающий последовательность ключей-значений, представляющую различие между состоянием базы данных в двух различных последовательностях). Поддерживаются сохранение и вывод обычных вставок и удалений, не поддерживаются SingleDeletes, MergeOperator, Blobs и Диапазонные удаления.

Исправления ошибок

  • Исправление потенциальной проблемы некорректного восстановления в момент времени. DB:Open() будет прерван, если найдено несоответствие семейства столбцов при восстановлении в момент времени.
  • Исправление возможной коррозии метаданных в базах данных, использующих DeleteRange().

5.8.0 (2017-08-30)

Изменение публичного API

  • Пользователи Statistics::getHistogramString() увидят меньше гистограммных ячеек и различные конечные точки ячеек.
  • Методы Slice::compare и BytewiseComparator Compare больше не принимают Slice's, содержащие nullptr.
  • Добавлены варианты Transaction::Get и Transaction::GetForUpdate с PinnableSlice.### Новые возможности
  • Добавлен метод Iterator::Refresh(), который позволяет пользователям обновлять состояние итератора, чтобы избежать некоторых затрат на инициализацию при создании новых итераторов.
  • Замена dynamic_cast<> (кроме юнит-тестов) так, чтобы люди могли выбирать сборку без RTTI. При использовании make, режим выпуска по умолчанию собирается с -fno-rtti, а режим отладки без него. Пользователи могут переопределить это, установив USE_RTTI=0 или 1.
  • Все универсальные компактирования, включая самый нижний уровень, могут выполняться в отдельном пуле фоновых потоков. Это уменьшает блокировку головы очереди компактирования, которая вызывает замедление записей, особенно в многоместных случаях. Пользователи могут активировать эту функцию через Env::SetBackgroundThreads(N, Env::Priority::BOTTOM), где N > 0.
  • Разрешение вызова оператора объединения даже при наличии одного операнда во время компактирования, путём правильного переопределения MergeOperator::AllowSingleOperand.
  • Добавлен метод DB::VerifyChecksum(), который проверяет контрольные суммы во всех файлах SST в работающей базе данных.
  • Поддержка отключения контрольных сумм в блочной таблице, путём установки BlockBasedTableOptions::checksum = kNoChecksum.

Исправления ошибок

  • Исправление неверных временных значений в rocksdb.db.get.micros, rocksdb.db.write.micros, и rocksdb.sst.read.micros.
  • Исправление некорректного удаления удалений во время внутри-L0 компактирования.
  • Исправление временного появления ключей, покрытых диапазонными удалениями, при включенном префиксном фильтре блока памяти.
  • Исправление потенциально неверного минимального ключа файла при записи диапазонных удалений, разделённых снимком.

5.7.0 (2017-07-13)

Изменение публичного API

  • Свойство базы данных "rocksdb.sstables" теперь печатает ключи в шестнадцатеричном виде.

Новые возможности

  • Измерение приближенного количества чтений на файл. Информация доступна через DB::GetColumnFamilyMetaData или свойство базы данных "rocksdb.sstables".
  • Поддержка RateLimiter для ограничения фоновых чтений или суммы фоновых чтений и записей. Это может сделать использование ввода-вывода более предсказуемым, когда компакция читает больше данных, чем пишет, например, из-за множественных удалений.
  • [Экспериментальная] FIFO компакция с поддержкой TTL. Она может быть включена путём установки CompactionOptionsFIFO.ttl > 0.
  • Введение обратного вызова EventListener::OnBackgroundError(). Пользователи могут реализовать его для получения уведомлений ошибках, приводящих к переходу базы данных в режим чтения только, и, по желанию, переопределить их.
  • Выход из экспериментального режима для разделённых индексов/фильтров. Для включения разделённых индексов установите index_type на kTwoLevelIndexSearch, а для включения разделённых фильтров установите partition_filters на true. Размер метаданных можно настроить с помощью metadata_block_size.

Исправленные ошибки

  • Устранение проблемы игнорирования пустых выходных файлов компакции при использовании DeleteRange() вместе с подкомпакциями.

Версия 5.6.0 (2017-06-06)

Изменения в публичном API

  • Настройка max_background_flushes=0 больше не поддерживается для планирования сбросов и компакций в одном пуле потоков. Вместо этого пользователи могут достичь этого, настроив высший приоритетный пуле потоков на ноль потоков.
  • Замена Options::max_background_flushes, Options::max_background_compactions, и Options::base_background_compactions на Options::max_background_jobs, который автоматически решает количество потоков для выделения на сбросы/компакции.
  • По умолчанию значение options.delayed_write_rate берётся из значения options.rate_limiter.
  • Замена глобальной переменной IOStatsContext iostats_context на IOStatsContext* get_iostats_context();, замена глобальной переменной PerfContext perf_context на PerfContext* get_perf_context();.

Новые возможности

  • Изменение реализаций тикера/гистограмм статистики для использования локального хранилища. Это повышает скорость агрегации по сравнению с нашим предыдущим подходом на основе потока, особенно для приложений с большим количеством потоков.
  • Пользователи могут передать объект кэша в менеджер буферов записи, чтобы ограничивать использование памяти для мемтаблиц и блочного кэша одним значением.
  • Сброс будет запускаться, когда достигается 7/8 установленного порога в менеджере буферов записи или db_write_buffer_size, что делает достижение жёсткого порога менее вероятным.
  • Введение WriteOptions.low_pri. Если это значение истинно, записи низкого приоритета будут ограничиваться, если компакция отстаёт.
  • DB::IngestExternalFile() теперь поддерживает импорт файлов в базу данных, содержащую диапазонные удаления.

Исправленные ошибки

  • Необходимость учёта возвратного значения fsync() во время сброса.

Версия 5.5.0 (2017-05-17)

Новые возможности

  • FIFO компакция для поддержки внутренней L0 компакции с CompactionOptionsFIFO.allow_compaction=true.
  • Введение метода DB::ResetStats() для сброса внутренних статистик.
  • Введение метода Statistics::Reset() для сброса пользовательских статистик.
  • Добавление опции --try-load-options в команду ldb для открытия базы данных с её собственным файлом конфигурации.
  • Введение метода WriteBatch::PopSavePoint для явного удаления последнего точки сохранения.
  • Поддержка динамического изменения опции max_open_files через SetDBOptions().
  • Добавление методов DB::CreateColumnFamily() и DB::DropColumnFamilies() для массового создания/удаления столбцовых семейств.
  • Добавление отладочной функции GetAllKeyVersions для просмотра внутренних версий ключей.
  • Поддержка импорта файлов с использованием универсальной стилистики компакции.
  • Поддержка импорта файлов за пределами опции allow-ingest-behind.
  • Новая опция enable-pipelined-write, которая может повысить производительность записи при записи из нескольких потоков и активированном журнале транзакций.

Исправленные ошибки

  • Устранение ошибки использования прямого чтения для не-SST файлов.## Версия 5.4.0 (2022-04-11)

Изменения в публичном API

  • Опция random_access_max_buffer_size больше не имеет эффекта.
  • Удаление методов Env::EnableReadAhead() и Env::ShouldForwardRawRequest().
  • Поддержка динамического изменения опции stats_dump_period_sec через SetDBOptions().
  • Добавление метода ReadOptions::max_skippable_internal_keys для установки порога, при котором запрос считается незавершенным из-за пропущенных ключей при использовании итераторов.
  • Метод DB::Get принимает PinnableSlice вместо std::string, что позволяет избежать лишнего копирования значения в std::string.
    • PinnableSlice освобождает закрепленные ресурсы, содержащие значение, при уничтожении или вызове ::Reset().
    • Старый метод, принимающий std::string, хотя и не рекомендован, всё ещё поддерживается.
  • Замена опции Options::use_direct_writes на Options::use_direct_io_for_flush_and_compaction. Подробнее см. Wiki по прямому вводу-выводу.
  • Добавление методов CompactionEventListener и EventListener::OnFlushBegin.

Новые возможности

  • При создании контрольной точки можно избежать сброса мемтаблицы, если общее размер файла журнала меньше указанного порога.
  • Введение уровня L0→L0 компакций для снижения количества файлов, так что задержки записи происходят реже.
  • (Экспериментальная) Разбиение фильтров, создающее индекс на части. Возможность включения через установку partition_filters при использовании kFullFilter. В настоящее время эта возможность также требует включения двухуровневого индексирования. Количество частей равно количеству частей для индексов, контролируется параметром metadata_block_size.

Версия 5.3.0 (2017-03-08)

Изменения в публичном API

  • Удаление опции disableDataSync.
  • Удаление опции timeout_hint_us из WriteOptions. Эта опция была устарела и не влияла на работу с версии 3.13.0.
  • Удаление опции min_partial_merge_operands. Частичные операнды слияния всегда будут объединены в сбросе или компакции, если их больше одного.
  • Удаление опции verify_checksums_in_compaction. Компакция всегда проверяет контрольные суммы.

Исправленные ошибки

  • Устранение ошибки, при которой итератор мог пропускать ключи.

Версия 5.2.0 (2017-02-08)

Изменения в публичном API

  • Метод NewLRUCache() автоматически определяет количество битов шардов на основе емкости, если пользователь не передаёт это значение. Это также влияет на дефолтный блочный кэш, если пользователь не указывает его явно.
  • Изменение значения по умолчанию для затухания задержки до 16 МБ/с и увеличение условия остановки L0 до 36 файлов.
  • Опции Options::use_direct_writes и Options::use_direct_reads теперь готовы к использованию.
  • (Экспериментальная) Двауровневое индексирование, которое разделяет индекс и создаёт второй уровень индекса на частях. Возможность включения через установку kTwoLevelIndexSearch как типа индекса и настройку index_per_partition.

Новые возможности

  • Добавление нового перегруженного метода GetApproximateSizes, который позволяет указывать, следует ли рассчитывать статистику мемтаблицы без расчёта приближённых статистик SST файлов.
  • Добавление нового метода GetApproximateMemTableStats, который аппроксимирует количество записей и размер мемтаблиц.
  • Добавление режима прямого ввода-вывода для SST файлов.

Исправленные ошибки

  • RangeSync() должен работать, даже если ROCKSDB_FALLOCATE_PRESENT не установлен.
  • Устранение неверных результатов в случае гонки данных в методе Get().
  • Некоторые исправления, связанные с 2PC.
  • Устранение ошибок корruptions данных в прямом вводе-выводе.

Версия 5.1.0 (2017-01-13)

  • Поддержка динамического изменения опции delete_obsolete_files_period_micros через SetDBOptions().
  • Добавление обратного вызова EventListener::OnExternalFileIngested, который вызывается, когда IngestExternalFile() успешно добавляет файл.
  • Методы BackupEngine::Open и BackupEngineReadOnly::Open теперь всегда возвращают статусы ошибок, соответствующие ошибкам в окружении резервного копирования.

Исправленные ошибки

  • Устранение ошибки, при которой если 2PC включен, контрольные точки могут потерять некоторые недавние транзакции.
  • Когда требуется копирование файлов при создании контрольных точек или массовой загрузке файлов, выполнение fsync после копирования файла.

Версия 5.0.0 (2016-11-17)

Изменения в публичном API

  • Опция Options::max_bytes_for_level_multiplier стала вещественным числом со всеми getter и setter.
  • Поддержка динамического изменения опций delayed_write_rate и max_total_wal_size через SetDBOptions().
  • Введение метода DB::DeleteRange для оптимизированного удаления больших диапазонов последовательных ключей.
  • Поддержка динамического изменения опции delayed_write_rate через SetDBOptions().
  • Опции allow_concurrent_memtable_write и enable_write_thread_adaptive_yield стали истинными по умолчанию.
  • Удаление тикера Tickers::SEQUENCE_NUMBER для избежания путаницы, если объект статистики используется несколькими экземплярами RocksDB. В качестве альтернативы можно использовать DB::GetLatestSequenceNumber().
  • Значение по умолчанию для опции Options::level0_stop_writes_trigger изменено с 24 на 32.
  • Новый API фильтра компакции: CompactionFilter::FilterV2(). Позволяет удалять диапазоны ключей.
  • Удаление поддержки flashcache.
  • Метод DB::AddFile() устарел и заменён методом DB::IngestExternalFile(). Метод DB::IngestExternalFile() устраняет все ограничения, существовавшие для DB::AddFile.### Новые возможности
  • Добавлена опция avoid_flush_during_shutdown для ускорения завершения работы базы данных за счёт отказа от сброса неперманентных данных (то есть с disableWAL = true). Неперманентные данные будут потеряны. Опция может быть динамически изменена через SetDBOptions().
  • Добавлена опция memtable_insert_with_hint_prefix_extractor для снижения нагрузки на процессор при вставке ключей в мемтаблицу, если ключи можно группировать по префиксу и вставка для каждого префикса является последовательной или почти последовательной. Подробнее см. include/rocksdb/options.h.
  • Добавлен LuaCompactionFilter в utils. Это позволяет разработчикам писать фильтры компакции на Lua. Для использования этой функциональности необходимо установить LUA_PATH в корневой каталог Lua.
  • Больше не заполняется файл "LATEST_BACKUP" в директории резервного копирования, который ранее содержал номер последней резервной копии. Последняя резервная копия может быть определена поисковым поиском самого большого номера файла в поддиректории "meta/".

Версия 4.12.0 (2016-09-12)

Изменение публичного API

  • CancelAllBackgroundWork() теперь очищает все memtables для баз данных, содержащих записи, пропущенные WAL (записи, созданные с WriteOptions::disableWAL=true) перед завершением работы фоновых потоков.
  • Объединены опции слияния source_compaction_factor, max_grandparent_overlap_bytes и expanded_compaction_factor в max_compaction_bytes.
  • Удалён ImmutableCFOptions.
  • Добавлен тип сжатия ZSTD, который может работать с ZSTD версией 0.8.0 или выше. Временный тип сжатия ZSTDNotFinal сохранён для обратной совместимости.

Новые возможности

  • Введена новая ClockCache, основанная на алгоритме CLOCK с лучшей производительностью при параллельной работе в некоторых случаях. Она может использоваться для замены стандартного LRU-кэша блоков и таблиц. Для использования её требуется связать RocksDB с библиотекой TBB.
  • Изменено реализование тикера/гистограммы статистики для накопления данных в локальном хранилище потока, что улучшает производительность процессора за счёт снижения затрат на согласованность кеша. Вызовы CreateDBStatistics не требуют изменения для использования этой функциональности.
  • Вставка в середину кэша блоков, где индексные и фильтрационные блоки вставляются в LRU-кэш блоков с более высоким приоритетом. Возможность включения данной функции обеспечивается установкой BlockBasedTableOptions::cache_index_and_filter_blocks_with_high_priority в true и high_pri_pool_ratio > 0 при создании NewLRUCache.

Версия 4.11.0 (2016-08-01)

Изменение публичного API

  • options.memtable_prefix_bloom_huge_page_tlb_size переименовано в memtable_huge_page_size. При его установке RocksDB попытается выделить память из больших страниц для memtable, а не только для bloom-фильтра префиксов.

Новые возможности

  • Инструмент для миграции БД после изменения опций. Подробнее см. include/rocksdb/utilities/option_change_migration.h.
  • Добавлен ReadOptions.background_purge_on_iterator_cleanup. Если установлено значение true, мы избегаем удаления файлов при уничтожении итераторов.

Версия 4.10.0 (2016-07-05)

Изменение публичного API

  • options.memtable_prefix_bloom_bits изменено на options.memtable_prefix_bloom_bits_ratio и отключено options.memtable_prefix_bloom_probes.
  • Тип перечисления CompressionType и PerfLevel изменены с char на unsigned char. Все значения PerfLevel смещены на один.
  • Отключено options.filter_deletes.

Новые возможности

  • Добавлен параметр avoid_flush_during_recovery.
  • Добавлен параметр read_options.background_purge_on_iterator_cleanup для избежания удаления файлов в фоновом режиме при уничтожении итераторов. Вместо этого создаётся задача в очереди с высоким приоритетом и выполняется в отдельном фоновом потоке.
  • Поддержка RepairDB для семейств колонок. RepairDB теперь ассоциирует данные с нестандартными семействами колонок, используя информацию, встроенную в SST/WAL файлы (версия 4.7 или выше). Для данных, записанных до версии 4.6, RepairDB ассоциирует их с стандартным семейством колонок.
  • Добавлен параметр options.write_buffer_manager для контроля общего размера memtable для нескольких экземпляров БД.

Версия 4.9.0 (2016-06-09)

Изменение публичного API

  • Добавлен параметр bottommost_compression для установки специального алгоритма сжатия для нижнего уровня (последний уровень, содержащий файлы в БД).
  • Введен параметр CompactionJobInfo::compression, указывающий алгоритм сжатия, использованный для генерации выходных файлов слияния.
  • Отключен параметр BlockBaseTableOptions.hash_index_allow_collision=false.
  • Отключен конструктор опций (GetOptions()).

Новые возможности

  • Введен новый SimCache() в rocksdb/utilities/sim_cache.h. Этот метод создаёт кэш блоков, способный давать симуляционные результаты (в основном коэффициент хита) путём моделирования поведения блока с настраиваемым размером кэша.

Версия 4.8.0 (2016-05-02)

Изменение публичного API

  • Разрешено использование заранее созданного словаря сжатия для улучшенного сжатия блочных таблиц. Это поддерживается для zlib, zstd и lz4. Размер словаря сжатия настраивается через CompressionOptions::max_dict_bytes.
  • Удалены устаревшие классы для создания резервных копий (BackupableDB) и восстановления из резервных копий (RestoreBackupableDB). Теперь следует использовать BackupEngine для создания резервных копий и BackupEngineReadOnly для восстановления. Подробнее см. https://github.com/facebook/rocksdb/wiki/How-to-backup-RocksDB?
  • Раскрыта оценка соотношения сжатия на уровне через свойство DB: "rocksdb.compression-ratio-at-levelN".
  • Добавлен EventListener::OnTableFileCreationStarted. EventListener::OnTableFileCreated будет вызван в случае ошибки. Создание файла можно проверить через TableFileCreationInfo::status.

Новые возможности

  • Добавлен параметр ReadOptions::readahead_size. Если он отличен от нуля, NewIterator создаст новый читатель таблицы, который выполнит чтение указанного размера.### Изменение публичного API
  • Переименован параметр options.compaction_measure_io_stats в report_bg_io_stats и включено измерение флеш-накопителя.
  • Изменены некоторые стандартные параметры. Теперь стандартные параметры будут оптимизированы для серверных нагрузок. Также активированы триггеры замедления и полного останова для ожидающих слияний байтов. Эти изменения могут привести к недостаточной производительности или значительному увеличению потребления ресурсов. Чтобы избежать этих рисков, пользователи могут открыть существующие RocksDB с параметрами, извлеченными из файлов параметров RocksDB. Подробнее см. https://github.com/facebook/rocksdb/wiki/RocksDB-Options-File. Либо можно вызвать Options.OldDefaults() для восстановления старых стандартных параметров. DEFAULT_OPTIONS_HISTORY.md будет следить за историей изменений стандартных параметров.

Версия 4.6.0 (2016-03-10)

Изменение публичного API

  • Изменён дефолтный параметр BlockBasedTableOptions.format_version на 2. Это значит, что базы данных, созданные с версии 4.6 или выше, не смогут открываться с RocksDB версии 3.9 или ниже.
  • Добавлен параметр strict_capacity_limit для NewLRUCache. Если флаг установлен в true, вставка в кэш провалится, если нет достаточно свободного места. Подпись метода Cache::Insert() также была обновлена.
  • Тикеры [NUMBER_DB_NEXT, NUMBER_DB_PREV, NUMBER_DB_NEXT_FOUND, NUMBER_DB_PREV_FOUND, ITER_BYTES_READ] больше не обновляются сразу. Они обновляются при удалении итератора.
  • Добавлен последовательно возрастающий счетчик (свойство DB "rocksdb.current-super-version-number"), который увеличивается при любом изменении дерева LSM.

Новые возможности

  • Добавлен параметр CompactionPri::kMinOverlappingRatio, режим выбора слияния, дружественный к амплитуде записи.
  • Отключен Iterator::IsKeyPinned() и заменён на Iterator::GetProperty() с prop_name="rocksdb.iterator.is.key.pinned".

Версия 4.5.0 (2016-02-05)

Изменение публичного API

  • Добавлен новый уровень контекста производительности между kEnableCount и kEnableTime. Уровень 2 теперь не включает таймеры для мьютексов.
  • Статистика операций длительности мьютексов не измеряется по умолчанию. Если вам нужны эти данные, вам нужно установить Statistics::stats_level_ на kAll.
  • Удалены DBOptions::delete_scheduler и NewDeleteScheduler(). Пожалуйста, используйте DBOptions::sst_file_manager и NewSstFileManager() вместо них.

Новые возможности

  • Инструмент ldb теперь поддерживает операции над нестандартными семействами колонок.
  • Добавлен параметр kPersistedTier для ReadTier. Этот параметр позволяет Get и MultiGet читать только сохранённые данные и пропускать mem-tables, если записи были сделаны с disableWAL = true.
  • Добавлен параметр DBOptions::sst_file_manager. Используйте NewSstFileManager() из include/rocksdb/sst_file_manager.h для создания SstFileManager, который может использоваться для отслеживания общей величины SST файлов и управления скоростью удаления SST файлов.

Версия 4.4.0 (2016-01-14)

Изменение публичного API

  • Изменены названия в CompactionPri и добавлен новый.
  • Отключен параметр soft_rate_limit и добавлен параметр soft_pending_compaction_bytes_limit.
  • Если options.max_write_buffer_number > 3, записи будут замедлены при записи в последний write-buffer для задержки полного останова.
  • Введён параметр CompactionJobInfo::compaction_reason, этот параметр включает причину запуска слияния.
  • После запуска замедления, если ожидаемое количество ожидающих слияний продолжает расти, замедление усиливается.
  • Увеличен стандартный параметр delayed_write_rate до 2МБ/с.
  • Добавлен новый параметр --path для инструмента ldb. --path принимает имя либо MANIFEST, либо SST, либо WAL файла. Либо --db, либо --path могут быть использованы при вызове ldb.

Версия 4.3.0 (2015-12-08)

Новые возможности

  • CompactionFilter имеет новый метод IgnoreSnapshots, который позволяет CompactionFilter вызываться даже если есть снимки позднее ключа.
  • RocksDB теперь сохраняет опции под тем же каталогом, что и база данных RocksDB при успешном открытии DB::Open, CreateColumnFamily, DropColumnFamily и SetOptions.
  • Введён LoadLatestOptions() в rocksdb/utilities/options_util.h. Этот метод может создать последние DBOptions / ColumnFamilyOptions, используемые указанным экземпляром RocksDB.
  • Введён CheckOptionsCompatibility() в rocksdb/utilities/options_util.h. Этот метод проверяет, могут ли входные опции успешно открыть указанный DB.

Изменение публичного API

  • Когда options.db_write_buffer_size запускается, только семейство колонок с наибольшим размером будет очищено, а не все семейства колонок.

Версия 4.2.0 (2015-11-09)

Новые возможности

  • Введён CreateLoggerFromOptions(), этот метод создаёт Logger для предоставленных DBOptions.
  • Добавлен GetAggregatedIntProperty(), который возвращает сумму GetIntProperty всех семейств колонок.
  • Добавлен MemoryUtil в rocksdb/utilities/memory.h. Он предлагает способ получения использования памяти по типу из списка экземпляров RocksDB.

Изменение публичного API

  • CompactionFilter::Context теперь включает информацию о ID семейства колонок.
  • Подсказка необходимости слияния, предоставляемая TablePropertiesCollector::NeedCompact(), теперь является постоянной и восстанавливаемой после восстановления DB. Это вводит разрыв в формате. Если вы используете это экспериментальное свойство, включая NewCompactOnDeletionCollectorFactory() в новой версии, вы можете не иметь возможности понижения DB до версии 4.0 или ниже.
  • TablePropertiesCollectorFactory::CreateTablePropertiesCollector() теперь принимает параметр Context, содержащий информацию о ID семейства колонок для файла, который пишется.
  • Удалён DefaultCompactionFilterFactory.

Версия 4.1.0 (2015-10-08)

Новые возможности

  • Добавлена одиночная операция удаления как более эффективный способ удаления ключей, которые ещё не были перезаписаны.
  • Добавлен экспериментальный метод AddFile() в интерфейсе базы данных, который позволяет пользователям добавлять файлы, созданные с помощью SstFileWriter, в пустую базу данных, см. include/rocksdb/sst_file_writer.h и DB::AddFile() для получения дополнительной информации.
  • Добавлена поддержка открытия SST-файлов с расширением .ldb, что позволяет открывать базы данных LevelDB.
  • CompactionFilter теперь поддерживает фильтрацию операндов слияния и результатов слияния.### Изменения в общественном API
  • Добавлен метод SingleDelete() в интерфейс базы данных.
  • Добавлен метод AddFile() в интерфейс базы данных.
  • Добавлен класс SstFileWriter.
  • В CompactionFilter добавлен новый метод FilterMergeOperand(), который RocksDB применяет ко всем операндам слияния во время компактации для принятия решения о том, следует ли фильтровать этот операнд.
  • Мы убрали интерфейсы CompactionFilterV2 из include/rocksdb/compaction_filter.h. Эта функциональность была уже устарела начиная с версии 3.13.

Версия 4.0.0 (2015-09-09)

Новые возможности

  • Добавлена поддержка транзакций. Подробнее см. include/rocksdb/utilities/transaction.h.
  • Метод DB::GetProperty() теперь принимает "rocksdb.aggregated-table-properties" и "rocksdb.aggregated-table-properties-at-levelN", при этом он возвращает агрегированные свойства таблицы целевой колонки или агрегированные свойства таблицы указанного уровня N, если используется версия "at-level".
  • Добавлена возможность сжатия kZSTDNotFinalCompression для людей, желающих экспериментировать с ZSTD, хотя его формат еще не окончательный.
  • Мы убрали необходимость наличия файла LATEST_BACKUP в BackupEngine. Мы всё ещё пишем его при создании новых резервных копий (из-за обратной совместимости), но больше не читаем его.

Изменения в общественном API

  • Удалены классы Env::RandomRWFile и Env::NewRandomRWFile().
  • Переименовано поле DBOptions.num_subcompactions в DBOptions.max_subcompactions для лучшей согласованности названия с фактическими возможностями этого параметра.
  • Добавлен метод Equal() в интерфейс Comparator, который может быть переопределен в случаях, когда сравнение равенства можно выполнить более эффективно, чем трехстороннее сравнение.
  • Предыдущий экспериментальный класс OptimisticTransaction заменён классом Transaction.

Версия 3.13.0 (2015-08-06)

Новые возможности

  • Добавлена возможность откатываться до точки сохранения RollbackToSavePoint() в WriteBatch/WriteBatchWithIndex.
  • Добавлен метод NewCompactOnDeletionCollectorFactory() в utilities/table_properties_collectors, который позволяет RocksDB помечать SST-файл как требующий компактации, когда он наблюдает не менее D записей удаления среди любых N последовательных записей в этом SST-файле. Обратите внимание, что эта функциональность зависит от экспериментального API NeedCompact() — результат этого API не будет сохраняться после перезапуска базы данных.
  • Добавлен метод DBOptions::delete_scheduler. Используйте NewDeleteScheduler() из include/rocksdb/delete_scheduler.h для создания объекта DeleteScheduler, который может использоваться несколькими экземплярами RocksDB для контроля скорости удаления файлов SST, существующих в первом пути db_path.

Изменения в общественном API

  • Устарел метод WriteOptions::timeout_hint_us. Поддержка записи с таймаутом больше не поддерживается. Если вам действительно нужна эта опция, свяжитесь с нами, возможно, мы её восстановим.
  • Устарели опция purge_redundant_kvs_while_flush.
  • Удалены методы BackupEngine::NewBackupEngine() и NewReadOnlyBackupEngine(), которые были устарелыми начиная с RocksDB 3.8. Теперь используйте BackupEngine::Open() вместо них.
  • Устарели фильтры компактации Compaction Filter V2. Мы не знаем ни одного существующего использования этих фильтров. Если вы используете этот фильтр, ваш сборка сломается с RocksDB 3.13. Пожалуйста, сообщите нам, если вы используете его, и мы вернем его в RocksDB 3.14.
  • Метод Env::FileExists теперь возвращает объект Status вместо логического значения.
  • Добавлен метод statistics::getHistogramString() для печати детальной распределенной метрики гистограммы.
  • Добавлен метод DBOptions::skip_stats_update_on_db_open. Когда он активирован, метод DB::Open() работает быстрее, так как пропускает случайные чтения, необходимые для загрузки необходимых статистик из SST-файлов для оптимизации компактации.

Версия 3.12.0 (2015-07-02)

Новые возможности

  • Добавлена экспериментальная поддержка оптимистичных транзакций. Подробнее см. include/rocksdb/utilities/optimistic_transaction.h.
  • Добавлен новый способ отчета QPS из db_bench (проверьте --report_file и --report_interval_seconds).
  • Добавлен кэш для отдельных строк. Подробнее см. DBOptions::row_cache.
  • Несколько новых возможностей в EventListener (см. include/rocksdb/listener.h):
    • Метод OnCompactionCompleted() теперь возвращает статистику каждого задания компактации, определенную в include/rocksdb/compaction_job_stats.h.
    • Добавлены методы OnTableFileCreated() и OnTableFileDeleted().
  • Добавлен метод enable_trivial_move в compaction_options_universal, чтобы позволить простое перемещение при универсальном компактировании. Простое перемещение произойдет только тогда, когда все входные файлы не перекрываются друг с другом.### Изменения в общественном API
  • Метод EventListener::OnFlushCompleted() теперь передает FlushJobInfo вместо списка параметров.
  • Метод DB::GetDbIdentity() теперь является константным. Если этот метод переопределен в вашем приложении, убедитесь, что GetDbIdentity() также является константным, чтобы избежать ошибки компиляции.
  • Прослушиватели перемещены из ColumnFamilyOptions в DBOptions.
  • Добавлен параметр max_write_buffer_number_to_maintain.
  • Параметр reduce_level в методе DB::CompactRange() изменен на change_level, чтобы позволить пользователям перемещать уровни в более низкие уровни, если это допустимо. Он может использоваться для миграции базы данных с options.level_compaction_dynamic_level_bytes=false на options.level_compaction_dynamic_level_bytes=true.
  • По умолчанию значение параметров options.compaction_filter_factory и options.compaction_filter_factory_v2 установлено на nullptr вместо DefaultCompactionFilterFactory и DefaultCompactionFilterFactoryV2.
  • Если вызван метод CancelAllBackgroundWork без выполненного флеша после выполнения загрузок с отключенным журналом, изменения, которые не были флэшированы до вызова метода CancelAllBackgroundWork, будут потеряны.
  • Метод WBWIIterator::Entry() теперь возвращает WriteEntry вместо WriteEntry.
  • Параметр options.hard_rate_limit устарел.
  • При активации параметров options.soft_rate_limit или options.level0_slowdown_writes_trigger скорость записи ограничивается значением options.delayed_write_rate.
  • Метод DB::GetApproximateSizes() добавляет параметр для разрешения учета данных в памяти таблицы. По умолчанию этот параметр имеет значение false. Это теперь поддерживается только в случае использования skip-list mem-table.
  • Метод DB::CompactRange() теперь принимает параметры типа CompactRangeOptions вместо нескольких параметров. CompactRangeOptions определен в include/rocksdb/options.h.
  • Метод CompactRange() теперь пропускает компактацию нижнего уровня для уровня-основанной компактации, если нет фильтра компактации. Параметр bottommost_level_compaction в CompactRangeOptions контролирует возможность пропуска компактации нижнего уровня. Это значит, что если вы хотите, чтобы компактация производила один файл, вам нужно установить bottommost_level_compaction на BottommostLevelCompaction::kForce.
  • Добавлен метод Cache.GetPinnedUsage() для получения размера памяти, занятой элементами, используемыми системой.
  • Метод DB:Open() теперь завершится ошибкой, если сжатие, указанное в Options, не связано с бинарником. Если вы видите эту ошибку, перекомпилируйте RocksDB с библиотеками сжатия, доступными на вашей системе. Также ранее наша стандартная сжатия была snappy. Это поведение теперь изменено. Теперь стандартной сжатием является snappy только если она доступна на системе. Если она недоступна, стандарт изменяется на kNoCompression.
  • Мы изменили то, как мы учтем использование памяти в блочном кэше. Ранее мы считали сумму размеров блоков, находящихся в блочном кэше. Теперь мы считаем реальное использование памяти блоков. Например, блок размером 4.5КБ будет использовать 8КБ памяти с jemalloc. Это может уменьшить использование памяти и потенциально уменьшить производительность. Увеличьте размер блочного кэша, если вы заметили это после обновления.
  • Добавлен параметр BackupEngineImpl.options_.max_background_operations для указания максимального числа параллельных операций. Добавлена поддержка параллельного резервного копирования и восстановления.
  • Добавлен метод DB::SyncWAL(), который выполняет синхронизацию WAL без блокировки писателей.

Версия 3.11.0 (2015-05-19)

Новые возможности

  • Добавлен новый метод API Cache::SetCapacity(size_t capacity) для динамического изменения максимально настроенной емкости кэша. Если новая емкость меньше текущего использования кэша, реализация попытается уменьшить использование путем вытеснения необходимого числа элементов в строгом порядке LRU.
  • Добавлен экспериментальный метод для работы с устройствами flashcache (черный список фоновых потоков для кэширования их чтений) -- NewFlashcacheAwareEnv.
  • Если используется универсальное компактирование и options.num_levels > 1, файлы компактирования пытаются храниться вне L0 с меньшим размером файлов на основе options.target_file_size_base. Ограничение размера базы данных при использовании универсального компактирования значительно снижено за счет использования большего числа уровней. Вы можете установить num_levels = 1, чтобы сделать универсальное компактирование таким же, как раньше. Если вы установите num_levels > 1 и хотите вернуться к предыдущей версии, вам потребуется компактировать все файлы в большой файл на уровне 0 (установив target_file_size_base большим и выполнив CompactRange(<cf_handle>, nullptr, nullptr, true, 0)), затем перезапустить базу данных с тем же номером версии для перезаписи манифеста, и только потом открыть его с помощью предыдущих версий.
  • Более подробная информация о фоновых потоках rocksdb доступна в Env::GetThreadList(), включая количество прочитанных / записанных байтов задачей компактирования, размер mem-table и текущее количество записанных байтов задачей флеша и многое другое. Подробнее см. include/rocksdb/thread_status.h.### Изменения в общественном API
  • Добавлен метод TablePropertiesCollector::AddUserKey() для замены TablePropertiesCollector::Add(). Метод AddUserKey() предоставляет тип ключа, номер последовательности и размер файла пользователям.
  • Параметр DBOptions::bytes_per_sync использовался для обоих WAL и таблицных файлов. С версии 3.11 он применим только к таблицным файлам. Если вы хотите использовать этот параметр для синхронизации WAL в фоновом режиме, пожалуйста, используйте wal_bytes_per_sync.

3.10.0 (2015-03-24)

Новые возможности

  • Метод GetThreadStatus() теперь может отображать подробный статус потока, включая:
  • Операцию потока, в том числе очистку и компактацию.
  • Этап текущей операции потока.
  • Время в микросекундах с момента начала текущей операции потока. Дополнительная информация доступна в include/rocksdb/thread_status.h. Кроме того, при запуске db_bench с параметром --thread_status_per_interval, db_bench также будет периодически отображать статус потока.
  • Изменено LRU алгоритм кэширования так, чтобы ссылаемые блоки (через итераторы) никогда не выгонялись. Это изменение сделало параметр removeScanCountLimit устаревшим. Поскольку этого, NewLRUCache больше не принимает три аргумента. Также удален параметр table_cache_remove_scan_limit.
  • По умолчанию мы теперь оптимизируем сборку для платформы сборки (используя -march=native). Если вам требуется создание переносимого бинарника, используйте 'PORTABLE=1' перед командой make.
  • Теперь разрешается использование уровня-компактации для помещения файлов в различные пути путём указания их в db_paths вместе с целевым размером. Номера уровней с меньшими номерами будут помещены раньше в db_paths, а номера уровней с большими номерами — позже.
  • Возможные значительные улучшения производительности, если вы используете RocksDB с большим количеством семейств столбцов (100-1000).
  • Добавлен параметр BlockBasedTableOptions.format_version, который позволяет пользователю указывать версию блочной таблицы, которую он хочет использовать. Как общее руководство, новые версии имеют больше возможностей, но могут быть недоступны для старых версий RocksDB.
  • Добавлена новая версия блочной таблицы (версия OnClickListener 2), которую можно активировать, установив BlockBasedTableOptions.format_version = 2. Эта версия изменяет способ кодирования информации о размерах в сжатых блоках и должна помочь с распределением памяти, если вы используете сжатие Zlib или BZip2.
  • Объект MemEnv (окружение, которое хранит данные в памяти) теперь доступен в базовой библиотеке. Его можно создать вызовом NewMemEnv().
  • Добавлен метод SliceTransform.SameResultWhenAppended() для помощи пользователям в определении безопасности применения префикса bloom/hash.
  • Блочная таблица теперь использует префиксный bloom-фильтр, если это полный фильтр.
  • Блочная таблица запоминает, поддерживаются ли полные ключи или префиксные bloom-фильтры в файлах SST. Выполняется проверка целостности при чтении файла с конфигурацией пользователя.
  • Устранён баг в ReadOnlyBackupEngine, который случайно удалял поврежденные резервные копии, даже когда окружение было ReadOnly.
  • Параметр options.level_compaction_dynamic_level_bytes, позволяющий RocksDB автоматически регулировать максимальное количество байтов для каждого уровня. Цель этой функции — иметь нижнюю границу увеличения объема данных. Подробнее см. комментарии в options.h.
  • Добавлен абстрактный базовый класс WriteBatchBase для записей в партии.
  • Устранён баг, при котором начиналась удаление файлов семейства столбцов после его удаления, даже если существуют живые ссылки на него.

Изменения в общественном API

  • Устарели параметры skip_log_error_on_recovery и table_cache_remove_scan_count_limit.
  • Метод logger.logv с параметром уровня логгирования стал виртуальным.

RocksJava

  • Добавлен API для сжатия на уровне.
  • MemEnv теперь доступен в RocksJava через класс RocksMemEnv.
  • Сжатие LZ4 теперь включено в статическую библиотеку rocksjava при выполнении make rocksdbjavastatic.
  • Превышение размера size_t при установке параметров rocksdb теперь генерирует IllegalArgumentException, что устраняет необходимость явной обработки этих исключений разработчиком.

3.9.0 (2014-12-08)

Новые возможности

  • Добавлен rocksdb::GetThreadList(), который в будущем вернет текущий статус всех связанных с rocksdb потоков. Мы будем добавлять больше инструментов мониторинга в следующих версиях RocksDB.
  • Изменен конвертировочный метод в rocksdb/utilities/convenience.h для возврата объекта Status вместо булева значения. Также добавлена поддержка вложенных опций в методе конвертации.

Изменения в общественном API

  • Добавлен новый API для создания точки контроля. При предоставлении имени директории создается новая база данных, являющаяся образом существующей базы данных.
  • Добавлен новый метод LinkFile в Env. Если вы реализуете свой собственный класс Env, вам придется предоставить реализацию метода LinkFile.
  • MemTableRep теперь принимает MemTableAllocator вместо Arena.

Улучшения

  • Библиотека RocksDBLite стала меньше и будет собрана с флагом -fno-exceptions.

3.8.0 (2014-11-14)

Изменения в общественном API

  • Метод BackupEngine::NewBackupEngine() был устаревшим; пожалуйста, используйте BackupEngine::Open() отныне.
  • BackupableDB/RollbackBackupableDB имеют новые методы GarbageCollect(), которые очистят файлы от поврежденных и устаревших резервных копий.
  • BackupableDB/RollbackBackupableDB имеют новые методы GetCorruptedBackups(), которые перечисляют поврежденные резервные копии.

Чистка кода

  • Большое количество чистки кода, некоторые дополнительные предупреждения включены (-Wshadow, -Wshorten-64-to-32, -Wnon-virtual-dtor).

Новые возможности

  • CompactFiles и EventListener, хотя они все еще находятся в экспериментальном состоянии.
  • Полная поддержка семейств столбцов в RocksJava.## Версия 3.7.0 (2014-11-06)

Изменения в общественном API

  • Введен API SetOptions() для изменения части опций динамически онлайн.
  • Введены четыре новых удобных метода для конвертации опций из строки: GetColumnFamilyOptionsFromMap(), GetColumnFamilyOptionsFromString(), GetDBOptionsFromMap(), GetDBOptionsFromString().
  • Удалены перегрузки методов Delete() и WriteBatchWithIndex с использованием SliceParts.
  • При открытии базы данных, если значение options.max_background_compactions больше существующего низкого приоритетного пула options.env, то он будет увеличен. Аналогично, если значение options.max_background_flushes больше существующего высокого приоритетного пула options.env, то он также будет увеличен.

Версия 3.6.0 (2014-10-07)

Изменения в формате диска

  • Если вы используете RocksDB на платформах ARM и используете стандартный Bloom-фильтр, есть изменения в формате диска, о которых следует знать. Для перехода на новую версию необходимо выполнить три шага: 1. Отключите политику фильтрации, 2. Скомпактируйте всю базу данных, 3. Включите политику фильтрации.

Изменения поведения

  • Мы рефакторили нашу систему замедления записи. Значения статистики, связанные с замедлением, изменились. Вместо счетчиков замедления на каждую запись, мы теперь считаем замедления за эпохи, где эпоха — это период между сбросами и компакциями. Больше информации можно найти в нашем Гайде по настройке производительности, как только будет выпущена RocksDB 3.6.
  • Когда disable_data_sync=true, мы больше не синхронизируем файл MANIFEST.
  • Добавлен параметр identity_as_first_hash для CuckooTable. SST файл должен быть перестроен для корректного открытия читателем.

Изменения в общественном API

  • Тип параметра target_file_size_base изменен на uint64_t с int.
  • Удален параметр allow_thread_local. Эта функция была доказана стабильной, поэтому она всегда включена.

Версия 3.5.0 (2014-09-03)

Новые возможности

  • Добавлен include/utilities/write_batch_with_index.h, предоставляющий утилиту для запроса данных из WriteBatch при его построении.
  • Перемещены опции, связанные с BlockBasedTable, из Options в BlockBasedTableOptions. Изменен соответствующий интерфейс JNI. Влияющие опции включают: no_block_cache, block_cache, block_cache_compressed, block_size, block_size_deviation, block_restart_interval, filter_policy, whole_key_filtering. filter_policy изменен на shared_ptr с обычного указателя.
  • Удалены устаревшие опции: disable_seek_compaction и db_stats_log_interval.
  • Оптимизация для точечного поиска теперь принимает один параметр для размера кеша блока. Он теперь строит хэш-индекс, Bloom-фильтр и кеш блока.

Изменения в общественном API

  • Префиксный извлечение, используемый с V2 фильтрами компактации, теперь передает пользовательский ключ в SliceTransform::Transform вместо необработанного ключа RocksDB.

Версия 3.4.0 (2014-08-18)

Новые возможности

  • Поддержка нескольких путей баз данных в универсальных стилевых компактациях.
  • Добавлена возможность хранения простого индекса и Bloom-фильтра в SST файле.
  • CompactRange() больше не будет выводить скомпактированные файлы на уровень 0. Это было так, когда все входящие файлы компактации были на уровне 0.
  • Добавлен параметр iterate_upper_bound для определения до какой степени будет возвращаться записей передний итератор. Это предотвратит прохождение через маркеры удаления и перезаписанные записи в случаях, когда вы хотите прервать итератор. Это может улучшить производительность, если есть большое количество маркеров удаления или перезаписанных записей.

Изменения в общественном API

  • DBOptions.db_paths теперь является вектором структур DBPath, которая указывает как путь, так и целевой размер.
  • NewPlainTableFactory теперь принимает PlainTableOptions, определенные в include/rocksdb/table.h.
  • Перемещены include/utilities/*.h в include/rocksdb/utilities/*.h.
  • API статистики теперь используют тип uint32_t вместо Tickers. Также сделаны два доступных метода getTickerCount и histogramData константными.
  • Добавлено свойство базы данных rocksdb.estimate-num-keys, оценивающее число живых ключей в базе данных.
  • Добавлен метод DB::GetIntProperty(), который возвращает свойства базы данных, которые являются целыми числами, как uint64_t.
  • Префиксный извлечение, используемый с V2 фильтрами компактации, теперь передает пользовательский ключ в SliceTransform::Transform вместо необработанного ключа RocksDB.

Версия 3.3.0 (2014-07-10)

Новые возможности

  • Добавлен прототип JSON API.
  • Хэш-связный список снижает производительность за счет аномалий, вызванных скошенными корзинами, путем переключения данных в корзине с связного списка на пропускной список. Добавлена параметризация порогового значения threshold_use_skiplist в конструкторе NewHashLinkListRepFactory().
  • RocksDB теперь может более эффективно освобождать пространство хранения во время процесса компактации. Это достигается путем компенсации размера каждого удаленного элемента двукратным средним значением размера, что делает компактацию более легко запускаемой благодаря удаленным элементам.
  • Добавлено API для установки времени ожидания записи. Теперь WriteOptions имеют переменную timeout_hint_us. Установив timeout_hint_us в ненулевое значение, любую запись, связанную с этим timeout_hint_us, можно будет прервать, если она выполняется дольше указанного времени ожидания. Гарантировано, что любая запись, завершившаяся раньше указанного времени ожидания, не будет прервана из-за условия времени ожидания.
  • Добавлен параметр ограничения скорости, который контролирует общую пропускную способность для операций очистки и компактации. Пропускная способность указывается в байтах/секунду. При ограниченной доступной полосе пропускания операции очистки всегда имеют приоритет перед операциями компактации.

Изменения публичного API

  • Удалён NewTotalOrderPlainTableFactory, так как он не используется и реализован некорректно семантически.

Версия 3.2.0 (2014-06-20)## 3.3.0 (2014-07-10)

Новые возможности

  • Добавлен прототип JSON API.
  • Хэш-связный список снижает производительность за счет аномалий, вызванных скошенными корзинами, путем переключения данных в корзине с связного списка на пропускной список. Добавлена параметризация порогового значения threshold_use_skiplist в конструкторе NewHashLinkListRepFactory().
  • RocksDB теперь может более эффективно освобождать пространство хранения во время процесса компактации. Это достигается путем компенсации размера каждого удаленного элемента двукратным средним значением размера, что делает компактацию более легко запускаемой благодаря удаленными элементам.
  • Добавлено API для установки времени ожидания записи. Теперь WriteOptions имеют переменную timeout_hint_us. Установив timeout_hint_us в ненулевое значение, любую запись, связанную с этим timeout_hint_us, можно будет прервать, если она выполняется дольше указанного времени ожидания. Гарантировано, что любая запись, завершившаяся раньше указанного времени ожидания, не будет прервана из-за условия времени ожидания.
  • Добавлен параметр ограничения скорости, который контролирует общую пропускную способность для операций очистки и компактации. Пропускная способность указывается в байтах/секунду. При ограниченной доступной полосе пропускания операции очистки всегда имеют приоритет перед операциями компактации.

Изменения публичного API

  • Удалён NewTotalOrderPlainTableFactory, так как он не используется и реализован некорректно семантически.

3.2.0 (2014-06-20)

Изменения публичного API

  • Концепция seek-compaction была удалена из RocksDB по следующим причинам:
  1. Она больше подходит для рабочих нагрузок на жесткие диски, тогда как RocksDB предназначен главным образом для флеш-памяти и оперативной памяти,
  2. Она добавила некоторую сложность важным путям выполнения кода,
  3. Ни один из наших внутренних клиентов не использовал её. По этой причине параметр Options::disable_seek_compaction стал устаревшим. Он всё ещё является параметром в Options, поэтому сборка не ломается, но этот параметр уже не имеет эффекта. Мы планируем полностью удалить его в будущем, поэтому просим пользователей удалить этот параметр из своего кода.
  • Добавлены два параметра для NewHashLinkListRepFactory() для логирования слишком большого количества записей в хэш-корзине при очистке.
  • Добавлен новый параметр BlockBasedTableOptions::hash_index_allow_collision. Когда он активирован, префиксный хэш-индекс для блочной таблицы не будет хранить префиксы и позволит коллизиям хэша, что снижает потребление памяти.

Новые возможности

  • PlainTable теперь поддерживает новое ключевое кодирование: для ключей одного префикса префикс пишется только один раз. Оно может быть включено через параметр encoding_type в NewPlainTableFactory()
  • Добавлен адаптивный TableFactory, используемый для перехода от базы данных с PlainTable к BlockBasedTable, или наоборот. Он может быть создан с помощью NewAdaptiveTableFactory

Улучшение производительности

  • Реализован повторный итератор Tailing Iterator с использованием ForwardIterator + Cascading Search Hint, что привело к увеличению пропускной способности примерно на 20%.

3.1.0 (2014-05-21)

Изменения публичного API

  • Заменены ColumnFamilyOptions::table_properties_collectors на ColumnFamilyOptions::table_properties_collector_factories## 3.3.0 (2014-07-10)

Новые возможности

  • Добавлен прототип JSON API.
  • Хэш-связный список снижает производительность за счет аномалий, вызванных скошенными корзинами, путем переключения данных в корзине с связного списка на пропускной список. Добавлена параметризация порогового значения threshold_use_skiplist в конструкторе NewHashLinkListRepFactory().
  • RocksDB теперь может более эффективно освобождать пространство хранения во время процесса компактации. Это достигается путем компенсации размера каждого удаленного элемента двукратным средним значением размера, что делает компактацию более легко запускаемой благодаря удаленным элементам.
  • Добавлено API для установки времени ожидания записи. Теперь WriteOptions имеют переменную timeout_hint_us. Установив timeout_hint_us в ненулевое значение, любую запись, связанную с этим timeout_hint_us, можно будет прервать, если она выполняется дольше указанного времени ожидания. Гарантировано, что любая запись, завершившаяся раньше указанного времени ожидания, не будет прервана из-за условия времени ожидания.
  • Добавлен параметр ограничения скорости, который контролирует общую пропускную способность для операций очистки и компактации. Пропускная способность указывается в байтах/секунду. При ограниченной доступной полосе пропускания операции очистки всегда имеют приоритет перед операциями компактации.

Изменения публичного API

  • Удалён NewTotalOrderPlainTableFactory, так как он не используется и реализован некорректно семантически.

3.2.0 (2014-06-20)

Изменения публичного API

  • Концепция seek-compaction была удалена из RocksDB по следующим причинам:
  1. Она больше подходит для рабочих нагрузок на жесткие диски, тогда как RocksDB предназначен главным образом для флеш-памяти и оперативной памяти,
  2. Она добавила некоторую сложность важным путям выполнения кода,
  3. Ни один из наших внутренних клиентов не использовал её. По этой причине параметр Options::disable_seek_compaction стал устаревшим. Он всё ещё является параметром в Options, поэтому сборка не ломается, но этот параметр уже не имеет эффекта. Мы планируем полностью удалить его в будущем, поэтому просим пользователей удалить этот параметр из своего кода.
  • Добавлены два параметра для NewHashLinkListRepFactory() для логирования слишком большого количества записей в хэш-корзине при очистке.
  • Добавлен новый параметр BlockBasedTableOptions::hash_index_allow_collision. Когда он активирован, префиксный хэш-индекс для блочной таблицы не будет хранить префиксы и позволит коллизиям хэша, что снижает потребление памяти.

Новые возможности

  • PlainTable теперь поддерживает новое ключевое кодирование: для ключей одного префикса префикс пишется только один раз. Оно может быть включено через параметр encoding_type в NewPlainTableFactory()
  • Добавлен адаптивный TableFactory, используемый для перехода от базы данных с PlainTable к BlockBasedTable, или наоборот. Он может быть создан с помощью NewAdaptiveTableFactory()

Улучшение производительности

  • Реализован повторный итератор Tailing Iterator с использованием ForwardIterator + Cascading Search Hint, что привело к увеличению пропускной способности примерно на 20%.

3.1.0 (2014-05-21)

Изменения публичного API

  • Заменены ColumnFamilyOptions::table_properties_collectors на ColumnFamilyOptions::table_properties_collector_factories

Новые возможности

  • Хэш-индекс для блочной таблицы теперь создается и восстанавливается более эффективно. Ранее хэш-индекс строился сканированием всего файла при каждом открытии таблицы.
  • FIFO стиль компактации

3.0.0 (2014-05-05)

Изменения публичного API

  • Добавлены _LEVEL ко всем перечислениям типа InfoLogLevel
  • Устарели параметры ReadOptions.prefix и ReadOptions.prefix_seek. По умолчанию метод Seek() теперь использует префиксное поиск, когда предоставляется Options.prefix_extractor. Подробнее см. https://github.com/facebook/rocksdb/wiki/Prefix-Seek-API-Changes
  • В метод MemTableRepFactory::CreateMemTableRep() добавлен параметр информационного логгера.

Новые возможности

  • Поддержка семейств столбцов
  • Добавлен параметр для использования различных функций контроля целостности в BlockBasedTableOptions
  • Добавлен метод ApplyToAllCacheEntries() для кэша

2.8.0 (2014-04-04)

  • Удален заголовочный файл arena.h из публичных заголовочных файлов.
  • По умолчанию проверка контроля целостности осуществляется при каждом чтении из базы данных.
  • Изменены значения нескольких параметров по умолчанию, включая: paranoid_checks=true, max_open_files=5000, level0_slowdown_writes_trigger=20, level0_stop_writes_trigger=24, disable_seek_compaction=true, max_background_flushes=1 и allow_mmap_writes=false.
  • Добавлен параметр is_manual_compaction в контекст CompactionFilter.
  • Добавлен метод virtual void WaitForJoin() в класс Env. По умолчанию это просто пустая операция.
  • Удален метод BackupEngine::DeleteBackupsNewerThan().
  • Добавлен параметр --verify_checksums_in_compaction.
  • Изменен тип Options.prefix_extractor с указателя на shared_ptr (владение объектом). Изменены конструкторы HashSkipListRepFactory и HashLinkListRepFactory для того, чтобы они не принимали объект SliceTransform (неявное использование Options.prefix_extractor).
  • Добавлен метод Env::GetThreadPoolQueueLen(), который возвращает длину очереди ожидающих потоков пула.
  • Добавлен командный режим checkconsistency в инструменте ldb, который проверяет соответствие состояния файловой системы состоянию базы данных (существование файлов и их размеры).
  • Разделены параметры, относящиеся к блочной таблице, на новый структурный тип BlockBasedTableOptions.
  • Класс WriteBatch получил новый метод Count(), который возвращает общую величину в партии, и метод Data() теперь возвращает ссылку вместо копии.
  • Добавлены дополнительные счетчики в контексте производительности.
  • Поддерживается несколько новых свойств базы данных: compaction-pending, background-errors и cur-size-active-mem-table.### Новые возможности
  • Если мы найдём одну обрезанную запись в конце файла MANIFEST или WAL, мы её игнорируем. Предполагаем, что записи были прерваны и что мы можем безопасно игнорировать эту запись.
  • Добавлен новый формат SST "PlainTable", оптимизированный для работы только в оперативной памяти. Его можно создать через NewPlainTableFactory() или NewTotalOrderPlainTableFactory().
  • Добавлен новый реализация мем-таблицы "хэш-связный список", оптимизированная для случаев, когда есть только немного ключей для каждого префикса, которую можно создать через NewHashLinkListRepFactory().
  • Объединённый оператор поддерживает новую функцию PartialMergeMulti(), которая позволяет пользователям выполнять частичные объединения против нескольких операндов.
  • Теперь фильтр компактации имеет интерфейс версии 2. Он буферизирует пары ключ-значение, имеющие тот же префикс ключа, обрабатывает их партиями и возвращает партийные результаты обратно в базу данных. Новый интерфейс использует структуру CompactionFilterContext для того же назначения, что и CompactionFilter::Context в версии 1.
  • Поддержка географических данных для местоположений и радиального поиска.

2.7.0 (2014-01-28)

Изменения публичного API

  • Переименован метод StackableDB::GetRawDB() в StackableDB::GetBaseDB().
  • Переименован метод WriteBatch::Data() в const std::string& Data() const.
  • Переименован класс TableStats в TableProperties.
  • Удалён класс PrefixHashRepFactory. Пожалуйста, используйте NewHashSkipListRepFactory() вместо него.
  • Поддержана многопоточная работа методов EnableFileDeletions() и DisableFileDeletions().
  • Добавлен метод DB::GetOptions().
  • Добавлен метод DB::GetDbIdentity().

Новые возможности

  • Добавлен класс BackupableDB (https://github.com/facebook/rocksdb/wiki/How-to-backup-RocksDB?).
  • Реализован специальный тип итератора TailingIterator (https://github.com/facebook/rocksdb/wiki/Tailing-Iterator), который не создаёт снимок (может использоваться для чтения недавно вставленных данных) и оптимизирован для последовательного чтения.
  • Добавлен блок свойств для таблицы, который позволяет (1) таблице хранить свои метаданные и (2) конечному пользователю собирать и хранить интересующие его свойства.
  • Включено кэширование индексных и фильтрующих блоков в блочном кэше (деактивировано по умолчанию).
  • Поддержана отчётность ошибок при выполнении ручной компактации.
  • Поддержана дополнительная платформа Linux и MacOS.
  • Метод Put с параметрами SliceParts — вариант Put(), который собирает выходные данные аналогично writev(2).

Улучшение производительности

  • Большие улучшения производительности тестовых сценариев. Например, увеличение QPS для только чтения до около 530К в выпуске 2.6 до 1.1 миллиона в 2.7 [1].
  • Ускорение удаления устаревших файлов RocksDB — теперь нет необходимости перебирать весь каталог под блокировкой — уменьшение p99.
  • Использование обычного указателя вместо shared_ptr для статистики: [5b825d] — огромное увеличение производительности — shared_ptr медленные.
  • Оптимизация блокировки для Get() — [1fdb3f] — увеличение QPS на 1.5 раза для некоторых нагрузок.
  • Ускорение кэширования — [e8d40c3].
  • Реализация автовекторизации, которая выделяет первые N элементов на стеке. Большинство векторов в RocksDB маленькие. Также, никогда не хотим выделять объекты в куче, держа блокировку. — [c01676e4].
  • Много усилий направлено на перемещение malloc, memcpy и IO вне блокировок.

Опубликовать ( 0 )

Вы можете оставить комментарий после Вход в систему

1
https://api.gitlife.ru/oschina-mirror/cocalele-rocksdb.git
git@api.gitlife.ru:oschina-mirror/cocalele-rocksdb.git
oschina-mirror
cocalele-rocksdb
cocalele-rocksdb
pureflash-aof-v8.10