mdbx: merge branch master into stable.

This commit is contained in:
Леонид Юрьев (Leonid Yuriev)
2025-01-12 22:08:00 +03:00
179 changed files with 45129 additions and 40755 deletions

View File

@@ -1,8 +1,516 @@
ChangeLog
=========
English version [by Google](https://gitflic-ru.translate.goog/project/erthink/libmdbx/blob?file=ChangeLog.md&_x_tr_sl=ru&_x_tr_tl=en)
and [by Yandex](https://translated.turbopages.org/proxy_u/ru-en.en/https/gitflic.ru/project/erthink/libmdbx/blob?file=ChangeLog.md).
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.13.3 "Королёв" от 2025-01-12
Поддерживающий выпуск с исправлением обнаруженных ошибок и устранением недочетов
в день рождения и в память об [Серге́е Па́вловиче Королёве](https://ru.wikipedia.org/wiki/Королёв,_Сергей_Павлович),
советском учёном и Главном конструкторе ракетно-космических систем.
Благодарности:
- [Алексею Костюку (aka Keller)](https://t.me/keller18306) за сообщения об ошибках и недочетах.
- [Erigon](https://docs.erigon.tech/) за спонсорство.
- [Lazymio](https://github.com/wtdcode) за новые [привязки к Python](https://pypi.org/project/libmdbx/).
Новое:
- В C API добавлена функция `mdbx_cursor_count_ex()` позволяющая получить как количество мульти-значений
соответствующих текущему ключу, так и информацию о вложенном дереве хранящем эти значения.
- В C++ API добавлен метод `mdbx::txn::make_broken()` аналогичный `mdbx_txn_break()`.
- В утилиты mdbx_copy, mdbx_drop, mdbx_dump, mdbx_load, mdbx_stat добавлено логирование ошибок,
предупреждений и важных сообщений от libmdbx.
Исправления:
- Устранён регресс неразблокировки мьютекса при попытки повторного закрытия dbi-дескриптора,
в том числе при попытке явно закрыть дескриптор после удаления связанной с ним таблицы.
Вместо возврата ошибки `MDBX_BAD_DBI` происходил выход из тела функции по успешному пути,
но без освобождения захваченной блокировки.
Ошибка была внесена 2024-10-23 коммитом `3049bb87b5b14d83b16d121c186ce8fb3f21383e`.
- Устранён регресс состояния вложенного/dupsort курсора после вставки данных в `MDBX_APPEND`-режиме.
При добавлении нового ключа в append-режиме, в случае когда в текущей
(последней) позиции с ключом связаны несколько значений и
(соответственно) вложенный dupsort-курсор инициализирован, вставка
происходила без сброса вложенного курсора.
В результате вложенный курсор логически оставался стоять на
multivalue-данных связанных с предыдущей позицией основного курсора,
т.е. переходил в неконсистентное состояние.
Ошибка проявлялась возвратом неверных значений из `mdbx_cursor_count()`
или срабатывание assert-проверки в отладочных сборках.
- Поддержка получения 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-контейнера.
- Устранёна ошибка неверной обработки попытки запуска вложенной читающей транзакции.
Теперь в таких ситуациях возвращается ошибка `MDBX_EINVAL`, так как вложенность
поддерживается только для транзакций чтения-записи.
Ошибка была внесена при рефакторинге, коммитом `2f2df1ee76ab137ee66d00af69a82a30dc0d6deb`
чуть более 5 лет назад и долго оставалось не замеченной.
- Устранён SIGSEGV-регресс обращения к нулевому адресу при работе в режиме только-чтение без использования LCK-файла,
например при размещении БД на носителе доступном только для чтения.
Ошибка была внесена при реализации функционала парковки читающих транзакций.
Изменение поведения:
- Теперь при включении профилирования GC (сборка с опцией `MDBX_ENABLE_PROFGC=ON`)
подсчитываются затраты времени ЦПУ на слияние списков страниц, т.е. на работу функции `pnl_merge()`.
- В утилите тестирования значение режима данных переименовано из `data.dups` в `data.multi`.
- Доработан контроль длины ключа внутри `cursor_seek()`.
Ранее проверка внутри `cursor_seek()` не позволяла искать ключи длиннее, чем можно поместить в таблицу.
Однако, при поиске/позиционировании это не является ошибкой для таблиц с ключами переменного размера.
- Если посредством `mdbx_env_set_option(MDBX_opt_txn_dp_limit)` пользователем не задано собственно значение,
то выполняется подстройка dirty-pages-limit при старте каждой не-вложенной пишущей транзакций,
исходя из объёма доступного ОЗУ и размера БД.
- Теперь в режиме `MDBX_NOSTICKYTHREADS` допускается commit/abort вложенных транзакций из любого треда/потока.
- Теперь при попытке запуска вложенных транзакций в режиме `MDBX_WRITEMAP` производится
логирование и возврат ошибки `MDBX_INCOMPATIBLE`.
- Теперь в C++ API в конструкторах/инициализаторах и методах связанных с формированием геометрии БД
по-умолчанию используются только `default`-значений, в том числа для минимального и максимального
размера. В результате, при создании БД с геометрией по-умолчанию не происходит выбор максимального
размера страницы из-за очень большого максимального размера БД.
- Внутри `mdbx_env_set_geometry()` доработаны эвристики для подбора параметров геометрии БД запрошенных пользователем "по-умолчанию".
--------------------------------------------------------------------------------
## v0.13.2 "Прошлогодний Снег" (Last Year's Snow) от 2024-12-11
Поддерживающий выпуск с исправлением обнаруженных ошибок и устранением недочетов
в день рождения и в память об [Алекса́ндре Миха́йловиче Тата́рском](https://ru.wikipedia.org/wiki/Татарский,_Александр_Михайлович),
российском режиссёре-мультипликаторе, создавшем такие знаменитые
мультфильмы как "Падал прошлогодний снег", "Пластилиновая ворона",
заставку "Спокойной ночи, малыши!" и многие другие шедевры нашего
детства.
Новое:
- Ускорено обновление GC при возврате/помещении списков страниц в
сложных сценариях. Был доработан и активирован ранее отключенный
экспериментальный режим корректирующей обратной связи. Этим
принципиально улучшилась сходимость (сократилось количество повторных
попыток), а также устранен дефект приводящий к "зацикливанию" при
фиксации транзакций (с возвратом ошибки `MDBX_PROBLEM`) в редких
специфических условиях.
Подробности см. в описании коммита [`6c56ed97bbd8ca46abac61886a113ba31e5f1291`](https://gitflic.ru/project/erthink/libmdbx/commit/6c56ed97bbd8ca46abac61886a113ba31e5f1291).
- Включен стандарт `C23` в CMake-скриптах сборки.
- Добавлены T-макросы для парных `char`/`wchar_t` функций.
- Поддержка вложенных пишущих транзакций в C++ API.
- Переход на "Semantic Versioning 2" и экспорт информации о версии в `VERSION.json`.
- Добавлена поддержка переменной среды `SOURCE_DATE_EPOCH` для воспроизводимости сборок.
Прежний способ посредством `MDBX_BUILD_TIMESTAMP` также работает и имеет приоритет.
- Добавлена возможность указывать дополнительную информацию о сборке
libmdbx через опцию `MDBX_BUILD_METADATA`. Сейчас задаваемая информация
просто включается внутрь библиотеки в качестве значения
`mdbx_build.metadata`, а в дальнейшем также будет использоваться при
формировании пакетов и т.п.
- Добавлено логирование ошибок возвращаемых из API. Теперь для этого
достаточно задать уровень логирования `MDBX_LOG_DEBUG` (для логирования
ошибок за вычетом `MDBX_NOTFOUND`) или `MDBX_LOG_TRACE` (для логирования
всех ошибок, а также `MDBX_RESULT_TRUE`).
- Поддержка сборки посредством Conan.
Изменение поведения:
- Добавлен метод `mdbx::cursor::get_multiple_samelength()` и
переименован `mdbx::txn::put_multiple_samelength()`.
- Для единообразия C++ API при выполнении операции `MDBX_GET_MULTIPLE`
теперь также возвращается значение самого ключа.
- Для размерных констант `mdbx::env::geometry` базовый тип изменен с
беззнакового `size_t` на знаковый `intptr_t`.
- Теперь выбор в пользу использования ntdll вместо CRT делается только
при явном отключении C++ API.
- Теперь выполняется освобождение памяти сброшенных/прерванных читающих
транзакций передаваемых в `mdbx_txn_commit()`. Соглашение по API требует
чтобы такие транзакции освобождались посредством `mdbx_txn_abort()`,
из-за чего функция `mdbx_txn_commit()` возвращала ошибку в таких
случаях, не разрушая сами транзакции. Это приводило к утечкам памяти
из-за ошибок в приложениях, что побудило изменить поведение.
- Использование макроса `__deprecated_enum` если он определен.
- При сборке посредством CMake выбор стандарта языка `C` теперь
выполняется с учётом `CMAKE_C_STANDARD`.
- Изменения в опциях сборки:
* опция `MDBX_OSX_SPEED_INSTEADOF_DURABILITY` переименована в
`MDBX_APPLE_SPEED_INSTEADOF_DURABILITY`, так как актуальна для всех
"Яблочных" платформ;
* опция `MDBX_MMAP_USE_MS_ASYNC` переименована в
`MDBX_MMAP_NEEDS_JOLT`, для более точного соответствия своей семантики;
* в CMake добавлена поддержка опции `MDBX_USE_MINCORE`;
* использование `madvise()` и родственных системных вызовов теперь
всегда включено, а опция `MDBX_ENABLE_MADVISE` удалена;
* удалены неиспользуемая опция `MDBX_USE_SYNCFILERANGE` и
неиспользуемый режим `MDBX_LOCKING_BENAPHORE`.
Исправления:
- Устранен регресс возврата неверной информации из функций
`mdbx_env_stat_ex()` и `mdbx_env_stat()`. При рефакторинге до выпуска
v0.13.1 была допущена ошибка, из-за которой выполнялось суммирование
значений без очистки переданного пользователем буфера для результата.
Таким образом, возвращаемая информация была верной, только если память
используемая для размещения результата содержала нули на момент вызова
функции.
- Функция `mdbx_close_dbi()` доработана для возврата ошибки `MDBX_DANGLING_DBI`
при попытке закрыть dbi-дескриптор таблицы, созданной и/или измененной в
ещё выполняющейся транзакции. Такое преждевременное закрытие дескриптора
является неверным использованием API и нарушением контракта/предусловий
сформулированных в описании `mdbx_close_dbi()`. Однако, вместо возврата
ошибки выполнялось некорректное закрытие дескриптора, что могло
приводить к созданию таблицы с пустым именем, утечки страниц БД и/или
нарушению структуры b-tree (неверной ссылкой на корень таблицы).
- Исправлено открытие таблицы с пустым/нулевым именем, в том числе устранена
возможность `SIGSEGV` при закрытии её дескриптора.
- Добавлены упущенные inline-реализации `mdbx::cursor::upper_bound()` и `mdbx::cursor::upper_bound_multivalue()`.
- Продолжена корректировка описания С++ API для использования термина "таблица" вместо "sub-database".
- Исправлено проверяемое условие внутри `assert()` в пути обработки `MDBX_GET/NEXT/PREV_MULTIPLE`.
- На 32-битных платформах разрешено использовать 4-байтное выравнивание при получении 64-битных значений посредством `MDBX_MULTIPLE`.
- Добавлен костыль для устранения проблем из-за некорректной обработки `[[gnu::pure]]` в Apple Clang и MSVC.
- Поправлено определение `MDBX_DEPRECATED_ENUM` для старых компиляторов при включении С++11.
- Доработано использование `std::experimental::filesystem` для решения проблем со сборкой в старых компиляторах.
- Исправлена обработка `MDBX_GET_MULTIPLE` в специальных случаях и одного значения у ключа в позиции курсора.
- Исправление сборки при включении профилирования GC и `MDBX_ENABLE_DBI_SPARSE=OFF`.
Мелочи:
- Теперь `MDBX_ENABLE_BIGFOOT` включена по-умолчанию вне зависимости от разрядности платформы.
- Дополнение README и исправление опечаток/орфографии.
- Использование `WIN32` вместо `${CMAKE_SYSTEM_NAME}`.
- Подавление параноидальных предупреждений MSVC в extra-тестах.
- Дополнение отладочного логирования внутри `dxb_resize()`.
- Добавление в сценарии CMake/CTest копирования dll под Windows для работы исключений в тестах на C++.
- Добавление С++ теста `extra/open`.
- Доработка `osal_jitter()` для уменьшения задержек в тестах под Windows.
- Исправление максимальной длины значений в тесте `extra/crunched-delete`.
- Добавление логирования С++ исключений в `extra/dupfix_multiple`.
- Корректировка API-макросов для Doxygen.
- Уточнение описания `mdbx_dbi_close()` для случая хендлов измененных таблиц.
- Добавление теста `extra/early_close_dbi`.
- Доработка скрипта стохастического теста и его переименование в `stochastic.sh`.
- Доработка тестов для совместимости с режимами сборки до С++17.
- Добавление `.WAIT` для устранения коллизий при распараллеливании сборки посредстом GNU Make 4.4.
--------------------------------------------------------------------------------
## v0.13.1 "РДС-1" от 2024-08-29
Новая версия со сменой лицензии, существенным расширением API,
добавлением функционала и внутренними переработками. В том числе,
с незначительным нарушением обратной совместимости API библиотеки.
Новое:
- Изменение лицензии на Apache 2.0, пояснения и подробности в файле `COPYRIGHT`.
- Реструктуризация исходного кода с рефакторингом.
- Переработка курсоров для унификации поведения, более регулярного
кода, уменьшения количества ветвлений и машинных операций.
- Перенос функционала утилиты `mdbx_chk` внутрь библиотеки в виде
функции `mdbx_env_chk() `для проверка целостности структуры БД, в том
числе с вовлечением логики приложения.
- Опция `MDBX_opt_gc_time_limit` для более гибкого контроля времени
расходуемого на поиск последовательностей соседствующих свободных
страниц в GC.
- Снижение накладных расходов на запуск транзакций в сценариях с
большим количеством DBI-хендов, за счет отложенной/ленивой инициализации
элементов служебных таблиц. В том числе, механизм поддержки разреженных
наборов DBI-хендов, управляемый опцией сборки `MDBX_ENABLE_DBI_SPARSE`,
которая включена по-умолчанию.
- Снижение накладных расходов на открытие DBI-хендов. В том числе,
механизм отложенного освобождения и поддержки быстрого пути открытия без
использования блокировок, управляемый опцией сборки
`MDBX_ENABLE_DBI_LOCKFREE`, которая включена по-умолчанию.
- Поддержка "парковки" читающих транзакций с их вытеснением ради
переработки старых MVCC-снимков и предотвращения проблем вызываемых
приостановкой переработки мусора. Механизм парковки и вытеснения
припаркованных транзакций является как дополнением, так и более простой
в использовании альтернативой обратному вызову
[Handle-Slow-Readers](https://libmdbx.dqdkfa.ru/group__c__err.html#ga2cb11b56414c282fe06dd942ae6cade6).
Для удобства функции `mdbx_txn_park()` и `mdbx_txn_unpark()` имеют
дополнительные аргументы, позволяющие запросить автоматическую
"распарковку" припаркованных и перезапуск вытесненных транзакций.
- Расширение API позиционирования курсоров более удобными и очевидными
операциями по аналогии условиям `<`, `<=`, `==`, `>=`, `>` как для
ключей, так и для пар ключ-значение.
- Функции `mdbx_dbi_rename()` и `mdbx_dbi_rename2()` для переименования таблиц.
- Функции `mdbx_cursor_unbind()` и `mdbx_txn_release_all_cursors()` для
гибкого управления курсорами в сценариях повторного использования для
уменьшения накладных расходов.
- Функция `mdbx_env_resurrect_after_fork()` для восстановление открытой
среды работы с БД в дочернем процессе после ветвления/расщепления
процесса.
- Функция `mdbx_cursor_compare()` для сравнения позиций курсоров
аналогично оператору `<=>`.
- Функции `mdbx_cursor_scan()` и `mdbx_cursor_scan_from()` для
сканирования таблиц с использованием функционального предиката и
уменьшением сопутствующих накладных расходов.
- Функции `mdbx_cursor_on_first_dup()` и `mdbx_cursor_on_last_dup()`
для оценки позиции курсора.
- Функция `mdbx_preopen_snapinfo()` для получения информации о БД без
её открытия.
- Функция `mdbx_enumerate_tables()` для получение информации
об именованных пользовательских таблицах.
- Поддержка функций логирования обратного вызова без функционала
`vprintf()`, что существенно облегчает использование логирования в
привязках к другим языкам программирования.
- Режим работы `MDBX_NOSTICKYTHREADS` вместо `MDBX_NOTLS` для упрощения
интеграции с легковесными потоками/нитями их мультиплексирования вместе
с транзакциями по потокам операционной системы.
- Опция `MDBX_opt_prefer_waf_insteadof_balance`.
- Опции `MDBX_opt_subpage_limit`, `MDBX_opt_subpage_room_threshold`,
`MDBX_opt_subpage_reserve_prereq`, `MDBX_opt_subpage_reserve_limit`.
- Управление основной блокировкой lock/unlock/upgrade/downgrade для координации пишущих транзакций.
- Функции `mdbx_limits_keysize_min()` и `mdbx_limits_valsize_min()` для
получения нижней границы длины ключей и значений.
- Для идентификации БД добавлен UUID доступный в поле `mi_dxbid` структуры `MDBX_envinfo`,
получаемой посредством `mdbx_env_info_ex()`.
- Расширение API функциями lock/unlock/upgrade/downgrade основной блокировки.
- Добавление в API функций `mdbx_cursor_unbind()` и `mdbx_txn_release_all_cursors()`.
- Добавление в API функций `mdbx_txn_copy2pathname()` и `mdbx_txn_copy2fd()`.
- Добавление в утилиту `mdbx_copy` опций `-d` и `-p`.
- Расширение и доработка C++ API:
- добавлен тип `mdbx::cursor::estimate_result`, а поведение методов
`mdbx::cursor::estimate()` унифицировано с `mdbx::cursor::move()`;
- для предотвращения незаметного неверного использования API, для инициализации
возвращаемых по ссылке срезов, вместо пустых срезов задействован `mdbx::slice::invalid()`;
- добавлены дополнительные C++ операторы преобразования к типам C API;
- для совместимости со старыми стандартами C++ и старыми версиями STL перенесены
в public классы `mdbx::buffer::move_assign_alloc` и `mdbx::buffer::copy_assign_alloc`;
- добавлен тип `mdbx::default_buffer`;
- для срезов и буферов добавлены методы `mdbx::buffer::hex_decode()`, `mdbx::buffer::base64_decode()`, `mdbx::buffer::base58_decode()`;
- добавлен тип `mdbx::comparator` и функций `mdbx::default_comparator()`;
- добавлены статические методы `mdbx::buffer::hex()`, `mdbx::buffer::base64()`, `mdbx::buffer::base58()`;
- для транзакций и курсоров добавлены методы `get_/set_context`;
- добавлен метод `mdbx::cursor::clone()`;
- поддержка base58 переработана и приведена в соответствии с черновиком RFC,
в текущем понимании теперь это одна из самых высокопроизводительных реализаций base58;
- переработка `to_hex()` и `from_hex()`;
- добавлены перегрузи со `std::string_view` для методов `open_map`/`create_map`/`drop_map`/`clear_map`/`rename_map()`;
- добавлены перегрузки методов put/insert/upsert для `mdbx::pair`;
- добавлены методы принимающие имена таблиц/subDb через `mdbx::slice`.
Нарушение совместимости:
- Использование термина "таблица" вместо "subDb".
- Опция `MDBX_COALESCE` объявлена устаревшей, так как соответствующий функционал всегда включен начиная с предыдущей версии 0.12.
- Опция `MDBX_NOTLS` объявлена устаревшей и заменена на `MDBX_NOSTICKYTHREADS`.
- Опция сборки `MDBX_USE_VALGRIND` заменена на общепринятую `ENABLE_MEMCHECK`.
- В структуре `MDBX_envinfo` серии полей вида `meta1`, `meta2` и `meta3` заменены на массивы вида `meta[3]`.
- В шаблонных классах и функциях С++ API по-умолчанию вместо `mdbx::legacy_buffer` использован тип `mdbx::default_buffer` использующий полиморфные аллокаторы С++ 17.
- Удаление `DEFAULT_MAPSIZE` и изменение геометрии по-умолчанию при создании БД.
- Возвращение `MDBX_TXN_INVALID` (`INT32_MIN`) вместо `-1`
из `mdbx_txn_flags()` при передаче невалидной транзакции.
Исправления:
- Исправление упущенного `TXN_END_EOTDONE` при сбое старта читающей транзакции.
Упомянутый флажок отсутствовал в пути разрушения транзакции при ошибке
её запуска. Из-за чего делалась попытка разрушить курсоры, что приводило
к падению **отладочных сборок**, так как в них соответствующий массив
намеренно заполнен некорректными указателями.
- Устранение возможности `SIGSEGV` внутри `coherency_check()` после
изменения геометрии другим процессом с увеличением верхнего размера БД
и увеличением БД больше предыдущего лимита.
- Исправление assert-проверки при попытке создания таблицы с другими флагами/опциями.
Мелочи:
- Обновление конфигурации Doxygen до 1.9.6.
- Добавление `--read-var-info=yes` для Valgrind.
- Вывод из `mdbx_chk` информации об уровне детализации/verbosity.
## v0.13.0 от 2023-04-23
Технический тэг, отмечающий начало ветки `0.13`
с новым функционалом и изменением API.
********************************************************************************
## 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>
```
Значимые исправления:
- Исправление для ОС 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
@@ -226,7 +734,7 @@ Signed-off-by: Леонид Юрьев (Leonid Yuriev) <leo@yuriev.ru>
- Из разрабатываемой версии перенесены не-нарушающие совместимости доработки C++ API:
- добавлен тип `mdbx::cursor::estimation_result`, а поведение методов
- добавлен тип `mdbx::cursor::estimate_result`, а поведение методов
`cursor::estimate()` унифицировано с `cursor::move()`;
- для предотвращения незаметного неверного использования API, для инициализации
возвращаемых по ссылке срезов, вместо пустых срезов задействован `slice::invalid()`;
@@ -265,6 +773,7 @@ Signed-off-by: Леонид Юрьев (Leonid Yuriev) <leo@yuriev.ru>
## v0.12.8 "Владимир Уткин" от 2023-10-17
Стабилизирующий выпуск с исправлением обнаруженных ошибок и устранением недочетов,
в день 100-летия со дня рождения выдающегося советского и российского ученого и конструктора [Влади́мира Фёдоровича У́ткина](https://ru.wikipedia.org/wiki/Уткин,_Владимир_Фёдорович).
@@ -538,7 +1047,7 @@ Signed-off-by: Леонид Юрьев (Leonid Yuriev) <leo@yuriev.ru>
все они были несущественные, либо ложные.
- Устранено ложное предупреждение GCC при сборке для SH4.
- Добавлена поддержка ASAN (Address Sanitizer) при сборке посредством MSVC.
- Расширен набор перебираемых режимов в скрипте `test/long_stochastic.sh`,
- Расширен набор перебираемых режимов в скрипте `test/stochastic.sh`,
добавлена опция `--extra`.
- В C++ API добавлена поддержка расширенных опций времени выполнения `mdbx::extra_runtime_option`,
аналогично `enum MDBX_option_t` из C API.
@@ -848,7 +1357,7 @@ Signed-off-by: Леонид Юрьев (Leonid Yuriev) <leo@yuriev.ru>
- Уменьшение в 42 раза значения по-умолчанию для `me_options.dp_limit`
в отладочных сборках.
- Добавление платформы `gcc-riscv64-linux-gnu` в список для цели `cross-gcc`.
- Небольшие правки скрипта `long_stochastic.sh` для работы в Windows.
- Небольшие правки скрипта `stochastic.sh` для работы в Windows.
- Удаление ненужного вызова `LockFileEx()` внутри `mdbx_env_copy()`.
- Добавлено описание использования файловых дескрипторов в различных режимах.
- Добавлено использование `_CrtDbgReport()` в отладочных сборках.