diff --git a/ChangeLog.md b/ChangeLog.md index 02007336..141b0b65 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -11,7 +11,8 @@ and [by Yandex](https://translated.turbopages.org/proxy_u/ru-en.en/https/libmdbx Благодарности: - [Erigon](https://docs.erigon.tech/) за спонсорство. - - [Alain Picard](https://github.com/castortech) for support [Java bindings](https://github.com/castortech/mdbxjni) and MacOS universal binaries patch for CMake build scenario. + - [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. - [Alex Sharov](https://github.com/AskAlexSharov) за сообщение об ошибках и тестирование. - [Виктору Логунову](https://t.me/vl_username) за сообщение об опечатки в имени переменной в Conan-рецепте. - [Илье Михееву](https://t.me/IlyaMkhv) за сообщение о лишнем/ненужном предупреждении несоответствия файла БД новому размеру. @@ -32,6 +33,23 @@ and [by Yandex](https://translated.turbopages.org/proxy_u/ru-en.en/https/libmdbx - Для закрытия или отсоединения всех курсоров с получением их количества в 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` для возможности увеличения без пенальти встроенного в экземпляр буфера места под данные. + + - Добавлена опция `-c` (concise) для включения компактного режима в `mdbx_dump`, также поддержка таких дампов в `mdbx_load`. + В таких дампах значение ключей сохраняются однократно (не повторяются), что может существенно уменьшать результирующий объём для таблиц с multi-значениями (aka dupsort). + Однако, компактные дампы не совместимы с форматом ожидаемым/поддерживаемым в Berkeley Database и LMDB. + + - В API добавлена функция `mdbx_cursor_close2()` возвращающая код ошибки. + + - В chk-функционал добавлена гистограмма количества multi-значений/дубликатов. + При использовании утилиты `mdbx_chk`, для получения соответствующей (и массы другой) информации, достаточно увеличить детализацию несколько раз использовав опцию `-v`. + Изменение поведения: - Теперь при вставке данных в dupsort-таблицу CoW копирование целевых страниц выполняется после проверки отсутствия добавляемого значения среди уже присутствующих multi-значений (aka дубликатов). @@ -43,6 +61,20 @@ and [by Yandex](https://translated.turbopages.org/proxy_u/ru-en.en/https/libmdbx - Функция `mdbx_txn_release_all_cursors()` возвращает только код ошибки, не смешивая его с количеством обработанных/закрытых курсоров. Для аналогичных действий с получением количества закрытых курсоров в API добавлена функция `mdbx_txn_release_all_cursors_ex()`. + - Поддержка пустого набора данных в put-операции `MDBX_MULTIPLE` ради упрощения пользовательского кода, какой-либо модификации данных в БД при этом не происходит. + + - Для основных вариантов использования шаблона `mdbx::buffer<>` теперь явно инстанцируются внутри библиотеки, + одновременно соответствующие специализации шаблона помечены как `external` для предотвращения повторного инстанцирования в пользовательском коде. + + - Запрещена отвязка/открепление курсоров во вложенных транзакциях, т.е. вызовы `mdbx_cursor_unbind()` и + `mdbx_txn_release_all_cursors(unbind=true)` для курсоров открытых в одной из родительских транзакций. + Причина в том, что в случае отмены вложенной транзакции возникает неконструктивная неопределенность + — следует ли восстанавливать состояние курсоров. Если не восстанавливать, то получается что вложенная транзакция может + поломать родительскую, сделав её продолжение невозможным. Если восстанавливать, то также следует «воскрешать» закрытые + курсоры, что неизбежно приведет к путанице, утечкам памяти и использованию после освобождения. + + - В C++ API отменён вброс исключения при запросе транзакции у отсоединённого курсора посредством вывоза `mdbx::cursor::txn()`. + Исправления: - Устранён регресс допускающий SIGSEGV в операциях обновления после вытеснения/spilling страниц в больших транзакциях. @@ -72,6 +104,32 @@ and [by Yandex](https://translated.turbopages.org/proxy_u/ru-en.en/https/libmdbx - Устранена причина попыток рекурсивного захвата мьютекса при работе `mdbx_chk -w` в сборах с поддержкой Valring/ASAN и под управлением этих инструментов. + - Устранена вероятность ситуации гонки в `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++. + Прочие доработки: - Существенный рефакторинг с реструктуризацией кода, переименованием внутренних структур, их полей и внутренних функций. @@ -81,6 +139,22 @@ and [by Yandex](https://translated.turbopages.org/proxy_u/ru-en.en/https/libmdbx - Добавлены дополнительные проверки сигнатур курсоров при итерации связанных списков. + - Кратное сокращение итераций тестов в зависимости от конфигурации 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. + -------------------------------------------------------------------------------- @@ -115,6 +189,45 @@ and [by Yandex](https://translated.turbopages.org/proxy_u/ru-en.en/https/libmdbx ******************************************************************************** +## v0.13.4 "Sigma Boy" от 2025-02-14 + +Поддерживающий выпуск стабильной ветки с исправлением обнаруженных ошибок и устранением недочётов. + +Благодарности: + + - [Erigon](https://docs.erigon.tech/) за спонсорство. + - [Алексею Костюку (aka Keller)](https://t.me/keller18306) за сообщения об ошибках и недочетах. + - [Alain Picard](https://github.com/castortech) for support [Java bindings](https://github.com/castortech/mdbxjni) and MacOS universal binaries patch for CMake build scenario. + - [Alex Sharov](https://github.com/AskAlexSharov) за сообщение об ошибках и тестирование. + - [Виктору Логунову](https://t.me/vl_username) за сообщение об опечатки в имени переменной в Conan-рецепте. + +Новое: + + - Поддержка MacOS universal binaries при сборке посредством CMake. + +Исправления: + + - Устранён регресс допускающий SIGSEGV в операциях обновления после вытеснения/spilling страниц в больших транзакциях. + Ошибка присутствует в выпусках v0.13.1, v0.13.2, v0.13.3 и оставалась незамеченной из-за специфических условий и низкой вероятности проявления. + Более подробная информация в описании коммита `21630ea115690a5cb39cfa921f9d199271a08102`. + + - Исправлена опечатка в документации в упоминании `mdbx_env_resurrect_after_fork()`. + + - Исправлена опечатка в условном операторе внутри `cursor_touch()`. + При переделке курсоров было пропущено отрицание в условии, при оценке количества страниц, которые могут потребоваться для выполнения операции. + В текущем понимании ошибка не приводила к каким-либо проблемам, ибо оценка делает по верхней границе с существенным запасом, а в худшем + случае это могло приводить к прерыванию транзакции из-за достижения ограничения на кол-во грязных страниц. + + - Корректировка излишне строгого условия в assert-проверке внутри `recalculate_subpage_thresholds()`. + Ошибка могла проявляться только в отладочных сборках при выставлении определенной комбинации предельных значений опций `MDBX_opt_subpage_limit`, + `MDBX_opt_subpage_room_threshold`, `MDBX_opt_subpage_reserve_prereq`, `MDBX_opt_subpage_reserve_limit`. + + - Исправление опечатки в Conan-рецепте в коде протокольно-отладочного вывода в имени переменной `version_json_pathname`. + + +-------------------------------------------------------------------------------- + + ## v0.13.3 "Королёв" от 2025-01-12 Поддерживающий выпуск с исправлением обнаруженных ошибок и устранением недочетов