diff --git a/ChangeLog.md b/ChangeLog.md index 3d4634e3..a8e7c46f 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -10,9 +10,33 @@ and [by Yandex](https://translated.turbopages.org/proxy_u/ru-en.en/https/libmdbx Благодарности: - - [Erigon](https://docs.erigon.tech/) за спонсорство. + - [Erigon](https://erigon.tech/) за спонсорство. - [Илье Михееву](https://t.me/IlyaMkhv) за сообщения о недочетах и тестирование. + - [Alex Sharov](https://github.com/AskAlexSharov) за сообщение об ошибках и тестирование. - [maxc0d3r](https://gitflic.ru/user/maxc0d3r) for bug reporting and testing. + - [Alain Picard](https://github.com/castortech) for support [Java bindings](https://github.com/castortech/mdbxjni) 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_READONLY_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()` возвращающая код ошибки. Исправления: @@ -39,13 +63,75 @@ and [by Yandex](https://translated.turbopages.org/proxy_u/ru-en.en/https/libmdbx - Устранена причина попыток рекурсивного захвата мьютекса при работе `mdbx_chk -w` в сборах с поддержкой Valring/ASAN и под управлением этих инструментов. - - Проверка владельца потока владеющего транзакцией только при `MDBX_TXN_CHECKOWNER=ON`. + - Устранены проверки потока владеющего транзакцией при сборке с опцией `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()` возвращает только код ошибки, не смешивая его с количеством обработанных/закрытых курсоров. Для аналогичных действий с получением количества закрытых курсоров в API добавлена функция `mdbx_txn_release_all_cursors_ex()`. + - Использование системного кода ошибки `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-positioning констант. + + - Переработана проверка курсоров на входе в API-функций с добавлением `cursor_check()`, `cursor_reset()` и `cursor_drown()`. + + - Отключено использование C23 `[[атрибутов]]` для версий CLANG меньше 20. --------------------------------------------------------------------------------