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

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

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

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

  • Устранена критическая ошибка в функциональности mdbx_env_resurrect_after_fork() при использовании SysV-семафоров. Проявлялась ошибка только после порождения дочернего процесса посредством fork() на фоне выполняющейся пишущей транзакции, что приводило к неверной работе семафоров и далее к самым различным ошибкам, вплоть до повреждения БД. Проблема существовала начиная с появления mdbx_env_resurrect_after_fork() и затрагивала macOS, а также POSIX-платформы при сборке с опцией MDBX_LOCKING=5.
  • Устранена проблема в API копирования БД, проявлявшаяся на отличных от Linux системах POSIX (в основном в macOS), а также в некоторых случаях при расположении целевого файла на не-локальной файловой системе. Проблема приводила к возврату ошибки EWOULDBLOCK/EAGAIN, что обусловлено недочётом/конфликтом блокировок fcntl(F_SETLK) и flock() в ядре ОС. Переработана обработка ошибок захвата файловых блокировок в API копирования на системах POSIX.
  • Устранена ошибка, приводившая к неожиданному возврату MDBX_BAD_DBI при одновременном старте нескольких транзакций внутри одного процесса после открытия БД.
  • Устранена ошибка, приводившая к неожиданному возврату MDBX_DBS_FULL при повторном открытии уже открытых таблиц и уже достигнутом лимите открытых DBI-дескрипторов.
  • Исправлена ошибка сборки для платформы Android при явном определении _FILE_OFFSET_BITS.
  • Исправлена ошибка использования ENOMEM вместо MDBX_ENOMEM. Что могло ломать сборку на не-POSIX/Windows платформах, в зависимости от конфигурации и/или версии SDK.
  • Поправлено либо удалено несколько неверных assert-проверок, из-за которых происходили падения отладочных сборок в специфических ситуациях. Главным образом, в коде функций txn_end(), txn_lock() и txn_unlock() как на Windows, так и на POSIX.
  • Устранены несущественные предупреждения MSVC. Отключены предупреждения C5286 и C5287.
  • Доработана логика отказа от использования OFD-блокировок на POSIX-платформах. Теперь кроме EINVAL учитываются дополнительные коды ошибок (ENOSYS, ENOIMPL, ENOTSUP, ENOSUPP, EOPNOTSUPP), что позволит работать собранной библиотеке в некоторых случаях, когда актуальное ядро/контейнер/эмулятор не поддерживает требуемых системных вызовов.
  • В тестовый фреймворк добавлена поддержка опции “–numa ” для привязки стохастического теста к NUMA-узлу. В battery/tmux-скрипте добавлено явное распределение по NUMA-узлам, что существенно увеличило КПД при тестировании на NUMA-машинах.
  • В стохастическом скрипте реализован случайный порядок запуска отдельных тестов.
Release. Ссылка here.