Опубликован выпуск библиотеки libmdbx 0.13.3 (MDBX) с реализацией высокопроизводительной компактной встраиваемой базы данных класса ключ-значение. Код libmdbx распространяется под лицензией Apache 2.0. Поддерживаются все актуальные операционные системы и архитектуры, а также российский Эльбрус 2000. Для libmdbx предлагается развитое API для C++, а также поддерживаемые энтузиастами привязки к языкам Rust, Haskell, Python, NodeJS, Ruby, Go, Nim, Deno, Scala. Из проектов, использующих libmdbx, можно отметить Erigon и Reth, а также разработки компаний StarkWare и Positive Technologies.
Исторически libmdbx является глубокой переработкой СУБД LMDB и превосходит своего прародителя по надёжности, набору возможностей и производительности. В сравнении с LMDB, в libmdbx большое внимание уделяется качеству кода, стабильной работе API, тестированию и автоматическим проверкам. Поставляется утилита проверки целостности структуры БД с некоторыми возможностями восстановления. Технологически libmdbx предлагает ACID, строгую сериализацию изменений и неблокирующее чтение с линейным масштабированием по ядрам ЦПУ. Поддерживается автокомпактификация, автоматическое управление размером БД, оценка объёма выборок по диапазонам (range query estimation).
Основные изменения:
- Ветка 0.13.x получила статус стабильной. Началась разработка ветки 0.14.x.
- В C API добавлена функция mdbx_cursor_count_ex(), позволяющая получить как количество мульти-значений соответствующих текущему ключу, так и информацию о вложенном дереве, хранящем эти значения.
- В C++ API добавлен метод mdbx::txn::make_broken() аналогичный mdbx_txn_break().
- В утилитах mdbx_copy, mdbx_drop, mdbx_dump, mdbx_load, mdbx_stat реализовано логирование ошибок, предупреждений и важных сообщений от libmdbx.
- Изменение поведения:
- При включении профилирования сборщика мусора (сборка с опцией MDBX_ENABLE_PROFGC=ON) теперь подсчитываются затраты времени CPU на слияние списков страниц, т.е. на работу функции pnl_merge().
- В утилите тестирования значение режима данных переименовано из data.dups в data.multi.
- Доработан контроль длины ключа внутри cursor_seek().
- Если посредством mdbx_env_set_option(MDBX_opt_txn_dp_limit) пользователем не задано собственно значение, то выполняется подстройка dirty-pages-limit при старте каждой не вложенной пишущей транзакций, исходя из объёма доступного ОЗУ и размера БД.
- В режиме MDBX_NOSTICKYTHREADS допускается commit/abort вложенных транзакций из любого треда/потока.
- При попытке запуска вложенных транзакций в режиме MDBX_WRITEMAP производится логирование и возврат ошибки MDBX_INCOMPATIBLE.
- В C++ API в конструкторах/инициализаторах и методах, связанных с формированием геометрии БД, по умолчанию используются только default-значения.
- Внутри mdbx_env_set_geometry() доработаны эвристики для подбора параметров геометрии БД запрошенных пользователем "по умолчанию".
- Исправления:
- Устранён регресс неразблокировки мьютекса при попытки повторного закрытия dbi-дескриптора, в том числе при попытке явно закрыть дескриптор после удаления связанной с ним таблицы.
- Устранён регресс состояния вложенного/dupsort курсора после вставки данных в MDBX_APPEND-режиме.
- Поддержка получения boot_id при работе внутри LXC-контейнера.
- Устранёна ошибка неверной обработки попытки запуска вложенной читающей транзакции. Теперь в таких ситуациях возвращается ошибка MDBX_EINVAL, так как вложенность поддерживается только для транзакций чтения-записи.
- Устранён SIGSEGV-регресс обращения к нулевому адресу при работе в режиме только-чтение без использования LCK-файла, например при размещении БД на носителе доступном только для чтения.
|