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

This commit is contained in:
Леонид Юрьев (Leonid Yuriev) 2025-04-29 08:39:35 +03:00
parent 76e2544cc0
commit 859c350df0
No known key found for this signature in database
GPG Key ID: 518BD10B927E8686

View File

@ -4,7 +4,7 @@ ChangeLog
English version [by liar Google](https://libmdbx-dqdkfa-ru.translate.goog/md__change_log.html?_x_tr_sl=ru&_x_tr_tl=en)
and [by Yandex](https://translated.turbopages.org/proxy_u/ru-en.en/https/libmdbx.dqdkfa.ru/md__change_log.html).
## v0.14.1 в активной разработке без конкретизации даты выпуска
## v0.14.1 выпуск запланирован в начале мая
Первый выпуск в новом кусте/линейке версий с добавлением функционала, расширением API и внутренними переработками.
@ -19,9 +19,62 @@ and [by Yandex](https://translated.turbopages.org/proxy_u/ru-en.en/https/libmdbx
- [maxc0d3r](https://gitflic.ru/user/maxc0d3r) for bug reporting and testing.
- [Алексею Костюку (aka Keller)](https://t.me/keller18306) за сообщения о проблеме копирования на NFS.
Новое:
- Переработан код обновления GC и возврата страниц при фиксации транзакций.
Возникающая при этом задача алгоритмически сложна, так как список
возвращаемых страниц находится в рекурсивной зависимости от самой
процедуры возврата и связанных с этим операций, а прямые решения во
многих случаях приводят к многократному росту накладных расходов.
Поэтому исторически эта часть кода была запутанным наслоением «сдержек и
противовесов», что создавало препятствие для развития. В ходе этой
доработки, унаследованный из LMDB код связанный с обновлением GC, был
полностью заменен вместе со всеми базирующимися на нём заплатками.
Новая реализация использует контейнеры идентификаторы (aka RKL),
комбинирующие внутри списки элементов и непрерывные интервалы, что
позволяет предельно сократить накладные расходы и упросить реализацию
остальных алгоритмов. Основывается новая реализация на простом
прагматичном подходе «резервирования со взвешенным запасом». Для
подавляющего подмножества сценариев этого достаточно для однопроходного
обновления GC, с общей сложностью от `O(1)` для мелких транзакций, до
`O(log(N))` для огромных. При этом реализованный еще в 0.12.1 подход «Big
Foot» (дробление больших списков retired-страниц) полностью избавляет GC
от потребности в последовательностях смежных/соседствующих страниц и
одновременно позволяет работать новому коду обновления GC только по
самому простому и быстрому пути.
Тем не менее, при намеренном отключении «Big Foot», либо при работы с БД
от старых версий движка без «Big Foot», возможны сложные ситуации, когда
в GC могут огромные списки страниц, которые желательно дробить при
возвращении неиспользованных переработанных остатков. В таких сценариях
для возврата в GC требуется создавать больше записей чем было исходно
переработано, что может приводить к нехватке имеющихся/переработанных
идентификаторов. Тогда в игру вступает следующая часть нового кода,
поиск в GC «дыр» (неиспользуемых промежутков/интервалов в пространстве
ключей GC). Далее, если свободных идентификаторов (неиспользуемого
пространства ключей GC) будет недостаточно, что весьма вероятно в
некоторых сценариях, будет решаться задача родственная «укладке
рюкзака». В конечном итоге, неиспользованные переработанные страницы
будут возвращены в GC, с максимально равномерным
распределением/дроблением и использованием имеющихся последовательностей
смежных/соседствующих страниц, что гарантирует близость к теоретическому
минимуму суммарной стоимости текущих действий и последующих операций.
На данный момент нет известных практических сценариев ведущих к
отказу/неуспеху новой реализации обновления GC. Но гипотетически такие
случаи возможны, как из-за ошибок/недочетов в реализации, так и из-за
использования катастрофически неудачных режимов работы и значений опций
(например `MDBX_opt_rp_augment_limit`). В текущем понимании, в том числе
основываясь на объем тестирования, вероятность проявления
ошибок/недочетов оценивается как крайне низкая, а устраняться замеченные
проблемы будут по мере обнаружения. Однако, полностью автоматическое
решение самых кошмарных и запутанных ситуаций с GC следует ожидать
только при реализации дефрагментации — просто потому что нет иного
рационального способа решения, за вычетом копирования БД с
дефрагментацией.
- Добавлена опция сборки `MDBX_NOSUCCESS_PURE_COMMIT` предназначенная для отладки кода пользователя.
По-умолчанию опция выключена и при фиксации пустых транзакции возвращается `MDBX_SUCCESS`.
При включении опции, фиксация пишущих транзакций без каких-либо изменений считается нештатным поведением, с возвратом из `mdbx_txn_commit()` кода `MDBX_RESULT_TRUE` вместо `MDBX_SUCCESS`.