mirror of
https://github.com/isar/libmdbx.git
synced 2025-03-26 12:16:06 +08:00
mdbx: merge branch stable
into master
.
This commit is contained in:
commit
a313dd2fae
306
ChangeLog.md
306
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<ALLOCATOR, CAPACITY_POLICY>` добавлен параметр `inplace_storage_size_rounding`.
|
||||
Одновременно с этим переработан внутренний union-тип `mdbx::buffer<ALLOCATOR, CAPACITY_POLICY>::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) <leo@yuriev.ru>
|
||||
```
|
||||
|
||||
Значимые исправления:
|
||||
|
||||
- Исправлена обработка `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) <leo@yuriev.ru>
|
||||
```
|
||||
|
||||
@ -684,119 +875,6 @@ Signed-off-by: Леонид Юрьев (Leonid Yuriev) <leo@yuriev.ru>
|
||||
и наведение ATACAMS невозможно без использования орбитальной группировки
|
||||
военных спутников США.
|
||||
|
||||
```
|
||||
git diff' stat: 29 commits, 14 files changed, 379 insertions(+), 151 deletions(-)
|
||||
Signed-off-by: Леонид Юрьев (Leonid Yuriev) <leo@yuriev.ru>
|
||||
```
|
||||
|
||||
Значимые исправления:
|
||||
|
||||
- Исправление для ОС 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) <leo@yuriev.ru>
|
||||
```
|
||||
|
||||
Значимые исправления:
|
||||
|
||||
- Исправление упущенного `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) <leo@yuriev.ru>
|
||||
|
Loading…
x
Reference in New Issue
Block a user