libmdbx 0.13.5 "Труба"

Леонид Юрьев обновлён 3 недели назад v0.13.5 e3324ce Релиз
4
Описание

Поддерживающий выпуск стабильной ветки с исправлением обнаруженных ошибок и устранением недочётов.

For translation to other languages please try Yandex or liar Google.

git diff' 49 files changed, 2106 insertions(+), 1135 deletions(-)

Благодарности:

  • Erigon за спонсорство.
  • Илье Михееву за сообщения о недочетах и тестирование.
  • Alex Sharov за сообщение об ошибках и тестирование.
  • maxc0d3r for bug reporting and testing.
  • Alain Picard for support Java bindings and MacOS universal binaries patch for CMake build scenario, also for bug reporting (put-MDBX_MULTIPLE regression). Big thank for assistance with debugging and testing.

Новое:

  • Добавлена опция сборки MDBX_ENABLE_NON_READ_EXPORT позволяющая использовать в режиме чтения-записи БД расположенных в файловых системах экспортированных через NFS. По-умолчанию опция выключена и при открытии в неэксклюзивном режиме чтения-записи БД расположенных файловых системах доступных извне по NFS будет возвращаться ошибка MDBX_EREMOTE. Включение опции позволяет открывать БД в описанных выше ситуациях, но риск чтения неверных данных на удалённой стороне ложится на пользователя.
  • Поддержка MacOS universal binaries при сборке посредством CMake.
  • Для закрытия или отсоединения всех курсоров с получением их количества в API добавлена функция mdbx_txn_release_all_cursors_ex().
  • Добавлена операция MDBX_SEEK_AND_GET_MULTIPLE в API курсора, позволяющая за одну операцию выполнить позиционирование курсора на конкретное значение и начать чтение multi-значений в пакетном режиме.
  • Добавлены методы mdbx::cursor::put_multiple_samelength(), mdbx::cursor::seek_multiple_samelength(), mdbx::cursor_managed::withdraw_handle().
  • В политику управления выделением для mdbx::buffer добавлен параметр inplace_storage_size_rounding. Одновременно с этим переработан внутренний union-тип mdbx::buffer::silo::bin для возможности увеличения без пенальти встроенного в экземпляр буфера места под данные.
  • В API добавлена функция mdbx_cursor_close2() возвращающая код ошибки.

Исправления:

  • Устранение лишнего/ненужного предупреждения в сценарии изменения размера БД посредством вызова mdbx_env_set_geometry() до её открытия. API предусматривает возможность запросить изменение геометрии/размера БД перед её открытием, чтобы избежать как лишних накладных расходов, так и потенциальных ошибок из-за нехватки адресного пространства. В этом сценарии ранее могло выдаваться лишнее/ненужное предупреждение о несоответствии файла БД новому размеру. Теперь этот недостаток исправлен.
  • Восстановлена доступность дескрипторов таблиц, открытых в дочерней транзакции, после её фиксации, в случае отсутствия изменений в данных. Проблема не была замечена ранее из-за специфического сценария проявления. Ошибка присутствует в версиях 0.13.x и последующих, начиная с коммита e6af7d7c53428ca2892bcbf7eec1c2acee06fd44 от 2023-11-05.
  • Устранён сбой аудита таблиц при инвалидации дескрипторов таблиц вследствие отмены вложенной транзакции. Проблема не была замечена ранее из-за специфического сценария проявления. Ошибка присутствует в версиях 0.13.x и последующих, начиная с коммита e6af7d7c53428ca2892bcbf7eec1c2acee06fd44 от 2023-11-05.
  • Устранена причина потенциальных сбоев и/и деградации производительности в сценарии закрытия курсора до завершения вложенной транзакции, с последующим изменением данных той-же таблицы в текущей вложенной транзакции, либо её дочерних транзакциях. Проблема обнаружена при ручном анализе кода, сценарии воспроизведения/проявления проблемы пока не известны. Ошибка присутствует в версиях 0.13.x и последующих, начиная с коммита 3de3d425a128a3c6f7866503f5f93b80c09dbe41 от 2024-05-19.
  • Устранена причина ложных ошибок при работе mdbx_chk с высоким уровнем логирования. Проблема возникала из-за неверной трактовки MDBX_NOTFOUND при штатном окончании итерируемых данных.
  • Устранена причина попыток рекурсивного захвата мьютекса при работе mdbx_chk -w в сборах с поддержкой Valring/ASAN и под управлением этих инструментов.
  • Устранены проверки потока владеющего транзакцией при сборке с опцией MDBX_TXN_CHECKOWNER=OFF.
  • Устранена вероятность ситуации гонки в tbl_setup(MDBX_DUPFIXED | MDBX_INTEGERDUP) при работе в разных потоках. В реальных сценариях вероятность проявления проблемы была близка к нулю. Для подробностей смотрите комментарий коммита 3e91500fac475947f5b58268d5edd3c9cc4f77f6.
  • Устранён регресс затенения курсоров во вложенных транзакциях. При реализации отложенной/ленивой инициализации dbi-дескрипторов также было реализовано отложенное затенение курсоров (создание копии состояния для отката при прерывании транзакции), что существенно уменьшало накладные расходы при старте и завершении вложенных транзакций в сценариях с большим количеством курсоров. Однако, была допущена логическая ошибка, вследствие которой отложенная инициализация и затенение выполнялись при использовании dbi-дескрипторов, но не курсора открытого в родительской транзакции. В результате, родительские курсоры во вложенных транзакциях могли не затеняться, что приводило к неконсистентному состоянию в случае прерывания/откате вложенной транзакции и в соответствующей таблицы были изменения в рамках прерванной вложенной транзакции. Проблема не реализовывалась в тестовых сценариях и не была замечена при эксплуатации, но была обнаружена при расширении тестов. Ошибка присутствует в версиях 0.13.x и последующих, начиная с коммита e6af7d7c53428ca2892bcbf7eec1c2acee06fd44 от 2023-11-05.
  • Устранён регресс в пути обработки операции MDBX_MULTIPLE. Пакетная вставка значений посредством MDBX_MULTIPLE могла приводить к падениям и повреждению структуры БД. Ошибка оставалось не замеченной из-за специфических условий проявления, которые не реализовались в тестах. Проблема присутствовала во всех выпусках начиная с v0.13.1, но соответствующая ошибка не связана с конкретным коммита в истории, а является следствием нескольких доработок (шагов рефакторинга), которые суммарно привели к регрессу. Технически ошибка обусловлена не-обнулением переменной, чего не происходило в некотором пути выполнения, так как исходно не требовалось. Однако, такое обнуление потребовалось после ряда этапов оптимизации и рефакторинга смежных участков кода. Для подробностей смотрите комментарий коммита 23a417fe19614481c6546845995d6dc845baf797.
  • Скорректировано описание ошибки MDBX_MVCC_RETARDED и текста соответствующего сообщения.
  • В C++ API добавлена упущенная проверка __cpp_concepts >= 202002 для использования концептов C++.

