diff --git a/ChangeLog.md b/ChangeLog.md index 7250dc72..bf15663a 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -189,6 +189,138 @@ and [by Yandex](https://translated.turbopages.org/proxy_u/ru-en.en/https/libmdbx ******************************************************************************** +## v0.13.5 "Труба" запланирован на 2025-03-21 + +Поддерживающий выпуск стабильной ветки с исправлением обнаруженных ошибок и устранением недочётов. + +Благодарности: + + - [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()` возвращающая код ошибки. + +Исправления: + + - Устранение лишнего/ненужного предупреждения в сценарии изменения размера БД посредством вызова `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()` возвращает только код ошибки, не смешивая его с количеством обработанных/закрытых курсоров. + Для аналогичных действий с получением количества закрытых курсоров в 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. + + +-------------------------------------------------------------------------------- + + ## v0.13.4 "Sigma Boy" от 2025-02-14 Поддерживающий выпуск стабильной ветки с исправлением обнаруженных ошибок и устранением недочётов. @@ -629,6 +761,65 @@ and [by Yandex](https://translated.turbopages.org/proxy_u/ru-en.en/https/libmdbx ******************************************************************************** +## v0.12.13 от 2025-02-28 + +Поддерживающий выпуск с исправлением обнаруженных ошибок и устранением недочетов. + +Это последний/консервирующий выпуск куста стабильных версий 0.12.x, спустя более двух +лет после выпуска 0.12.1. + +``` +git diff' stat: 14 commits, 7 files changed, 256 insertions(+), 103 deletions(-) +Signed-off-by: Леонид Юрьев (Leonid Yuriev) +``` + +Значимые исправления: + + - Исправлена обработка `MDBX_GET_MULTIPLE` в специальных случаях и одного значения у ключа в позиции курсора. + + - Устранена ошибка неверной обработки попытки запуска вложенной читающей транзакции. + Теперь в таких ситуациях возвращается ошибка `MDBX_EINVAL`, так как вложенность + поддерживается только для транзакций чтения-записи. + + Ошибка была внесена при рефакторинге, коммитом `2f2df1ee76ab137ee66d00af69a82a30dc0d6deb` + чуть более 5 лет назад и долго оставалось не замеченной. + + - Поддержка получения boot_id при работе внутри LXC-контейнера. + + Из LXC-контейнера не доступен файл хостовой системы `/proc/sys/kernel/random/boot_id`. + Вместо него, при каждом старте контейнера, создается и заполняется + случайными данными собственный boot_id смонтированный через bind из `tmpfs`. + https://github.com/lxc/lxc/issues/3027 + + Ранее этот подставной/замещенный boot_id отбраковывался внутри libmdbx, + так как файл располагается в `tmpfs`, а не в файловой системе `/proc`. + В результате boot_id для проверки целостности БД не был доступен. + Теперь при работе внутри LXC-контейнера такой bootid будет использоваться. + + Однако, полноценно работающий контроль по boot_id не возможен, так как при + рестарте LXC-контейнера (но не хоста) boot_id будет меняться, хотя + данные в unified page cache сохраняются. + + Таким образом, при рестарте LXC-контейнера без рестарта хоста, libmdbx придется + откатить состояние БД до крайней точки устойчивой фиксации, что повлечет + утрату данных пользователя в случаях когда они могли быть сохранены. + Однако, улучшить ситуацию пока не представляется возможным, как минимум + до доступности boot_id хостовой системы изнутри LXC-контейнера. + + - Доработан контроль длины ключа внутри `cursor_set()`. + + Ранее проверка внутри `cursor_set()` не позволяла искать ключи длиннее, чем можно поместить в таблицу. + Однако, при поиске/позиционировании это не является ошибкой для таблиц с ключами переменного размера. + + - Теперь при попытке запуска вложенных транзакций в режиме `MDBX_WRITEMAP` производится + логирование и возврат ошибки `MDBX_INCOMPATIBLE`. + + - Доработано использование `std::experimental::filesystem` для решения проблем со сборкой в старых компиляторах. + + +-------------------------------------------------------------------------------- + + ## v0.12.12 "Доллежаль" от 2024-10-27 Поддерживающий выпуск с исправлением обнаруженных ошибок и устранением недочетов, @@ -641,7 +832,7 @@ and [by Yandex](https://translated.turbopages.org/proxy_u/ru-en.en/https/libmdbx рекомендуется использовать ветку `master`. ``` -git diff' stat: x commits, y files changed, z insertions(+), zz deletions(-) +git diff' stat: 6 commits, 5 files changed, 239 insertions(+), 6 deletions(-) Signed-off-by: Леонид Юрьев (Leonid Yuriev) ``` @@ -684,119 +875,6 @@ Signed-off-by: Леонид Юрьев (Leonid Yuriev) и наведение ATACAMS невозможно без использования орбитальной группировки военных спутников США. -``` -git diff' stat: 29 commits, 14 files changed, 379 insertions(+), 151 deletions(-) -Signed-off-by: Леонид Юрьев (Leonid Yuriev) -``` - -Значимые исправления: - - - Исправление для ОС Windows нарезки `FILE_SEGMENT_ELEMENT`. - Похоже что был потерян коммит входе работы над оптимизацией пути записи - на диск в ОС Windows. В текущем понимании, вероятность проявления ошибки - достаточно низкая, так как выявлена она была синтетическими тестами в - ходе других доработок, а соответствующих сообщений/жалоб не поступало. К - повреждению БД ошибка не приводила, так как сбой происходил до записи - данных с возвратом `ERROR_INVALID_PARAMETER` из системного вызова, т.е. - либо ошибка не проявлялась, либо транзакция не фиксировалась. - - - Устранение вероятности `SIGSEGV` при включении логирования - уровня `MDBX_LOG_TRACE` в отладочных сборках. - - - Исправление генерации исключения `key_exists` в C++ API. - - - Исправление опечаток в документации и README. - - - Исправление обработки курсоров, открытых в родительских транзакциях и - закрытых до завершения вложенных транзакций. В описанной ситуации - закрытые курсоры "воскрешались", что приводило к утечке памяти - выделенной под такие курсоры. - - - Костыль для MSVC ARM/ARM64 для предотвращения ICE (Internal Compiler Error). - - - Устранение `MDBX_EINVAL` для случая вызова `mdbx_env_remove(".")`. - - - Исправление инверсии bool-результата `env::remove()` в C++ API. - - - Исправление опечатки `равно`/`неравно` в условии внутри - `update_gc()`. Существенных последствий ошибки не было, но в - определенных сценариях, сходимость требовала еще одного цикла повтора - внутри update_gc(). - -Прочие доработки: - - - Проверка совместимости флагов GC/FreeDB на случай их изменения в будущих версиях. - - Очистка сообщений `FormatMessageA()` от концевых переводов строк. - - Уточнение макроса `__always_inline` для особо яблочных версий CLANG. - - Использование `\n` вместо `std::endl` в C++ API при . - - Проверка дополнительных и пока не используемых полей в meta-страницах. - - Отключение ненужной отладки внутри `txn_merge()`. - - Исправление условий и привязки к версиям компиляторов при формировании макроса `MDBX_DEPRECATED`. - - Больше атрибутов `__cold` для редко-используемых функций (backport). - - Добавление методов `buffer::append_bytes()` и `buffer::clear_and_reserve()`. - - Отключение установки признака фатальной ошибки для не-активной среды при отличии идентификатора процесса. - - --------------------------------------------------------------------------------- - - -## v0.12.12 "Доллежаль" от 2024-10-27 - -Поддерживающий выпуск с исправлением обнаруженных ошибок и устранением недочетов, -в память о советском ученом-энергетике Николае Антоновиче Доллежаль в день 125-летия со дня его рождения. - -Это последний выпуск куста стабильных версий 0.12.x, спустя более двух -лет после выпуска 0.12.1. Последующие выпуски 0.12.x будут формироваться -только в случае существенных проблем/ошибок, вероятность чего близка к -нулю. Для всех проектов находящихся в стадии активной разраборки -рекомендуется использовать ветку `master`. - -``` -git diff' stat: x commits, y files changed, z insertions(+), zz deletions(-) -Signed-off-by: Леонид Юрьев (Leonid Yuriev) -``` - -Значимые исправления: - - - Исправление упущенного `TXN_END_EOTDONE` при сбое старта читающей транзакции. - Упомянутый флажок отсутствовал в пути разрушения транзакции при ошибке - её запуска. Из-за чего делалась попытка разрушить курсоры, что приводило - к падению **отладочных сборок**, так как в них соответствующий массив - намеренно заполнен некорректными указателями. - - - Устранение возможности `SIGSEGV` внутри `coherency_check()` после - изменения геометрии другим процессом с увеличением верхнего размера БД - и увеличением БД больше предыдущего лимита. - - - Доработка `mdbx_close_dbi()` для возврата ошибки при попытке закрыть - dbi-дескриптор таблицы, созданной и/или измененной в ещё выполняющейся - транзакции. Такое преждевременное закрытие дескриптора является неверным - использованием API и нарушением контракта/предусловий сформулированных - в описании `mdbx_close_dbi()`. Однако, вместо возврата ошибки - выполнялось некорректное закрытие дескриптора, что могло приводить к - созданию таблицы с пустым именем, утечки страниц БД и/или нарушению - структуры b-tree (неверной ссылкой на корень таблицы). - Добавлен соответствующий тест `extra/early_close_dbi`. - - - --------------------------------------------------------------------------------- - - -## v0.12.11 "Лиза и Соня" от 2024-07-23 - -Поддерживающий выпуск с исправлением обнаруженных ошибок и устранением недочетов, -в память об убитых в Крыму девочках 2 и 9 лет. - -Лиза и Соня погибли 23 Июня 2024 на глазах у родителей, в результате -удара по общественному городскому пляжу ракетами ATACMS с кассетными -боеприпасами. Всего пострадало более 150 граждан России, в том числе 27 -детей. Ракеты были выпущенными украинскими бандеровцами/фашистами, но -полетные задания формировались и загружались военными США, а управление -и наведение ATACAMS невозможно без использования орбитальной группировки -военных спутников США. - - ``` git diff' stat: 29 commits, 14 files changed, 379 insertions(+), 151 deletions(-) Signed-off-by: Леонид Юрьев (Leonid Yuriev)