Выпуск встраиваемой СУБД libmdbx 0.13
Опубликован выпуск библиотеки libmdbx 0.13.1 (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).
Основные изменения:
- Изменение лицензии на код с OpenLDAP Public License на Apache 2.0.
- Расширение API курсоров более удобными и очевидными операциями позиционирования по аналогии условиям ‹, ‹=, ==, ›=, › как для ключей, так и для пар ключ-значение. Добавлены функции mdbx_cursor_unbind(), и mdbx_txn_release_all_cursors() для гибкого управления курсорами в сценариях повторного использования для уменьшения накладных расходов. Функции mdbx_cursor_scan() и mdbx_cursor_scan_from() для сканирования таблиц с использованием функционального предиката и уменьшением сопутствующих накладных расходов.
- Переработка курсоров для унификации поведения, более регулярного кода, уменьшения количества ветвлений и машинных операций.
- Перенос функциональности утилиты mdbx_chk внутрь библиотеки в виде функции mdbx_env_chk() для проверка целостности структуры БД, в том числе с вовлечением логики приложения.
- Опция MDBX_opt_gc_time_limit для более гибкого контроля времени расходуемого на поиск последовательностей соседствующих свободных страниц в GC.
- Существенное снижение накладных расходов на запуск транзакций в сценариях с большим количеством DBI-хендов, за счёт отложенной/ленивой инициализации элементов служебных таблиц. В том числе, механизм поддержки разрежённых наборов DBI-хендов, управляемый опцией сборки MDBX_ENABLE_DBI_SPARSE, которая включена по умолчанию.
- Снижение накладных расходов на открытие DBI-хендов. В том числе, механизм отложенного освобождения и поддержки быстрого пути открытия без использования блокировок, управляемый опцией сборки MDBX_ENABLE_DBI_LOCKFREE, которая включена по-умолчанию.
- Поддержка “парковки” читающих транзакций с их вытеснением ради переработки старых MVCC-снимков и предотвращения проблем вызываемых приостановкой переработки мусора. Механизм парковки и вытеснения припаркованных транзакций является как дополнением, так и более простой в использовании альтернативой обратному вызову Handle-Slow-Readers. Для удобства функции mdbx_txn_park() и mdbx_txn_unpark() имеют дополнительные аргументы, позволяющие запросить автоматическую “распарковку” припаркованных и перезапуск вытесненных транзакций. В утилиту mdbx_copy добавлены соответствующие опции -d и -p.
- Поддержка восстановления открытой среды работы с БД в дочернем процессе после ветвления/расщепления процесса посредством mdbx_env_resurrect_after_fork().
- Поддержка переименования таблиц посредством mdbx_dbi_rename() и mdbx_dbi_rename2(). Добавлена функция mdbx_enumerate_tables() для получение информации об именованных пользовательских таблицах.
- Режим работы MDBX_NOSTICKYTHREADS вместо MDBX_NOTLS для упрощения интеграции с легковесными потоками/нитями их мультиплексирования вместе с транзакциями по потокам операционной системы.
- Для идентификации БД добавлен UUID доступный в поле mi_dxbid структуры MDBX_envinfo, получаемой посредством mdbx_env_info_ex(). Реализовано получение информации о БД без её открытия посредством mdbx_preopen_snapinfo().
- Поддержка функций логирования обратного вызова без функциональности vprintf(), что существенно облегчает использование логирования в привязках к другим языкам программирования.
- Добавление в API функций mdbx_txn_copy2pathname() и mdbx_txn_copy2fd().
- Реструктуризация исходного кода с рефакторингом.
- Использование термина "таблица" вместо "subDb".
- Объявление устаревшими опций MDBX_COALESCE и MDBX_NOTLS. Замена сборочной опции MDBX_USE_VALGRIND на общепринятую ENABLE_MEMCHECK.
Источник: https://www.opennet.ru/opennews/art.shtml?num=61830