Изменение поведения:

  • Функция mdbx_txn_release_all_cursors() возвращает только код ошибки, не смешивая его с количеством обработанных/закрытых курсоров.
  • Использование системного кода ошибки EREMOTEIO (“Remote I/O error”) вместо ENOTBLK (“Block device required”) в качестве MDBX_EREMOTE для индикации ошибочной ситуации открытия БД расположенной на сетевом носителе.
  • Для основных вариантов использования шаблона mdbx::buffer<> теперь явно инстанцируются внутри библиотеки, одновременно соответствующие специализации шаблона помечены как external для предотвращения повторного инстанцирования в пользовательском коде.
  • Запрещена отвязка/открепление курсоров во вложенных транзакциях, т.е. вызовы mdbx_cursor_unbind() и mdbx_txn_release_all_cursors(unbind=true) для курсоров открытых в одной из родительских транзакций. Причина в том, что в случае отмены вложенной транзакции возникает неконструктивная неопределенность — следует ли восстанавливать состояние курсоров. Если не восстанавливать, то получается что вложенная транзакция может поломать родительскую, сделав её продолжение невозможным. Если восстанавливать, то также следует «воскрешать» закрытые курсоры, что неизбежно приведет к путанице, утечкам памяти и использованию после освобождения.
  • В C++ API отменён вброс исключения при запросе транзакции у отсоединённого курсора посредством вывоза mdbx::cursor::txn().

Прочие доработки:

  • Доработка использования LTO в CMake-сценариях: использование -flto=auto для GCC >= 11.4, расслабление условий для включения LTO для CLANG на Linux, расширение поиска LLVMgold.so в относительных lib-директориях.
  • Добавлены дополнительные проверки сигнатур курсоров при итерации связанных списков.
  • Кратное сокращение итераций тестов в зависимости от конфигурации Valgrind/Debug/CI.
  • Устранены предупреждения UBASN о невыравненном доступе в тесте extra/close-dbi.
  • Добавлен перехват и логирование исключений в extra-тестах на C++.
  • Расширены тесты extra/dupfix-multiple, extra/cursor-closing и extra/txn.
  • В утилиту тестирования добавлена поддержка режима/опции MDBX_VALIDATION и поддержка значений on/off для опций командной строки.
  • Добавлены doxygen-описания для doubtless-positi констант.
  • Переработана проверка курсоров на входе в API-функций с добавлением cursor_check(), cursor_reset() и cursor_drown().
  • Отключено использование C23 [[атрибутов]] для версий CLANG меньше 20.

Загрузки:


За информацией о предыдущих версиях обращайтесь к тегам git и ChangeLog.