English version by liar Google and by Yandex.
Первый выпуск в новом кусте/линейке версий с добавлением функционала, расширением API и внутренними переработками.
Благодарности:
MDBX_MULTIPLE
regression). Big thank for assistance with debugging and testing.Новое:
MDBX_NOSUCCESS_PURE_COMMIT
предназначенная для отладки кода пользователя. По-умолчанию опция выключена и при фиксации пустых транзакции возвращается MDBX_SUCCESS
. При включении опции, фиксация пишущих транзакций без каких-либо изменений считается нештатным поведением, с возвратом из mdbx_txn_commit()
кода MDBX_RESULT_TRUE
вместо MDBX_SUCCESS
. Таким образом, у пользователя появляется возможность легко диагностировать лишние/ненужные транзакции записи.MDBX_ENABLE_NON_READONLY_EXPORT
позволяющая использовать в режиме чтения-записи БД расположенных в файловых системах экспортированных через NFS. По-умолчанию опция выключена и при открытии в неэксклюзивном режиме чтения-записи БД расположенных файловых системах доступных извне по NFS будет возвращаться ошибка MDBX_EREMOTE
. Включение опции позволяет открывать БД в описанных выше ситуациях, но риск чтения неверных данных на удалённой стороне ложится на пользователя.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.mdbx_cursor_close2()
возвращающая код ошибки.mdbx_chk
, для получения соответствующей (и массы другой) информации, достаточно увеличить детализацию несколько раз использовав опцию -v
.Изменение поведения:
EREMOTEIO
("Remote I/O error") вместо ENOTBLK
("Block device required") в качестве MDBX_EREMOTE
для индикации ошибочной ситуации открытия БД расположенной на сетевом носителе.mdbx_txn_release_all_cursors()
возвращает только код ошибки, не смешивая его с количеством обработанных/закрытых курсоров. Для аналогичных действий с получением количества закрытых курсоров в API добавлена функция mdbx_txn_release_all_cursors_ex()
.MDBX_MULTIPLE
ради упрощения пользовательского кода, какой-либо модификации данных в БД при этом не происходит.mdbx::buffer<>
теперь явно инстанцируются внутри библиотеки, одновременно соответствующие специализации шаблона помечены как external
для предотвращения повторного инстанцирования в пользовательском коде.mdbx_cursor_unbind()
и mdbx_txn_release_all_cursors(unbind=true)
для курсоров открытых в одной из родительских транзакций. Причина в том, что в случае отмены вложенной транзакции возникает неконструктивная неопределенность — следует ли восстанавливать состояние курсоров. Если не восстанавливать, то получается что вложенная транзакция может поломать родительскую, сделав её продолжение невозможным. Если восстанавливать, то также следует «воскрешать» закрытые курсоры, что неизбежно приведет к путанице, утечкам памяти и использованию после освобождения.mdbx::cursor::txn()
.Исправления:
cb8eec6d11cdab4f7d3cf87913e8009149dcf60b
.mdbx_env_set_geometry()
до её открытия. API предусматривает возможность запросить изменение геометрии/размера БД перед её открытием, чтобы избежать как лишних накладных расходов, так и потенциальных ошибок из-за нехватки адресного пространства. В этом сценарии ранее могло выдаваться лишнее/ненужное предупреждение о несоответствии файла БД новому размеру. Теперь этот недостаток исправлен.e6af7d7c53428ca2892bcbf7eec1c2acee06fd44
от 2023-11-05.e6af7d7c53428ca2892bcbf7eec1c2acee06fd44
от 2023-11-05.3de3d425a128a3c6f7866503f5f93b80c09dbe41
от 2024-05-19.mdbx_chk
с высоким уровнем логирования. Проблема возникала из-за неверной трактовки MDBX_NOTFOUND
при штатном окончании итерируемых данных.mdbx_chk -w
в сборах с поддержкой Valring/ASAN и под управлением этих инструментов.tbl_setup(MDBX_DUPFIXED | MDBX_INTEGERDUP)
при работе в разных потоках. В реальных сценариях вероятность проявления проблемы была близка к нулю. Для подробностей смотрите комментарий коммита 3e91500fac475947f5b58268d5edd3c9cc4f77f6
.e6af7d7c53428ca2892bcbf7eec1c2acee06fd44
от 2023-11-05.MDBX_MULTIPLE
. Пакетная вставка значений посредством MDBX_MULTIPLE
могла приводить к падениям и повреждению структуры БД. Ошибка оставалось не замеченной из-за специфических условий проявления, которые не реализовались в тестах. Проблема присутствовала во всех выпусках начиная с v0.13.1, но соответствующая ошибка не связана с конкретным коммита в истории, а является следствием нескольких доработок (шагов рефакторинга), которые суммарно привели к регрессу. Технически ошибка обусловлена не-обнулением переменной, чего не происходило в некотором пути выполнения, так как исходно не требовалось. Однако, такое обнуление потребовалось после ряда этапов оптимизации и рефакторинга смежных участков кода. Для подробностей смотрите комментарий коммита 23a417fe19614481c6546845995d6dc845baf797
.MDBX_MVCC_RETARDED
и текста соответствующего сообщения.__cpp_concepts >= 202002
для использования концептов C++.Прочие доработки:
-flto=auto
для GCC >= 11.4, расслабление условий для включения LTO для CLANG на Linux, расширение поиска LLVMgold.so
в относительных lib-директориях.MDBX_VALIDATION
и поддержка значений on
/off
для опций командной строки.cursor_check()
, cursor_reset()
и cursor_drown()
.[[атрибутов]]
для версий CLANG меньше 20.Технический тэг, отмечающий начало ветки 0.14
с новым функционалом и изменением API.
Запланированные новые возможности 0.14:
Явная дефрагментация БД. В API будет добавлена функция с двумя парами параметров:
Упрощенно, алгоритмически явная дефрагментация сводится к сканированию b-tree с формированием списка страниц расположенных близко к концу БД, а затем копирование этих страниц в не-используемые, но расположенные ближе к началу БД. В результате, после фиксации дефрагментирующей транзакции оригиналы скопированных страниц становятся не-используемыми, а размер БД может быть уменьшен за счет отсечения ни-используемых страниц в конце используемого пространства. Будет реализовано в 0.14.2.
Нелинейная переработка GC, без остановки переработки мусора на старом MVCC-снимке используемом долгой транзакцией чтения.
После реализации запланированного, любая длительная читающая транзакция по-прежнему будет удерживать от переработки используемый/читаемый MVCC-снимок данных (все образующие его страницы БД), но позволит перерабатывать все неиспользуемые MVCC-снимки, как до читаемого, так и после. Это позволит устранить один из основных архитектурных недостатков унаследованных от LMDB и связанных с ростом размера БД пропорционально объёму производимых изменений данных на фоне долго работающей транзакции чтения.
Будет реализовано предположительно в 0.14.3, 0.14.4 или даже в 0.15.x. Перенос в 0.15.x оправдан возможностью переноса функционала дефрагментации в stable-ветку, но посмотри как пойдут дела.
Поддерживающий выпуск стабильной ветки с исправлением обнаруженных ошибок и устранением недочётов.
Благодарности:
MDBX_MULTIPLE
regression). Big thank for assistance with debugging and testing.Новое:
MDBX_ENABLE_NON_READONLY_EXPORT
позволяющая использовать в режиме чтения-записи БД расположенных в файловых системах экспортированных через NFS. По-умолчанию опция выключена и при открытии в неэксклюзивном режиме чтения-записи БД расположенных файловых системах доступных извне по NFS будет возвращаться ошибка MDBX_EREMOTE
. Включение опции позволяет открывать БД в описанных выше ситуациях, но риск чтения неверных данных на удалённой стороне ложится на пользователя.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
для возможности увеличения без пенальти встроенного в экземпляр буфера места под данные.mdbx_cursor_close2()
возвращающая код ошибки.Исправления:
mdbx_env_set_geometry()
до её открытия. API предусматривает возможность запросить изменение геометрии/размера БД перед её открытием, чтобы избежать как лишних накладных расходов, так и потенциальных ошибок из-за нехватки адресного пространства. В этом сценарии ранее могло выдаваться лишнее/ненужное предупреждение о несоответствии файла БД новому размеру. Теперь этот недостаток исправлен.e6af7d7c53428ca2892bcbf7eec1c2acee06fd44
от 2023-11-05.e6af7d7c53428ca2892bcbf7eec1c2acee06fd44
от 2023-11-05.3de3d425a128a3c6f7866503f5f93b80c09dbe41
от 2024-05-19.mdbx_chk
с высоким уровнем логирования. Проблема возникала из-за неверной трактовки MDBX_NOTFOUND
при штатном окончании итерируемых данных.mdbx_chk -w
в сборах с поддержкой Valring/ASAN и под управлением этих инструментов.MDBX_TXN_CHECKOWNER=OFF
.tbl_setup(MDBX_DUPFIXED | MDBX_INTEGERDUP)
при работе в разных потоках. В реальных сценариях вероятность проявления проблемы была близка к нулю. Для подробностей смотрите комментарий коммита 3e91500fac475947f5b58268d5edd3c9cc4f77f6
.e6af7d7c53428ca2892bcbf7eec1c2acee06fd44
от 2023-11-05.MDBX_MULTIPLE
. Пакетная вставка значений посредством MDBX_MULTIPLE
могла приводить к падениям и повреждению структуры БД. Ошибка оставалось не замеченной из-за специфических условий проявления, которые не реализовались в тестах. Проблема присутствовала во всех выпусках начиная с v0.13.1, но соответствующая ошибка не связана с конкретным коммита в истории, а является следствием нескольких доработок (шагов рефакторинга), которые суммарно привели к регрессу. Технически ошибка обусловлена не-обнулением переменной, чего не происходило в некотором пути выполнения, так как исходно не требовалось. Однако, такое обнуление потребовалось после ряда этапов оптимизации и рефакторинга смежных участков кода. Для подробностей смотрите комментарий коммита 23a417fe19614481c6546845995d6dc845baf797
.MDBX_MVCC_RETARDED
и текста соответствующего сообщения.__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)
для курсоров открытых в одной из родительских транзакций. Причина в том, что в случае отмены вложенной транзакции возникает неконструктивная неопределенность — следует ли восстанавливать состояние курсоров. Если не восстанавливать, то получается что вложенная транзакция может поломать родительскую, сделав её продолжение невозможным. Если восстанавливать, то также следует «воскрешать» закрытые курсоры, что неизбежно приведет к путанице, утечкам памяти и использованию после освобождения.mdbx::cursor::txn()
.Прочие доработки:
-flto=auto
для GCC >= 11.4, расслабление условий для включения LTO для CLANG на Linux, расширение поиска LLVMgold.so
в относительных lib-директориях.MDBX_VALIDATION
и поддержка значений on
/off
для опций командной строки.cursor_check()
, cursor_reset()
и cursor_drown()
.[[атрибутов]]
для версий CLANG меньше 20.Поддерживающий выпуск стабильной ветки с исправлением обнаруженных ошибок и устранением недочётов.
Благодарности:
Новое:
Исправления:
21630ea115690a5cb39cfa921f9d199271a08102
.mdbx_env_resurrect_after_fork()
.cursor_touch()
. При переделке курсоров было пропущено отрицание в условии, при оценке количества страниц, которые могут потребоваться для выполнения операции. В текущем понимании ошибка не приводила к каким-либо проблемам, ибо оценка делает по верхней границе с существенным запасом, а в худшем случае это могло приводить к прерыванию транзакции из-за достижения ограничения на кол-во грязных страниц.recalculate_subpage_thresholds()
. Ошибка могла проявляться только в отладочных сборках при выставлении определенной комбинации предельных значений опций MDBX_opt_subpage_limit
, MDBX_opt_subpage_room_threshold
, MDBX_opt_subpage_reserve_prereq
, MDBX_opt_subpage_reserve_limit
.version_json_pathname
.Поддерживающий выпуск с исправлением обнаруженных ошибок и устранением недочетов в день рождения и в память об Серге́е Па́вловиче Королёве, советском учёном и Главном конструкторе ракетно-космических систем.
Одновременно с этим релизом:
0.12.x
перестаёт поддерживаться и отправляется в архив/0.12
.0.13.x
получает статус стабильной и вливается в stable
.Благодарности:
Новое:
mdbx_cursor_count_ex()
позволяющая получить как количество мульти-значений соответствующих текущему ключу, так и информацию о вложенном дереве хранящем эти значения.mdbx::txn::make_broken()
аналогичный mdbx_txn_break()
.Исправления:
Устранён регресс неразблокировки мьютекса при попытки повторного закрытия 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-файла, например при размещении БД на носителе доступном только для чтения.
Ошибка была внесена при реализации функционала парковки читающих транзакций.
Изменение поведения:
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
.default
-значений, в том числа для минимального и максимального размера. В результате, при создании БД с геометрией по-умолчанию не происходит выбор максимального размера страницы из-за очень большого максимального размера БД.mdbx_env_set_geometry()
доработаны эвристики для подбора параметров геометрии БД запрошенных пользователем "по-умолчанию".Поддерживающий выпуск с исправлением обнаруженных ошибок и устранением недочетов в день рождения и в память об Алекса́ндре Миха́йловиче Тата́рском, российском режиссёре-мультипликаторе, создавшем такие знаменитые мультфильмы как "Падал прошлогодний снег", "Пластилиновая ворона", заставку "Спокойной ночи, малыши!" и многие другие шедевры нашего детства.
Новое:
MDBX_PROBLEM
) в редких специфических условиях. Подробности см. в описании коммита 6c56ed97bbd8ca46abac61886a113ba31e5f1291
.C23
в CMake-скриптах сборки.char
/wchar_t
функций.VERSION.json
.SOURCE_DATE_EPOCH
для воспроизводимости сборок. Прежний способ посредством MDBX_BUILD_TIMESTAMP
также работает и имеет приоритет.MDBX_BUILD_METADATA
. Сейчас задаваемая информация просто включается внутрь библиотеки в качестве значения mdbx_build.metadata
, а в дальнейшем также будет использоваться при формировании пакетов и т.п.MDBX_LOG_DEBUG
(для логирования ошибок за вычетом MDBX_NOTFOUND
) или MDBX_LOG_TRACE
(для логирования всех ошибок, а также MDBX_RESULT_TRUE
).Изменение поведения:
mdbx::cursor::get_multiple_samelength()
и переименован mdbx::txn::put_multiple_samelength()
.MDBX_GET_MULTIPLE
теперь также возвращается значение самого ключа.mdbx::env::geometry
базовый тип изменен с беззнакового size_t
на знаковый intptr_t
.mdbx_txn_commit()
. Соглашение по API требует чтобы такие транзакции освобождались посредством mdbx_txn_abort()
, из-за чего функция mdbx_txn_commit()
возвращала ошибку в таких случаях, не разрушая сами транзакции. Это приводило к утечкам памяти из-за ошибок в приложениях, что побудило изменить поведение.__deprecated_enum
если он определен.C
теперь выполняется с учётом CMAKE_C_STANDARD
.MDBX_OSX_SPEED_INSTEADOF_DURABILITY
переименована в MDBX_APPLE_SPEED_INSTEADOF_DURABILITY
, так как актуальна для всех "Яблочных" платформ;MDBX_MMAP_USE_MS_ASYNC
переименована в MDBX_MMAP_NEEDS_JOLT
, для более точного соответствия своей семантики;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
при закрытии её дескриптора.mdbx::cursor::upper_bound()
и mdbx::cursor::upper_bound_multivalue()
.assert()
в пути обработки MDBX_GET/NEXT/PREV_MULTIPLE
.MDBX_MULTIPLE
.[[gnu::pure]]
в Apple Clang и MSVC.MDBX_DEPRECATED_ENUM
для старых компиляторов при включении С++11.std::experimental::filesystem
для решения проблем со сборкой в старых компиляторах.MDBX_GET_MULTIPLE
в специальных случаях и одного значения у ключа в позиции курсора.MDBX_ENABLE_DBI_SPARSE=OFF
.Мелочи:
MDBX_ENABLE_BIGFOOT
включена по-умолчанию вне зависимости от разрядности платформы.WIN32
вместо ${CMAKE_SYSTEM_NAME}
.dxb_resize()
.extra/open
.osal_jitter()
для уменьшения задержек в тестах под Windows.extra/crunched-delete
.extra/dupfix_multiple
.mdbx_dbi_close()
для случая хендлов измененных таблиц.extra/early_close_dbi
.stochastic.sh
..WAIT
для устранения коллизий при распараллеливании сборки посредстом GNU Make 4.4.Новая версия со сменой лицензии, существенным расширением API, добавлением функционала и внутренними переработками. В том числе, с незначительным нарушением обратной совместимости API библиотеки.
Новое:
COPYRIGHT
.mdbx_chk
внутрь библиотеки в виде функции mdbx_env_chk()
для проверка целостности структуры БД, в том числе с вовлечением логики приложения.MDBX_opt_gc_time_limit
для более гибкого контроля времени расходуемого на поиск последовательностей соседствующих свободных страниц в GC.MDBX_ENABLE_DBI_SPARSE
, которая включена по-умолчанию.MDBX_ENABLE_DBI_LOCKFREE
, которая включена по-умолчанию.mdbx_txn_park()
и mdbx_txn_unpark()
имеют дополнительные аргументы, позволяющие запросить автоматическую "распарковку" припаркованных и перезапуск вытесненных транзакций.<
, <=
, ==
, >=
, >
как для ключей, так и для пар ключ-значение.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
.mdbx_limits_keysize_min()
и mdbx_limits_valsize_min()
для получения нижней границы длины ключей и значений.mi_dxbid
структуры MDBX_envinfo
, получаемой посредством mdbx_env_info_ex()
.mdbx_cursor_unbind()
и mdbx_txn_release_all_cursors()
.mdbx_txn_copy2pathname()
и mdbx_txn_copy2fd()
.mdbx_copy
опций -d
и -p
.mdbx::cursor::estimate_result
, а поведение методов mdbx::cursor::estimate()
унифицировано с mdbx::cursor::move()
;mdbx::slice::invalid()
;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()
;to_hex()
и from_hex()
;std::string_view
для методов open_map
/create_map
/drop_map
/clear_map
/rename_map()
;mdbx::pair
;mdbx::slice
.Нарушение совместимости:
MDBX_COALESCE
объявлена устаревшей, так как соответствующий функционал всегда включен начиная с предыдущей версии 0.12.MDBX_NOTLS
объявлена устаревшей и заменена на MDBX_NOSTICKYTHREADS
.MDBX_USE_VALGRIND
заменена на общепринятую ENABLE_MEMCHECK
.MDBX_envinfo
серии полей вида meta1
, meta2
и meta3
заменены на массивы вида meta[3]
.mdbx::legacy_buffer
использован тип mdbx::default_buffer
использующий полиморфные аллокаторы С++ 17.DEFAULT_MAPSIZE
и изменение геометрии по-умолчанию при создании БД.MDBX_TXN_INVALID
(INT32_MIN
) вместо -1
из mdbx_txn_flags()
при передаче невалидной транзакции.Исправления:
TXN_END_EOTDONE
при сбое старта читающей транзакции. Упомянутый флажок отсутствовал в пути разрушения транзакции при ошибке её запуска. Из-за чего делалась попытка разрушить курсоры, что приводило к падению отладочных сборок, так как в них соответствующий массив намеренно заполнен некорректными указателями.SIGSEGV
внутри coherency_check()
после изменения геометрии другим процессом с увеличением верхнего размера БД и увеличением БД больше предыдущего лимита.Мелочи:
--read-var-info=yes
для Valgrind.mdbx_chk
информации об уровне детализации/verbosity.Технический тэг, отмечающий начало ветки 0.13
с новым функционалом и изменением API.
Поддерживающий выпуск с исправлением обнаруженных ошибок и устранением недочетов.
Это последний/консервирующий выпуск куста стабильных версий 0.12.x, спустя более двух лет после выпуска 0.12.1.
Значимые исправления:
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
для решения проблем со сборкой в старых компиляторах.Поддерживающий выпуск с исправлением обнаруженных ошибок и устранением недочетов, в память о советском ученом-энергетике Николае Антоновиче Доллежаль в день 125-летия со дня его рождения.
Это последний выпуск куста стабильных версий 0.12.x, спустя более двух лет после выпуска 0.12.1. Последующие выпуски 0.12.x будут формироваться только в случае существенных проблем/ошибок, вероятность чего близка к нулю. Для всех проектов находящихся в стадии активной разраборки рекомендуется использовать ветку master
.
Значимые исправления:
TXN_END_EOTDONE
при сбое старта читающей транзакции. Упомянутый флажок отсутствовал в пути разрушения транзакции при ошибке её запуска. Из-за чего делалась попытка разрушить курсоры, что приводило к падению отладочных сборок, так как в них соответствующий массив намеренно заполнен некорректными указателями.SIGSEGV
внутри coherency_check()
после изменения геометрии другим процессом с увеличением верхнего размера БД и увеличением БД больше предыдущего лимита.mdbx_close_dbi()
для возврата ошибки при попытке закрыть dbi-дескриптор таблицы, созданной и/или измененной в ещё выполняющейся транзакции. Такое преждевременное закрытие дескриптора является неверным использованием API и нарушением контракта/предусловий сформулированных в описании mdbx_close_dbi()
. Однако, вместо возврата ошибки выполнялось некорректное закрытие дескриптора, что могло приводить к созданию таблицы с пустым именем, утечки страниц БД и/или нарушению структуры b-tree (неверной ссылкой на корень таблицы). Добавлен соответствующий тест extra/early_close_dbi
.Поддерживающий выпуск с исправлением обнаруженных ошибок и устранением недочетов, в память об убитых в Крыму девочках 2 и 9 лет.
Лиза и Соня погибли 23 Июня 2024 на глазах у родителей, в результате удара по общественному городскому пляжу ракетами ATACMS с кассетными боеприпасами. Всего пострадало более 150 граждан России, в том числе 27 детей. Ракеты были выпущенными украинскими бандеровцами/фашистами, но полетные задания формировались и загружались военными США, а управление и наведение ATACAMS невозможно без использования орбитальной группировки военных спутников США.
Значимые исправления:
FILE_SEGMENT_ELEMENT
. Похоже что был потерян коммит входе работы над оптимизацией пути записи на диск в ОС Windows. В текущем понимании, вероятность проявления ошибки достаточно низкая, так как выявлена она была синтетическими тестами в ходе других доработок, а соответствующих сообщений/жалоб не поступало. К повреждению БД ошибка не приводила, так как сбой происходил до записи данных с возвратом ERROR_INVALID_PARAMETER
из системного вызова, т.е. либо ошибка не проявлялась, либо транзакция не фиксировалась.SIGSEGV
при включении логирования уровня MDBX_LOG_TRACE
в отладочных сборках.key_exists
в C++ API.MDBX_EINVAL
для случая вызова mdbx_env_remove(".")
.env::remove()
в C++ API.равно
/неравно
в условии внутри update_gc()
. Существенных последствий ошибки не было, но в определенных сценариях, сходимость требовала еще одного цикла повтора внутри update_gc().Прочие доработки:
FormatMessageA()
от концевых переводов строк.__always_inline
для особо яблочных версий CLANG.\n
вместо std::endl
в C++ API для разделения строк в кодировщиках данных.txn_merge()
.MDBX_DEPRECATED
.__cold
для редко-используемых функций (backport).buffer::append_bytes()
и buffer::clear_and_reserve()
.Поддерживающий выпуск с исправлением обнаруженных ошибок и устранением недочетов в память Героя России гвардии майора Дмитрия Семёнова с позывным "СЭМ".
Благодарности:
MDBX_CORRUPTED
в сценарии работы в режиме MDBX_DUPFIXED
и нечетной длиной мульти-значений, с предоставлением точного минимального сценария воспроизведения.Значимые исправления и доработки:
Устранение унаследованной от LMDB ошибки приводящей к повреждению БД при использовании MDBX_DUPFIXED
. Проблема была выявлена при расширении тестов сценариями с длинными мульти-значениями в режиме MDBX_DUPFIXED
. Сообщений о проявлении этой ошибки в эксплуатационных/продуктовых средах не поступало.
На LEAF2-страниц, используемых для компактного хранения мульти-значений фиксированной длины, выполнялось резервирование места без учета возможности превышения размера страниц, с последующим переполнением, повреждением структуры БД и/или повреждением содержимого ОЗУ.
Вероятность проявления ошибки существенно увеличивалась с увеличением размера/длины мульти-значений/дубликатов и уменьшением размера страницы БД. Поэтому при использовании MDBX_INTEGERDUP
вероятность проявления близка к нулю, а сценарий такого проявления найти не удалось.
В MDBX ошибка присутствовала с момента отделения проекта от LMDB, где эта ошибка присутствует более 11 лет, по настоящее время.
MDBX_CORRUPTED (-30796)
в сценарии работы в режиме MDBX_DUPFIXED
и нечетной длиной мульти-значений.rebalance()
ради уменьшения WAF. Новый функционал, включая контролируемую пользователем опцию enum MDBX_option_t
, будет доступен в выпусках ветки 0.13.x
, а в этом выпуске доработка сводится к тактике не-вовлечения чистой страницы при нехватке запаса страниц в ходе обновления GC, за счет ухудшения баланса дерева страниц.me_dxb_mmap.curren > me_dxb_mmap.limit
при "дребезге" размера БД. В текущем понимании, последствий кроме срабатывания assert-проверки нет, а вероятность проявления близка к нулю.mdbx_chk
, подсчета места затраченного на выравнивание на вложенной под-странице, в случае нечетного количества dupfixed-элементов нечетного размера. Сообщений о проявлении этой ошибки в эксплуатационных/продуктовых средах не поступало.check_txn()
для случая завершенных транзакций в режиме MDBX_NO_TLS
. Последствий ошибки, кроме срабатывания assert-проверки в отладочных сборках, нет.mdbx_chk
, которые приводили к ложно-позитивным ошибкам при проверке БД после серии последних доработок. Подробности см в комментариях к коммитам 781b3f64d52b73cbaeb00a55811d1247c25624a8 и 0741c81cfd8dc0864fcf55e04192b2207c8f68f7.Прочее:
MDBX_TXN_DRAINED_GC
.cursor_put_nochecklen()
.node_shrink()
для ясности исходного кода.extra/dupfixed_addodd
.Стабилизирующий выпуск с исправлением обнаруженных ошибок и устранением недочетов.
Исправления и доработки:
MDBX_ENABLE_PREFAULT
, из-за чего опция MDBX_ENABLE_MINCORE
не включалась автоматически, что приводило к не-активации соответствующего улучшения и не-достижению декларируемого уровня производительности в сценариях использования в режиме MDBX_WRITEMAP
.MDBX_ENV_CHECKPID
при отключении использования функционала madvise()
посредством опции сборки MDBX_ENABLE_MADVISE=0
. Из-за чего при поддержке системой madvise(MADV_DONTFORK)
не включался контроль pid.NULL
при обработке MDBX_GET_MULTIPLE
.coherency_check()
.const
для начала и конца диапазона в аргументах mdbx_estimate_range()
.mdbx::cursor::estimate_result
, а поведение методов cursor::estimate()
унифицировано с cursor::move()
;slice::invalid()
;buffer::move_assign_alloc
и buffer::copy_assign_alloc
;mdbx::default_buffer
;hex_decode()
, base64_decode()
, base58_decode()
;mdbx::comparator
и функций mdbx::default_comparator()
;buffer::hex()
, base64()
, base58()
;get_/set_context
;cursor::clone()
;to_hex()
и from_hex()
.MDBX_opt_rp_augment_limit
по умолчанию до 1/3 от текущего количества страниц в БД.Мелочи:
mdbx_set_compare()
и mdbx_set_dupsort()
.MDBX_LAST_ADDED_ERRCODE
.mdbx::duplicated_lck_file
.const MDBX_txn
где это возможно.MDBX_EAGAIN
.std::stoull()
.Стабилизирующий выпуск с исправлением обнаруженных ошибок и устранением недочетов, в день 100-летия со дня рождения выдающегося советского и российского ученого и конструктора Влади́мира Фёдоровича У́ткина.
Благодарности:
MDBX_MULTIPLE
и помощь в тестировании.Исправления и доработки:
put(MDBX_MULTIPLE)
при пакетном/оптовом помещении в БД множественных значений одного ключа (aka multi-value или dupsort). Проявление проблемы зависит от компилятора и опций оптимизации/кодогенерации, но с большой вероятностью возвращается ошибка MDBX_BAD_VALSIZE
(-30781
), а в отладочных сборках срабатывает проверка cASSERT(mc, !"Invalid key-size")
. Сценарии приводящие к другим проявлениям на данный момент не известны.mdbx_put(MDBX_CURRENT)
всех текущих мульти-значений ключа при отсутствии флага MDBX_NOOVERWRITE
. Ранее в такой ситуации возвращалась ошибка MDBX_EMULTIVAL
. В текущем понимании новое поведение более удобно и не создаёт проблем совместимости с ранее написанным кодом.mdbx_cursor_get(MDBX_GET_MULTIPLE)
без предварительной установки курсора, совмещая операцию пакетного получения данных с позиционированием курсора на передаваемый ключ.cursor_put_nochecklen()
в продолжение исправления регресса/ошибки в пути обработки put(MDBX_MULTIPLE)
.SIGSEGV
и недопустимости прямого изменения данных.Мелочи:
MDBX_ENABLE_PROFGC=ON
.slice::as_pod<typename>()
в C++ API.txn::put_multiple()
и контроля POD в C++ API.put(MDBX_MULTIPLE)
.EDEADLK
в ряде сценариев при использовании Valgrind или ASAN. В частности, это устраняет ложно-негативный результат проверки БД посредством mdbx_chk -wc
, т.е. проверку БД в кооперативном (не эксклюзивном) режиме чтения-записи в сборках с поддержкой Valgrind или включеным ASAN. Для более подробной информации см. соответствующий коммит.mdbx_dump_val()
используемой для логирования и отладки.filesystem
для старых компиляторов.osal_thread_self()
.Стабилизирующий выпуск с исправлением обнаруженных ошибок и устранением недочетов, в день основания международного детского центра «Арте́к».
Исправления и доработки:
Исправление опечатки в имени переменной внутри mdbx_env_turn_for_recovery()
, что приводило к неверному поведению в некоторых ситуациях.
С точки зрения пользователя, с учетом актуальных сценариев использования утилиты mdbx_chk
, был только один специфический/редкий сценарий проявления ошибки/проблемы - когда выполнялась проверка и активация слабой/weak мета-страницы с НЕ-последней транзакцией после системной аварии машины, где БД использовалась в хрупком/небезопасном режиме. В сценарии, при успешной проверке целевой страницы и её последующей активации выводилось сообщение об ошибке, связанной со срабатыванием механизма контроля не-когерентности кэша файловой системы и отображенных в ОЗУ данных БД. При этом БД успешно восстанавливалось и не было каких-либо негативных последствия, кроме самого сообщения об ошибке.
Технически же ошибка проявлялась при "переключении" на мета-страницу, когда у хотя-бы одной из двух других мета-страниц номер транзакции был больше:
-m32 -arch=i686 -Ofast
. Проблема обусловлена ошибкой GCC, из-за которой конструкция __attribute__((__target__("sse2")))
не включает полноценное использование инструкций SSE и SSE2, если это не было сделано посредством опций командной строки, но была использована опция -Ofast
. В результате сборка заканчивалась сообщением об ошибке: ‘error: inlining failed in call to 'always_inline’ '_mm_movemask_ps': target specific option mismatch`Доработка режима "восстановления" БД и переключения на заданную мета-страницу:
Теперь при открытии БД посредством mdbx_env_open_for_recovery()
не выполняется неявное изменение/обновление БД, в том числе при закрытии БД. Это позволяет обезопасить БД (снизить шанс её разрушения) если пользователь при попытке восстановления, либо просто в качестве эксперимента, задал утилите mdbx_chk
неверную или опасную комбинацию параметров. При этом обычная проверка, как и явное переключение мета-страниц, работают по-прежнему.
Мелочи:
std::filesystem
, проверяющего необходимость линковки с дополнительными библиотеками C++.mdbx_canary_put()
.Стабилизирующий выпуск с исправлением обнаруженных ошибок и устранением недочетов, в день 100-летнего юбилея спортивного клуба «ЦСКА».
Мелочи:
enum
-типов вместо int
для устранения предупреждений GCC 13, что могло ломать сборку в Fedora 38.Стабилизирующий выпуск с исправлением обнаруженных ошибок и устранением недочетов, в день 100-летнего юбилея спортивного общества «Динамо».
Благодарности:
@calvin3721
за сообщение о проблеме работы MainDB
с флагами не по-умолчанию.Исправления:
MainDB
с флагами/опциями предполагающим использование специфического компаратора (не по-умолчанию).Мелочи:
node_read_bigdata()
.mdbx_env_set_geometry()
.extra/upsert_alldups
для специфического сценария замены/перезаписи одним значением всех multi-значений соответствующих ключу, т.е. замена всех «дубликатов» одним значением.buffer::key_from()
с явным именованием по типу данных.extra/maindb_ordinal
для специфического сценария создания MainDB
с флагами требующими использования компаратора не по-умолчанию.osal_vasprintf()
для устранения предупреждений статических анализаторов.Стабилизирующий выпуск с исправлением обнаруженных ошибок, устранением недочетов и технических долгов. Ветка 0.12 считается готовой к продуктовому использованию, получает статус стабильной и далее будет получать только исправление ошибок. Разработка будет продолжена в ветке 0.13, а ветка 0.11 становится архивной.
Благодарности:
put(MDBX_UPSERT+MDBX_ALLDUPS)
для случая замены всех значений в subDb.Исправления:
dxb_resize()
, в том числе, для устранения срабатывания assert-проверки size_bytes == env->me_dxb_mmap.current
в специфических многопоточных сценариях использования. Проверка срабатывала только в отладочных сборках, при специфическом наложении во времени читающей и пишущей транзакции в разных потоках, одновременно с изменением размера БД. Кроме срабатывание проверки, каких-либо других последствий не возникало.put(MDBX_UPSERT+MDBX_ALLDUPS)
для случая замены всех значений единственного ключа в subDb. В ходе этой операции subDb становится полностью пустой, без каких-либо страниц и именно эта ситуация не была учтена в коде, что приводило к повреждению БД при фиксации такой транзакции.override_meta()
. Что в отладочных сборках могло приводить к ложным срабатываниям при восстановлении БД, в том числе при автоматическом откате слабых мета-страниц.__cold
/__hot
, в том числе для устранения проблемы error: inlining failed in call to ‘always_inline FOO(...)’: target specific option mismatch
при сборке посредством GCC >10.x для SH4.Ликвидация технических долгов и мелочи:
MDBX_EKEYMISMATCH
в режиме MDBX_APPEND
.mdbx_chk
из CMake-тестов для проверки как в обычном, так и эксклюзивном режимах чтения-записи.const
и noexcept
для нескольких методов в C++ API.wchar
-преобразования путей.mdbx_env_get_path()
для получения пути к БД в формате многобайтных символов.test/stochastic.sh
, добавлена опция --extra
.mdbx::extra_runtime_option
, аналогично enum MDBX_option_t
из C API.mdbx_stat
.Выпуск с существенными доработками и новой функциональностью в память о закрытом open-source проекте "Акула".
Добавлена prefault-запись, переделан контроль “некогерентности” unified page/buffer cache, изменена тактика слияния страниц и т.д. Стало ещё быстрее, в некоторых сценариях вдвое.
Благодарности:
Новое:
Реализована prefault-запись при выделении страниц для read-write отображений. Это приводит к кратному снижению системных издержек и существенному увеличению производительности в соответствующих сценариях использования, когда:
MDBX_WRITEMAP
;В режиме MDBX_WRITEMAP
выделение/переиспользование страниц приводит к page-fault и чтению страницы с диска, даже если содержимое страницы не нужно (будет перезаписано). Это является следствием работы подсистемы виртуальной памяти, а штатный способ лечения через MADV_REMOVE
работает не на всех ФС и обычно дороже получаемой экономии.
Теперь в libmdbx используется "упреждающая запись" таких страниц, которая на системах с unified page cache приводит к "вталкиванию" данных, устраняя необходимость чтения с диска при обращении к такой странице памяти.
Новый функционал работает в согласованности с автоматическим управлением read-ahead и кэшем статуса присутствия страниц в ОЗУ, посредством mincore().
MDBX_opt_prefault_write_enable
для возможности принудительного включения/выключения prefault-записи.Реализован динамический выбор между сквозной записью на диск и обычной записью с последующим fdatasync() управляемый опцией MDBX_opt_writethrough_threshold
.
В долговечных (durable) режимах данные на диск могут быть сброшены двумя способами:
O_DSYNC
;fdatasync()
.Первый способ выгоднее при записи малого количества страниц и/или если канал взаимодействия с диском/носителем имеет близкую к нулю задержку. Второй способ выгоднее если требуется записать много страниц и/или канал взаимодействия имеет весомую задержку (датацентры, облака). Добавленная опция MDBX_opt_writethrough_threshold
позволяет во время выполнения задать порог для динамического выбора способа записи в зависимости от объема и конкретных условия использования.
MDBX_opt_rp_augment_limit
в зависимости от размера БД.MDBX_WRITEMAP
между процессами в режимах с отложенной/ленивой записью, так как в этом случае невозможно обеспечить сброс данных на диск во всех случаях на всех поддерживаемых платформах.Добавлена опция сборки MDBX_MMAP_USE_MS_ASYNC
позволяющая отключить использование системного вызова msync(MS_ASYNC)
, в использовании которого нет необходимости на подавляющем большинстве актуальных ОС. По-умолчанию MDBX_MMAP_USE_MS_ASYNC=0
(выключено) на Linux и других системах с unified page cache. Такое поведение (без использования msync(MS_ASYNC)
) соответствует неизменяемой (hardcoded) логике LMDB. В результате, в простых/наивных бенчмарках, libmdbx опережает LMDB примерно также как при реальном применении.
На всякий случай стоит еще раз отметить/напомнить, что на Windows предположительно libmdbx будет отставать от LMDB в сценариях с множеством мелких транзакций, так как libmdbx осознанно использует на Windows файловые блокировки, которые медленные (плохо реализованы в ядре ОС), но позволяют застраховать пользователей от массы неверных действий приводящих к повреждению БД.
tls_model("local-dynamic")
для обхода проблемы relocation R_X86_64_TPOFF32 against FOO cannot be used with -shared
из-за ошибки в CLANG приводящей к использованию неверного режима tls_model
.Исправления (без корректировок новых функций):
mdbx_env_sync()
из параллельного потока выполнения вне работающей транзакции.MDBX_WRITEMAP
, из-за чего освободившиеся страницы использовались не немедленно, а попадали в retired-список совершаемой транзакции и происходил необоснованный рост размера транзакции.free()
в ситуациях повторного открытия среды посредством mdbx_env_open()
.MDBX_WRITEMAP
никогда не вызывался msync()
. Проблема существует только в релизе 0.12.2.MDBX_WRITEMAP
для предоставления посредством mdbx_txn_info()
актуальной информации об объеме изменений в процессе транзакций чтения-записи.#if
определения порядка байт.MDBX_PNL_ASCENDING=1
.Ликвидация технических долгов и мелочи:
page_alloc_slowpath()
.pnl_merge()
для случаев неперекрывающихся объединяемых списков.dpl_append()
.mdbx_chk
при обработке пользовательских записей в @MAIN
.Выпуск с существенными доработками и новой функциональностью в память о российском борце Иване Сергеевиче Ярыгине.
На Олимпийских играх в Мюнхене в 1972 году Иван Ярыгин уложил всех соперников на лопатки, суммарно затратив менее 9 минут. Этот рекорд никем не побит до сих пор.
Новое:
MDBX_ENABLE_PROFGC=1
.mdbx_env_warmup()
для "прогрева" БД с возможностью закрепления страниц в памяти. В утилиты mdbx_chk
, mdbx_copy
и mdbx_dump
добавлены опции -u
и -U
для активации соответствующего функционала.MDBX_WRITEMAP
при MDBX_AVOID_MSYNC=0
). Доработка позволяет снизить накладные расходы и была запланирована давно, но откладывалась так как требовала других изменений.MDBX_opt_txn_dp_limit
, MDBX_opt_spill_max_denominator
, MDBX_opt_spill_min_denominator
и была запланирована давно, но откладывалась так как требовала других изменений.MDBX_DATANAME
, MDBX_LOCKNAME
и MDBX_LOCK_SUFFIX
.size_t
для уменьшения накладных расходов на платформе Эльбрус.mdbx_limits_valsize4page_max()
и mdbx_env_get_valsize4page_max()
возвращающие максимальный размер в байтах значения, которое может быть размещена в одной large/overflow-странице, а не последовательности из двух или более таких страниц. Для таблиц с поддержкой дубликатов вынос значений на large/overflow-страницы не поддерживается, поэтому результат совпадает с mdbx_limits_valsize_max()
.mdbx_limits_pairsize4page_max()
и mdbx_env_get_pairsize4page_max()
возвращающие в байтах максимальный суммарный размер пары ключ-значение для их размещения на одной листовой страницы, без выноса значения на отдельную large/overflow-страницу. Для таблиц с поддержкой дубликатов вынос значений на large/overflow-страницы не поддерживается, поэтому результат определяет максимальный/допустимый суммарный размер пары ключ-значение.WriteGather()
. Это позволяет сократить накладные расходы и частично обойти проблемы Windows с низкой производительностью ввода-вывода, включая большие задержки FlushFileBuffers()
. Новый код также обеспечивает консолидацию записываемых регионов на всех платформах, а на Windows использование событий (events) сведено к минимум, одновременно с автоматических использованием WriteGather()
. Поэтому ожидается существенное снижение накладных расходов взаимодействия с ОС, а в Windows это ускорение, в некоторых сценариях, может быть кратным в сравнении с LMDB.MDBX_AVOID_MSYNC
, которая определяет поведение libmdbx в режиме MDBX_WRITE_MAP
(когда данные изменяются непосредственно в отображенных в ОЗУ страницах БД):MDBX_AVOID_MSYNC=0
(по умолчанию на всех системах кроме Windows), то (как прежде) сохранение данных выполняется посредством msync()
, либо FlushViewOfFile()
на Windows. На платформах с полноценной подсистемой виртуальной памяти и адекватным файловым вводом-выводом это обеспечивает минимум накладных расходов (один системный вызов) и максимальную производительность. Однако, на Windows приводит к значительной деградации, в том числе из-за того что после FlushViewOfFile()
требуется также вызов FlushFileBuffers()
с массой проблем и суеты внутри ядра ОС.MDBX_AVOID_MSYNC=1
(по умолчанию только на Windows), то сохранение данных выполняется явной записью в файл каждой измененной страницы БД. Это требует дополнительных накладных расходов, как на отслеживание измененных страниц (ведение списков "грязных" страниц), так и на системные вызовы для их записи. Кроме этого, с точки зрения подсистемы виртуальной памяти ядра ОС, страницы БД измененные в ОЗУ и явно записанные в файл, могут либо оставаться "грязными" и быть повторно записаны ядром ОС позже, либо требовать дополнительных накладных расходов для отслеживания PTE (Page Table Entries), их модификации и дополнительного копирования данных. Тем не менее, по имеющейся информации, на Windows такой путь записи данных в целом обеспечивает более высокую производительность.C++
API добавлены методы фиксации транзакции с получением информации о задержках.MDBX_HAVE_BUILT IN_CPU_SUPPORTS
build option to control use GCC's __builtin_cpu_supports()
function, which could be unavailable on a fake OSes (macos, ios, android, etc).Исправления (без корректировок вышеперечисленных новых функций):
struct troika
.MDBX_BUSY
из функций mdbx_env_set_option()
, mdbx_env_set_syncbytes()
и mdbx_env_set_syncperiod()
.mremap()
.stdatomic.h
из GNU Lib C, где макросы ATOMIC_*_LOCK_FREE
ошибочно переопределяются через функции.fcntl64(F_GETLK64/F_SETLK64/F_SETLKW64)
при наличии. Это решает проблему срабатывания проверочного утверждения при сборке для платформ где тип off_t
шире соответствующих полей структуры flock
, используемой для блокировки файлов.mdbx_tid_t
для устранения предупреждений.MDBX_SAFE_NOSYNC
при обновлении GC.MDBX_APPENDDUP
inside mdbx_cursor_put()
which could result in returning MDBX_EKEYMISMATCH
for valid cases.clz()
bug (by using _BitScanReverse()
, only MSVC builds affected).Мелочи:
MDBX_debug_func
и MDBX_debug_func
.me_options.dp_limit
в отладочных сборках.gcc-riscv64-linux-gnu
в список для цели cross-gcc
.stochastic.sh
для работы в Windows.LockFileEx()
внутри mdbx_env_copy()
._CrtDbgReport()
в отладочных сборках.oldest_reader
inside txn_end()
.MDBX_NODUPDATA
.The planned frontward release with new superior features on the day of 20 anniversary of Positive Technologies.
New:
Big Foot
feature which significantly reduces GC overhead for processing large lists of retired pages from huge transactions. Now libmdbx avoid creating large chunks of PNLs (page number lists) which required a long sequences of free pages, aka large/overflow pages. Thus avoiding searching, allocating and storing such sequences inside GC.Troika
. The minimum of memory barriers, reads, comparisons and conditional transitions are used.MDBX_VALIDATION
environment options to extra validation of DB structure and pages content for carefully/safe handling damaged or untrusted DB.gcrtime_seconds16dot16
counter to the "Page Operation Statistics" that accumulates time spent for GC searching and reclaiming.C
and C++
APIs has been extended and/or refined to simplify using wchar_t
pathnames. On Windows the mdbx_env_openW()
, mdbx_env_get_pathW()
, mdbx_env_copyW()
, mdbx_env_open_for_recoveryW()
are available for now, but the mdbx_env_get_path()
has been replaced in favor of mdbx_env_get_pathW()
.MDBX_MANAGE_BUILD_FLAGS
build options for CMake.bsearch
/lower_bound
implementation using branchless tactic, including workaround for CLANG x86 optimiser bug.Fixes:
__cxa_thread_atexit()
on Apple's OSes.MDBX_EINVAL
which breaks MingGW builds with CLANG.Not a release but preparation for changing feature set and API.
For early releases and changes see the ChangeLog-NN the git commit history.