Выпуск высокопроизводительной встраиваемой СУБД libmdbx 0.10.4 и libfpta 0.3.9

Состоялся выпуск библиотек libmdbx 0.10.4 (MDBX) с реализацией высокопроизводительной компактной встраиваемой базы данных класса ключ-значение, и связанной библиотеки libfpta 0.3.9 (FPTA), реализующей поверх MDBX табличное представление данных с вторичными и составными индексами. Обе библиотеки распространяются под лицензиями одобренными OSI. Поддерживаются все актуальные операционные системы и архитектуры, включая российский Эльбрус.

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

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

Для libmdbx предлагается C++ API, а также поддерживаемые энтузиастками привязки к языкам Rust, Haskell, Python, NodeJS, Ruby, Go, Nim. Для libfpta публично доступно только описание API в виде заголовочного файла C/C++.

Основные новшества, доработки и исправления, добавленные после предыдущей новости от 9 мая:

  • Обеспечена возможность воспроизводимых сборок.
  • Устранена ошибка, из-за которой при очень редком стечении обстоятельств в ходе фиксации транзакции могло происходить зацикливание/зависание. Проблема выявлена специалистами Positive Tecnologies при внутреннем тестировании собственных продуктов.
  • Доработаны тесты и расширены тестовые сценарии для проверки всех достижимых не изоморфных состояний дерева страниц и содержимого GC внутри БД.
  • В C++ API исправлен лишний “noexcept”, добавлены дополнительные перегрузки для метода “cursor::erase()”, реализация буферов избавлена от использования “std::string” для обеспечения выравнивания (актуально для CLANG libstdc++).
  • Устранён регресс в алгоритме спиллинга грязных страниц (избирательное вытеснение изменённых страниц БД) проявлявшейся редкой неожиданной ошибкой MDBX_PROBLEM при изменении данных в огромных транзакциях.
  • Проведена проверка фазингом с добавлением ряда проверок для обеспечения стабильности при намеренном повреждении БД.
  • Устранены незначительные предупреждения UndefinedBehaviorSanitizer и Coverity Scan issues.
  • Исправлена проверка устаревшего и уже неиспользуемого внутреннего флага “P_DIRTY” во вложенных страницах внутри образов БД созданных старыми версиями библиотеки.
  • В скриптах CMake доработан поиск компонентов компилятора необходимых для LTO (link-time optimization).
  • Максимальное кол-во одновременных читателей увеличено до 32767.
  • Ускорена работа при использовании Valgrind и AddressSanitizer.
  • На Windows устранено рекурсивное использование SRW-lock при работе в режиме MDBX_NOTLS (без использования thread local storage), исправлена генерация bootid в случае изменении системного времени, доработано детектирование WSL1 и WSL2, добавлена возможность открытия БД на Plan 9 смонтированной посредством DrvFS.
  • Суммарно внесено более 160 изменений в 57 файлов, добавлено ~5000 строк, удалено ~2500.

Отдельно хочется поблагодарить команду проекта Erigon (экосистема Ethereum) за помощь в тестировании в экстремальных сценариях использования. Показательно, что за пять месяцев с момента выхода libmdbx v0.10.0, при объёме БД 1-2 Тб в каждой инсталляции Erigon, от пользователей поступило только три сообщения о повреждении БД, которые произошли из-за внешних причин: в двух случаях причиной были сбои ОЗУ, в третьем ошибка обнуления данных в специфической конфигурации подсистемы хранения с использованием BTRFS.

Release. Ссылка here.