English version by liar Google and by Yandex.
Благодарности:
Новое:
mdbx_cursor_count_ex()
позволяющая получить как количество мульти-значений соответствующих текущему ключу, так и информацию о вложенном дереве хранящем эти значения.Исправления:
Устранён регресс состояния вложенного/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 лет назад и долго оставалось не замеченной.
Изменение поведения:
MDBX_ENABLE_PROFGC=ON
) подсчитываются затраты времени ЦПУ на слияние списков страниц, т.е. на работу функции pnl_merge()
.data.dups
в data.multi
.Поддерживающий выпуск с исправлением обнаруженных ошибок и устранением недочетов в день рождения и в память об Алекса́ндре Миха́йловиче Тата́рском, российском режиссёре-мультипликаторе, создавшем такие знаменитые мультфильмы как "Падал прошлогодний снег", "Пластилиновая ворона", заставку "Спокойной ночи, малыши!" и многие другие шедевры нашего детства.
Новое:
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.
Поддерживающий выпуск с исправлением обнаруженных ошибок и устранением недочетов, в память о советском ученом-энергетике Николае Антоновиче Доллежаль в день 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.
The stable bugfix release in memory of Sergey Kapitsa on his 95th birthday.
Fixes:
||
inside #if
byte-order condition.SIGSEGV
or an erroneous call to free()
in situations where errors occur when reopening by mdbx_env_open()
of a previously used environment.cursor_put_nochecklen()
internals for case when dupsort'ed named subDb contains a single key with multiple values (aka duplicates), which are replaced with a single value by put-operation with the MDBX_UPSERT+MDBX_ALLDUPS
flags. In this case, the database becomes completely empty, without any pages. However exactly this condition was not considered and thus wasn't handled correctly. See issue#8 for more information.override_meta()
, which could lead to false-positive failing of the assertion in a debug builds during DB recovery and auto-rollback.__cold
/__hot
macros to avoid the error: inlining failed in call to ‘always_inline FOO(...)’: target specific option mismatch
issue during build using GCC >10.x for SH4 arch.Minors:
__asan_default_options()
.const
and noexcept
for few C++ API methods.used uninitialized
warning from GCC >10.x while build for SH4 arch.The stable bugfix release in memory of Boris Yuryev on his 133rd birthday.
Fixes:
fcntl64()
(backport).stdatomic.h
versions, where the ATOMIC_*_LOCK_FREE
macros mistakenly redefined using functions (backport).mremap()
defect to avoid assertion failure (backport).encryptfs
bug(s) in the copy_file_range
implementation (backport).MDBX_BUSY
from mdbx_env_set_option()
, mdbx_env_set_syncbytes()
and mdbx_env_set_syncperiod()
(backport).Minors:
--help
for mdbx_test
(backport).devel
branch.--dont-check-ram-size
for small-tests make-targets (backport).The stable bugfix release.
Fixes:
off_t
type is wider than corresponding fields of struct flock
used for file locking (backport). Now libmdbx will use fcntl64(F_GETLK64/F_SETLK64/F_SETLKW64)
if available.page_retire_ex()
(backport).Minors:
-Wint-to-pointer-cast
warnings while casting to mdbx_tid_t
(backport).LockFileEx()
inside mdbx_env_copy()
(backport).The stable bugfix release.
Fixes:
MDBX_APPENDDUP
inside mdbx_cursor_put()
which could result in returning MDBX_EKEYMISMATCH
for valid cases.oldest_reader
inside mdbx_txn_end()
.MDBX_INTERNAL_FUNC
for mdbx_w2mb()
and mdbx_mb2w()
.The stable bugfix release.
New:
wchar_t
in path names.Fixes:
__cxa_thread_atexit()
on Apple's OSes.MultiByteToWideChar(CP_THREAD_ACP)
instead of mbstowcs()
.MDBX_EINVAL
which breaks MingGW builds with CLANG.Minors:
ldd
to check used dso.MDBX_WEAK_IMPORT_ATTRIBUTE
macro.env_set_geometry()
called within a write transaction.iov_page()
failure case.The stable bugfix release.
Acknowledgments:
New:
MDBX_LOCK_SUFFIX
, MDBX_DATANAME
, MDBX_LOCKNAME
just by predefine ones during build.mdbx::env_managed
's methods a few overloads with const char* pathname
parameter (C++ API).Fixes:
MDBX_ENVCOPY_WRITEBUF
.#include AvailabilityMacros.h>
).MDBX_PAGE_FULL
error in rare cases with large database page sizes.Minors:
meta_checktxnid()
.meta_checktxnid()
to avoid assertion in debug mode.mdbx_env_set_geometry()
to avoid returning EINVAL
in particular rare cases.--pagesize NN
option to long-stotastic test script.has no symbols
warning from Apple's ranlib.The stable release with an important fixes and workaround for the critical macOS thread-local-storage issue.
Acknowledgments:
New:
MDBX_NOSUCCESS_EMPTY_COMMIT
build option to return non-success result (MDBX_RESULT_TRUE
) on empty commit.Fixes:
SIGSEGV
(nullptr dereference) in the exclusive/no-lck mode.SIGSEGV
regression in without-LCK (exclusive read-only) mode.mdbx_check_fs_local()
for CDROM case on Windows.MDBX_CORRUPTED
error in a rare execution path, when the size of the thread-ID type not equal to 8.macOS
during finalization/cleanup of thread(s) that executed read transaction(s). Minors:The issue was suddenly discovered by a CI after adding an iteration with macOS 11 "Big Sur", and then reproduced on recent release of macOS 12 "Monterey". The issue was never noticed nor reported on macOS 10 "Catalina" nor others. Analysis shown that the problem caused by a change in the behavior of the system library (internals of dyld and pthread) during thread finalization/cleanup: now a memory allocated for a
__thread
variable(s) is released before execution of the registered Thread-Local-Storage destructor(s), thus a TLS-destructor will write-after-free just by legitime dereference any__thread
variable. This is unexpected crazy-like behavior since the order of resources releasing/destroying is not the reverse of ones acquiring/construction order. Nonetheless such surprise is now workarounded by using atomic compare-and-swap operations on a 64-bit signatures/cookies.
release-assets
GNU Make target.mdbx_fetch_sdb()
to help debugging complex DBI-handels use cases.std::filesystem
.git fame
to generated docs.mdbx_assert_fail()
to public API (mostly for backtracing).__cpp_lib_concepts >= 202002
.The stable risen release after the Github's intentional malicious disaster.
The origin for now is at GitFlic since on 2022-04-15 the Github administration, without any warning nor explanation, deleted libmdbx along with a lot of other projects, simultaneously blocking access for many developers. For the same reason Github is blacklisted forever.
GitFlic already support Russian and English languages, plan to support more, including 和 中文. You are welcome!
New:
tools-static
make target to build statically linked MDBX tools.mdbx::filesystem
C++ API namespace that corresponds to std::filesystem
or std::experimental::filesystem
.https://web.archive.org/web/https://github.com/erthink/libmdbx
for dead (or temporarily lost) resources deleted by --loglevel=
command-line option to the mdbx_test
tool.Fixes:
SIGSEGV
in the cursor tracking code.MDBX_EPERM
error returned from mdbx_env_set_geometry()
.libstdc++fs
/libc++fs
/libc++experimental
for C++ std::filesystem
or std::experimental::filesystem
for legacy compilers.static constexpr
member field.C++20
concepts accessibility._FILE_OFFSET_BITS=64
for Android that is problematic for 32-bit Bionic.MDBX_WITHOUT_MSVC_CRT=ON
and MDBX_BUILD_SHARED_LIBRARY=ON
.Minors:
/INCREMENTAL[:YES]
with /LTCG
, /W4
with /W3
, the C5105
warning.MDBX_EPERM
instead of MDBX_RESULT_TRUE
to indicate that the geometry cannot be updated.NULL
checking during memory allocation inside mdbx_chk
.target_include_directories()
to CMakeLists.txt
for easy integration.off_t
arguments of fcntl()
which are used for locking.-Wno-lto-type-mismatch
to avoid false-positive warnings from old GCC during LTO-enabled builds.pthread_mutex_lock()
.MDBX_BUILD_TARGET
of CMake builds.CMAKE_HOST_ARCH
and CMAKE_HOST_CAN_RUN_EXECUTABLES_BUILT_FOR_TARGET
.The stable release with the complete workaround for an incoherence flaw of Linux unified page/buffer cache. Nonetheless the cause for this trouble may be an issue of Intel CPU cache/MESI. See issue#269 for more information.
Acknowledgments:
Fixes:
mdbx::cursor::find_multivalue()
.Minors:
lib-static
and lib-shared
targets for make.The release with the temporary hotfix for a flaw of Linux unified page/buffer cache. See issue#269 for more information.
Acknowledgments:
Fixes:
SIGSEGV
while open DB with overrided non-default page size.mdbx_env_open()
idempotence in failure cases.mdbx_update_gc()
to avoid non-reclamation in a rare cases.Minors:
__attribute__((__pure__))
) to avoid compiler misoptimization.__ARM_FEATURE_UNALIGNED
defined.The stable release with fixes for large and huge databases sized of 4..128 TiB.
Acknowledgments:
New features, extensions and improvements:
UINT64_MAX
value as maximum for given option inside mdbx_env_set_option()
.to_hex/to_base58/to_base64::output(std::ostream&)
overloads without using temporary string objects as buffers.--geometry-jitter=YES|no
option to the test framework.Fixes:
MDBX_opt_rp_augment_limit
for GC's records from huge transactions (Erigon/Akula/Ethereum).sys/sem.h
).mdbx::move_result
.&
for std::ostream &operator<<()
overloads.EXDEV
(Cross-device link) error from mdbx_env_copy()
.pgno_t
during checking PNL on 64-bit platforms.MAX_PAGENO
and DB upper-size geometry limit.Minors:
pthread_barrier_t
stub).unused parameter
warning.\n
at the end.-fno-semantic interposition
option to reduce the overhead to calling self own public functions.Acknowledgments:
New features, extensions and improvements:
mdbx_cursor_get_batch()
.MDBX_SET_UPPERBOUND
.Fixes:
MDBX_SHRINK_ALLOWED
with MDBX_ACCEDE
.Minors:
MDBX_RESULT_TRUE
(unexpected -1) from mdbx_env_set_option()
.mdbx_env_get_syncbytes()
and mdbx_env_get_syncperiod()
.MDBX_INTEGERKEY
.mdbx_env_sync_internal()
.mdbx_cursor_put()
for MDBX_DUPFIXED
cases.mdbx_env_info_ex()
.mdbx_override_meta()
to avoid false-positive assertions.MDBX_ENODATA
for some cases.Acknowledgments:
Fixes:
devtoolset-9
on CentOS/RHEL 7.MDBX_PROBLEM
error because of update an obsolete meta-page.MDBX_NOTFOUND
error in case an inexact value found for MDBX_GET_BOTH
operation.Minors:
constexpr
-related macros for legacy compilers.using an environment variable.
Simplified collection statistics of page operation .
Added
MDBX_FORCE_BUILD_AS_MAIN_PROJECTcmake option.
Remove unneeded
#undef P_DIRTY`.The database format signature has been changed to prevent forward-interoperability with an previous releases, which may lead to a false positive diagnosis of database corruption due to flaws of an old library versions.
This change is mostly invisible:
Acknowledgments:
Unfortunately, the v0.10.5
accidentally comes not full-compatible with previous releases:
v0.10.5
can read/processing DBs created by previous releases, i.e. the backward-compatibility is provided;v0.10.5
, i.e. the forward-compatibility is broken for v0.10.4
and earlier.This cannot be fixed, as it requires fixing past versions, which as a result we will just get a current version. Therefore, it is recommended to use v0.11.1
instead of v0.10.5
.
Acknowledgments:
Fixes:
#pragma pack
fix for modern compilers.mdbx_chk
utility.Minors:
@MAIN
and @GC
sub-databases of a last committed modification transaction's ID.Acknowledgments:
Fixes:
#pragma pack
to avoid provoking some compilers to generate code with unaligned access.noexcept
for potentially throwing txn::put()
of C++ API.Minors:
Acknowledgments:
Extensions and improvements:
cursor::erase()
overloads for key
and for key-value
.Fixes:
madvise
while opening DB (fixes https://libmdbx.dqdkfa.ru/dead-github/issues/231).P_DIRTY
flag (0x10
) for nested/sub-pages.Minors:
Acknowledgments:
node-mdbx
NodeJS bindings.lmdbx-store
NodeJS bindings.New features, extensions and improvements:
MDBX_BUILD_TIMESTAMP
for builds reproducibility.long-stochastic
script.MDBX_TXN_FULL
error for large transactions when possible.MDBX_READERS_LIMIT
increased to 32767
.MDBX_TOO_LARGE
under Valgrind/ASAN if being opened DB is 100 larger than RAM (to avoid hangs and OOM).mdbx_chk
now skips iteration & checking of DB' records if corresponding page-tree is corrupted (to avoid SIGSEGV
, ASAN failures, etc).Backward compatibility break:
VERSION.txt
for version information instead of VERSION
to avoid collision with #include <version>
.slice::from/to_FOO_bytes()
to ‘slice::envisage_from/to_FOO_length()’.MDBX_TEST_EXTRA
make's variable to MDBX_SMOKE_EXTRA
.Fixes:
mdbx_chk
is called to check the DB for a specific meta page and thus could prevent switching to the selected meta page, even if the check passed without errors.MDBX_NOTLS
option.mdbx_cursor_eof()
result.make install
with non-GNU install
utility (OSX, BSD).CMake
in special cases by complete use GNUInstallDirs
's variables.std::string
and alignment.safe64_reset()
for platforms without atomic 64-bit compare-and-swap.__cxa_thread_atexit()
.noexcept
for buffer::&assign_reference()
.bootid
generation on Windows for case of change system' time.Acknowledgments:
New features:
-p
option to mdbx_stat
utility for printing page operations statistic.EINVAL
error.Fixes:
#elsif
typo.MDBX_PROBLEM
error during altering data in huge transactions due to wrong spilling/oust of dirty pages (https://libmdbx.dqdkfa.ru/dead-github/issues/195).Acknowledgments:
New features:
mdbx_env_set_option()
and mdbx_env_get_option()
for controls various runtime options for an environment (announce of this feature was missed in a previous news).MDBX_DISABLE_PAGECHECKS
build option to disable some checks to reduce an overhead and detection probability of database corruption to a values closer to the LMDB. The MDBX_DISABLE_PAGECHECKS=1
provides a performance boost of about 10% in CRUD scenarios, and conjointly with the MDBX_ENV_CHECKPID=0
and MDBX_TXN_CHECKOWNER=0
options can yield up to 30% more performance compared to LMDB.mdbx_drop
similar to LMDB command-line tool to purge or delete (sub)database(s).MDBX_ENABLE_MADVISE
build option which controls the use of POSIX madvise()
hints and friends.mdbx_chk
output number of keys/items on pages.install-strip
and install-no-strip
targets to the Makefile
(https://libmdbx.dqdkfa.ru/dead-github/pull/180).mdbx_get_sysraminfo()
to the API.MDBX_WRITEMAP
mode the OS kernel able to oust dirty pages to DB file without further penalty during transaction commit. As a result, page swapping and I/O could be significantly reduced during extra large transactions and/or lack of memory.mdbx_env_info_ex()
.MDBX_opt_txn_dp_limit
option).make options
to list available build options.make help
to list available make targets.make
's build by default.Backward compatibility break:
MDBX_AVOID_CRT
build option was renamed to MDBX_WITHOUT_MSVC_CRT
. This option is only relevant when building for Windows.mdbx_env_stat()
always, and mdbx_env_stat_ex()
when called with the zeroed transaction parameter, now internally start temporary read transaction and thus may returns MDBX_BAD_RSLOT
error. So, just never use deprecated ‘mdbx_env_stat()’ and call mdbx_env_stat_ex()
with transaction parameter.MDBX_CONFIG_MANUAL_TLS_CALLBACK
was removed and now just a non-zero value of the MDBX_MANUAL_MODULE_HANDLER
macro indicates the requirement to manually call mdbx_module_handler()
when loading libraries and applications uses statically linked libmdbx on an obsolete Windows versions.Fixes:
@MAIN
's DBI-handle.mdbx_env_info_ex()
in case of a call for a non-open environment (https://libmdbx.dqdkfa.ru/dead-github/issues/171).mdbx_env_set_geometry()
for implicit out-of-range cases (https://libmdbx.dqdkfa.ru/dead-github/issues/170).mdbx_env_set_option()
for set initial and limit size of dirty page list ((https://libmdbx.dqdkfa.ru/dead-github/issues/179).constexpr
specifier for the slice::invalid()
.mdbx_env_stat_ex()
to returning statistics of the whole environment instead of MainDB only (https://libmdbx.dqdkfa.ru/dead-github/issues/190).std::filesystem::path
).WIN32_WINNT < 0x0600
).Acknowledgments:
Removed options and features:
MDBX_HUGE_TRANSACTIONS
build-option (now no longer required).New features:
-p
option (purge subDB before loading) to mdbx_load
tool.MDBX_ENABLE_REFUND
and MDBX_PNL_ASCENDING
internal/advanced build options.mdbx_default_pagesize()
function.LIBMDBX_NO_EXPORTS_LEGACY_API
build option.Fixes:
mdbx_realloc()
for case of nullptr and MDBX_WITHOUT_MSVC_CRT=ON
for Windows.bootid
meta-page's field (https://libmdbx.dqdkfa.ru/dead-github/issues/153).MDBX_TXN_FULL
and regressive MDBX_KEYEXIST
during large transaction commit with MDBX_LIFORECLAIM
(https://libmdbx.dqdkfa.ru/dead-github/issues/123).weak->steady
with the same boot-id) when Database size at last weak checkpoint is large than at last steady checkpoint.Acknowledgments:
Added features:
mdbx_env_delete()
for deletion an environment files in a proper and multiprocess-safe way.mdbx_txn_commit_ex()
with collecting latency information.LIBMDBX_INLINE_API
macro and inline versions of some API functions.mdbx_cursor_copy()
function.MDBX_SET_LOWERBOUND
operation for mdbx_cursor_get()
.Fixes:
mdbx.h++
.__noreturn
.yield
instruction on ARM if unsupported.pthread_yield()
for non-GLIBC.RegGetValueA()
on Windows 2000/XP.GetTickCount64()
on Windows 2000/XP.DEFINE_ENUM_FLAG_OPERATORS
from Windows SDK.SIGPIPE
suppression for internal thread during mdbx_env_copy()
.MDBX_KEY_EXIST
error during mdbx_commit()
(https://libmdbx.dqdkfa.ru/dead-github/issues/131).mdbx_load
for 'plain text' and without -s name
cases (https://libmdbx.dqdkfa.ru/dead-github/issues/136).mdbx_chk
).ERROR_NOT_SUPPORTED
while opening DB by UNC pathnames (https://github.com/miranda-ng/miranda-ng/issues/2627).EXCEPTION_POSSIBLE_DEADLOCK
condition for Windows.Added features:
MDBX_SYNC_DURABLE
to sync modes for API clarity.MDBX_ALLDUPS
and MDBX_UPSERT
for API clarity.MDBX_TXN_RDONLY_PREPARE
flag).mdbx_cursor_create()
and mdbx_cursor_bind()
functions).mdbx_chk -h
).mdbx_chk -h
).mdbx_txn_break()
function to explicitly mark a transaction as broken.mdbx_chk
utility and mdbx_walk_tree()
function.pure-function
and const-function
attributes to C API.Deprecated functions and flags:
MDBX_MAPASYNC
flag is deprecated. Just use MDBX_SAFE_NOSYNC
or MDBX_UTTERLY_NOSYNC
instead of it.MDBX_oom_func
, mdbx_env_set_oomfunc()
and mdbx_env_get_oomfunc()
replaced with MDBX_hsr_func
, mdbx_env_get_hsr
and mdbx_env_get_hsr()
.Fixes:
mdbx_strerror()
for MDBX_BUSY
error (no error description is returned).EACCESS
or EBADFD
error).mdbx_page_get()
null-defer when DB corrupted (crash by SIGSEGV
).mdbx_env_open()
for re-opening after non-fatal errors (mdbx_chk
unexpected failures).static_assert()
bug.getopt()
messages for Windows (Thanks to Andrey Sporaw for reporting).Added features:
Deprecated functions and flags:
mdbx_dbi_open_ex()
are deprecated, since such databases couldn't be checked by the mdbx_chk
utility. Please use the value-to-key functions to provide keys that are compatible with the built-in libmdbx comparators.MDBX_WRITEMAP
option.mdbx_get_keycmp()
and mdbx_get_datacmp()
functions (helpful to avoid using custom comparators).ENABLE_UBSAN
CMake option to enabling the UndefinedBehaviorSanitizer from GCC/CLANG.MDBX_CORRUPTED
in case all meta-pages are weak and no other error.MDBX_UNABLE_EXTEND_MAPSIZE
error will now be returned less frequently and only when using the DB in the current process really requires it to be reopened.mdbx_env_set_geometry()
for case it is called from an opened environment outside of a write transaction.MDBX_HUGE_TRANSACTIONS
build-option (default OFF
)./EHsc
option).MDBX_NOSUBDIR
while opening for any existing database.MDBX_WITHOUT_MSVC_CRT
option and missing ntdll.def
.mdbx_env_close()
to work correctly called concurrently from several threads.ENODATA
for FreeBSD.pwritev()
for single-writes (up to 10% speedup for some kernels & scenarios).MDBX_UTTERLY_NOSYNC
as result of flags merge.mdbx_dbi_dupsort_depthmask()
function.MDBX_CP_FORCE_RESIZABLE
option.MDBX_MAP_RESIZED
for compatibility.MDBX_BUILD_TOOLS
option (default ON
).mdbx_dbi_open_ex()
to safe concurrently opening the same handle from different threads.mdbx_update_gc()
for huge transactions with small sizes of database page.CFLAGS_EXTRA
make-option for convenience.memcpy(ptr, NULL, 0)
.MDBX_MAP_RESIZED
renamed to MDBX_UNABLE_EXTEND_MAPSIZE
.MDBX_TXN_OVERLAPPING
error and MDBX_DBG_LEGACY_OVERLAP
option.mdbx_key_from_jsonInteger()
, mdbx_key_from_double()
, mdbx_key_from_float()
, mdbx_key_from_int64()
and mdbx_key_from_int32()
functions. See mdbx.h
for description.mdbx_load
utility for custom comparators.MDBX_APPEND
flag inside mdbx_cursor_put()
.STATUS_CONFLICTING_ADDRESSES
.MDBX_DBG_DUMP
option to avoid disk I/O performance degradation.mdbx_env_set_geometry()
for large page size.MDBX_NOTLS
option.MADV_DONTNEED
threshold.mdbx_chk
utility for don't checking some numbers if walking on the B-tree was disabled.MDBX_FORCE_ASSERTIONS
built-time option.MDBX_DBG_DUMP
to avoid performance degradation.MDBX_NOSYNC
to MDBX_SAFE_NOSYNC
for clarity.ERROR_ACCESS_DENIED
from OpenProcess()
as 'process exists'.FILE_FLAG_NO_BUFFERING
for compatibility with small database pages.MDBX_ACCEDE
flag for database opening.For early changes see the git commit history.