Выпуск встраиваемой СУБД Libmdbx 0.13.2

Опубликован выпуск библиотеки libmdbx 0.13.2 (MDBX) с реализацией высокопроизводительной компактной встраиваемой базы данных класса ключ-значение. Код libmdbx распространяется под лицензией Apache 2.0. Поддерживаются все актуальные операционные системы и архитектуры, а также российский Эльбрус 2000. Для libmdbx предлагается развитое API для C++, а также поддерживаемые энтузиастами привязки к языкам Rust, Haskell, Python, NodeJS, Ruby, Go, Nim, Deno, Scala.

Исторически libmdbx является глубокой переработкой СУБД LMDB и превосходит своего прародителя по надёжности, набору возможностей и производительности. В сравнении с LMDB, в libmdbx большое внимание уделяется качеству кода, стабильной работе API, тестированию и автоматическим проверкам. Поставляется утилита проверки целостности структуры БД с некоторыми возможностями восстановления. Технологически libmdbx предлагает ACID, строгую сериализацию изменений и неблокирующее чтение с линейным масштабированием по ядрам ЦПУ. Поддерживается автокомпактификация, автоматическое управление размером БД, оценка объёма выборок по диапазонам (range query estimation).

Основные изменения:

  • Ускорено обновление GC при возврате/помещении списков страниц в сложных сценариях. Доработан и активирован ранее отключённый экспериментальный режим корректирующей обратной связи. Этим принципиально улучшилась сходимость (сократилось количество повторных попыток), а также устранён дефект приводящий к “зацикливанию” при фиксации транзакций (с возвратом ошибки MDBX_PROBLEM) в редких специфических условиях.
  • В сборочных скриптах CMake включён стандарт C23.
  • Добавлены T-макросы для парных функций char/wchar_t.
  • В C++ API добавлена поддержка вложенных пишущих транзакций.
  • Выполнен переход на вторую редакцию спецификации семантического версионирования (“Semantic Versioning 2”) и обеспечен экспорт информации о версии в VERSION.json.
  • Для воспроизводимости сборок добавлена поддержка переменной окружения SOURCE_DATE_EPOCH. Поддержка MDBX_BUILD_TIMESTAMP сохранена и данная переменная имеет приоритет.
  • Добавлена возможность указывать дополнительную информацию о сборке libmdbx через опцию MDBX_BUILD_METADATA. Сейчас задаваемая информация просто включается внутрь библиотеки в качестве значения mdbx_build.metadata, а в дальнейшем также будет использоваться при формировании пакетов и т.п.
  • Добавлено логирование ошибок, возвращаемых из API. Теперь для этого достаточно задать уровень логирования MDBX_LOG_DEBUG (для логирования ошибок за вычетом MDBX_NOTFOUND) или MDBX_LOG_TRACE (для логирования всех ошибок, а также MDBX_RESULT_TRUE).
  • Изменение поведения:
    • Добавлен метод mdbx::cursor::get_multiple_samelength() и переименован mdbx::txn::put_multiple_samelength().
    • Для единообразия C++ API при выполнении операции MDBX_GET_MULTIPLE теперь также возвращается значение самого ключа.
    • Для размерных констант mdbx::env::geometry базовый тип изменён с беззнакового size_t на знаковый intptr_t.
    • Выбор в пользу использования ntdll вместо CRT теперь делается только при явном отключении C++ API.
    • Обеспечено освобождение памяти сброшенных/прерванных читающих транзакций, передаваемых в mdbx_txn_commit(). Соглашение по API требует чтобы такие транзакции освобождались посредством mdbx_txn_abort(), из-за чего функция mdbx_txn_commit() возвращала ошибку в таких случаях, не разрушая сами транзакции. Это приводило к утечкам памяти из-за ошибок в приложениях, что побудило изменить поведение.
    • Использование макроса __deprecated_enum, если он определён.
    • При сборке посредством CMake выбор стандарта языка C теперь выполняется с учётом CMAKE_C_STANDARD.
Release. Ссылка here.