mdbx: дополнение ChangeLog.

This commit is contained in:
Леонид Юрьев (Leonid Yuriev) 2025-03-19 23:50:29 +03:00
parent 917e2827f5
commit e37194affe
No known key found for this signature in database
GPG Key ID: 518BD10B927E8686

View File

@ -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<ALLOCATOR, CAPACITY_POLICY>` добавлен параметр `inplace_storage_size_rounding`.
Одновременно с этим переработан внутренний union-тип `mdbx::buffer<ALLOCATOR, CAPACITY_POLICY>::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
Поддерживающий выпуск с исправлением обнаруженных ошибок и устранением недочетов