Skip to content

Releases: erthink/libmdbx

We relocated to SourceCraft.dev

17 Dec 16:05
Immutable release. Only release title and notes can be modified.
v0.13.10
cc5deba

Choose a tag to compare

The libmdbx project has been completely relocated to the jurisdiction of the Russian Federation.

Please refer to https://libmdbx.dqdkfa.ru for documentation and https://sourcecraft.dev/dqdkfa/libmdbx for the source code (it is still open and provided with first-class free support).

Regardless of anything else, We would like to thank Erigon once again for the sponsorship.

libmdbx 0.13.9 "IS-2"

31 Oct 11:40
v0.13.9
926e90a

Choose a tag to compare

Поддерживающий выпуск стабильной ветки с исправлением обнаруженных ошибок и устранением недочётов. Выпуск назван в память о самом мощном тяжелом советском танке "ИС-2", который был принят на вооружение 31 октября 1943 года в разгар Великой Отечественной Войны и долгое время оставался одной из сильнейших машин мира в категории по массе 40—50 тонн.

For translation to other languages please try Yandex or liar Google.

git diff' stat: 24 files changed, 262 insertions(+), 226 deletions(-)

Благодарности:

  • Erigon за спонсорство.

Исправления:

  • Исправлена assert-проверка в пути сканирования битовой карты DBI-дескрипторов приводившая к редким падениям 32-битных отладочных сборок.

  • Переделан поиск утилит lib.exe и dlltool.exe при сборке посредством CMake на Windows.

  • Устранён регресс проявлявшийся увеличением (не-уменьшением) размера БД, после добавления использования fallocate() ради предотвращения SIGBUS при нехватке места в файловой системе где расположена БД.

  • Устранена опечатка в тестовом скрипте test/battery-tmux.sh приводящая к созданию мусорного файла с именем -.

  • Удалено лишнее/ненужное использование макроса MDBX_INTERNAL оставшееся после рефакторинга.

  • Для Android добавлен обход (workaround) для уменьшения вероятности системной ошибки EAGAIN возникающей из-за нехватки системных ресурсов и переходных процессов при закрытии и быстром повторном открытии БД.

Прочие доработки:

  • Поддержка Harmony OS (OHOS).

Загрузки:


За информацией о предыдущих версиях обращайтесь к тегам git и ChangeLog.

Please don't use github's tarballs nor zips, but the amalgamated sources or clone the git repository. Ones is unusable since the git tags required for the build are lost.

libmdbx 0.13.8 "Всеобуч" (v`seabooch)

31 Aug 12:47
v0.13.8
4d58857

Choose a tag to compare

Поддерживающий выпуск стабильной ветки с исправлением обнаруженных ошибок и устранением недочётов, день 100 летнего юбилея Постановления Всероссийского центрального исполнительного комитета о всеобщем бесплатном начальном образовании.

For translation to other languages please try Yandex or liar Google.

git diff' stat: 22 files changed, 682 insertions(+), 291 deletions(-)

Благодарности:

  • Erigon за спонсорство.

Исправления:

  • Устранена возможность получения неожиданного SIGBUS из-за отложенного/ленивого выделение места в заполненной файловой системе после приращения файла БД. Более подробное пояснение в комментарии коммита 2930b304dc674bbccd188b7ce7c3f83755ef706e.

Изменение поведения:

  • Вновь включена/разрешена на старых ядрах Linux, начиная с версии 3.16, так как сейчас уже нет причин отказываться от работы на 3.16 поддерживая при этом ядра 4.x, и еще есть проекты (Isar, Isar-Community, Hive) которым требуется такая поддержка.

  • Ошибка MDBX_WANNA_RECOVERY при открытии БД в режиме только-чтение теперь возвращается если размер БД не кратен размеру системной страницы, но игнорируется не кратность размеру блока выделения виртуальной памяти. Этим устраняется регресс, проявившейся вследствие изменения поведения после задействования системного вызова fallocate() для предотвращения SIGBUS после приращения файла БД в заполненной файловой системе.

Загрузки:


За информацией о предыдущих версиях обращайтесь к тегам git и ChangeLog.

Please don't use github's tarballs nor zips, but the amalgamated sources or clone the git repository. Ones is unusable since the git tags required for the build are lost.

libmdbx 0.13.7 "Дружба" (Friendship)

30 Jul 12:17
v0.13.7
566b0f9

Choose a tag to compare

Поддерживающий выпуск стабильной ветки с исправлением обнаруженных ошибок и устранением недочётов, в международный день дружбы.

For translation to other languages please try Yandex or liar Google.

git diff' stat: 22 files changed, 682 insertions(+), 291 deletions(-)

Благодарности:

Исправления:

  • Устранена критическая ошибка в функционале mdbx_env_resurrect_after_fork() при использовании SysV-семафоров. Проявлялась ошибка только после порождения дочернего процесса посредством fork() на фоне выполняющейся пишущей транзакции, что приводило к неверной работе семафоров и далее к самым различным ошибкам, вплоть до повреждения БД. Проблема существовала начиная с появления mdbx_env_resurrect_after_fork() и затрагивала OSX, а также POSIX-платформы при сборке с опцией MDBX_LOCKING=5.

  • Устранена проблема в API копирования БД на отличных от Linux системах POSIX, а также в некоторых случаях при расположении целевого файла на не-локальной файловой системе. Проблема проявлялась в основном на OSX, возвратом ошибки EWOULDBLOCK/EAGAIN (35), что обусловлено недочетом/конфликтом блокировок fcntl(F_SETLK) и flock() в ядре ОС. Переработана обработка ошибок захвата файловых блокировок в API копирования на системах POSIX.

  • Устранена ошибка приводившая к неожиданному возврату MDBX_BAD_DBI при одновременном старте нескольких транзакций внутри одного процесса после открытия БД.

  • Устранена ошибка приводившая к неожиданному возврату MDBX_DBS_FULL при повторном открытии уже открытых таблиц и уже достигнутом лимите открытых DBI-дескрипторов.

  • Исправлена ошибка сборки для платформы Android при явном определении _FILE_OFFSET_BITS.

  • Исправлена ошибка использования ENOMEM вместо MDBX_ENOMEM. Что могло ломать сборку на не-POSIX/Windows платформах, в зависимости от конфигурации и/или версии SDK.

  • Поправлено либо удалено несколько неверных assert-проверок, из-за которых происходили падения отладочных сборок в специфических ситуациях. Главным образом, в коде функций txn_end(), txn_lock() и txn_unlock() как на Windows, так и на POSIX.

  • Устранены несущественные предупреждения MSVC. Отключены предупреждения C5286 и C5287.

Прочие доработки:

  • Доработана логика отказа от использования OFD-блокировок на POSIX-платформах. Теперь кроме EINVAL учитываются дополнительные коды ошибок (ENOSYS, ENOIMPL, ENOTSUP, ENOSUPP, EOPNOTSUPP), что позволит работать собранной библиотеке в некоторых случаях, когда актуальное ядро/контейнер/эмулятор не поддерживает требуемых системных вызовов.

  • В тестовый фреймворк добавлена поддержка опции --numa # для привязки стохастического теста к NUMA-узлу, а в battery/tmux-скрипте добавлено явное распределение по NUMA-узлам, что существенно увеличило КПД при тестировании на NUMA-машинах.

  • В стохастическом скрипте реализован случайный порядок запуска отдельных тестов.

Загрузки:


За информацией о предыдущих версиях обращайтесь к тегам git и ChangeLog.

Please don't use github's tarballs nor zips, but the amalgamated sources or clone the git repository

libmdbx 0.14.1 "Горналь"

06 May 12:10
v0.14.1
a13147d

Choose a tag to compare

Pre-release

Первый выпуск в новом кусте/линейке версий с добавлением функционала, расширением API и внутренними переработками.

For translation to other languages please try Yandex or liar Google.

git diff' stat: 166 files changed, 9467 insertions(+), 5597 deletions(-)

Благодарности:

  • Erigon за спонсорство.
  • Alain Picard for support Java bindings and MacOS universal binaries patch for CMake build scenario, also for bug reporting (put-MDBX_MULTIPLE regression). Big thank for assistance with debugging and testing.
  • Alex Sharov за сообщение об ошибках и тестирование.
  • Виктору Логунову за сообщение об опечатки в имени переменной в Conan-рецепте.
  • Илье Михееву за сообщение о лишнем/ненужном предупреждении несоответствия файла БД новому размеру.
  • maxc0d3r for bug reporting and testing.
  • Алексею Костюку (aka Keller) за сообщения о проблеме копирования на NFS.

Новое:

  • Переработан код обновления GC и возврата страниц при фиксации транзакций.

    Возникающая при этом задача алгоритмически сложна, так как список возвращаемых страниц находится в рекурсивной зависимости от самой процедуры возврата и связанных с этим операций, а прямые решения во многих случаях приводят к многократному росту накладных расходов. Поэтому исторически эта часть кода была запутанным наслоением «сдержек и противовесов», что создавало препятствие для развития. В ходе этой доработки, унаследованный из LMDB код связанный с обновлением GC, был полностью заменен вместе со всеми базирующимися на нём заплатками.

    Новая реализация использует контейнеры идентификаторов (aka RKL), комбинирующие внутри списки элементов и непрерывные интервалы, что позволяет предельно сократить накладные расходы и упросить реализацию остальных алгоритмов. Основывается новая реализация на простом прагматичном подходе «резервирования со взвешенным запасом». Для подавляющего подмножества сценариев этого достаточно для однопроходного обновления GC, с общей сложностью от O(1) для мелких транзакций, до O(log(N)) для огромных. При этом реализованный еще в 0.12.1 подход «Big Foot» (дробление больших списков retired-страниц) полностью избавляет GC от потребности в последовательностях смежных/соседствующих страниц и одновременно позволяет работать новому коду обновления GC только по самому простому и быстрому пути.

    Чуть более подробно, включая пояснения более сложных случаев/алгоритмов, см ChangeLog.

  • Добавлена опция сборки MDBX_NOSUCCESS_PURE_COMMIT предназначенная для отладки кода пользователя. По-умолчанию опция выключена и при фиксации пустых транзакции возвращается MDBX_SUCCESS. При включении опции, фиксация пишущих транзакций без каких-либо изменений считается нештатным поведением, с возвратом из mdbx_txn_commit() кода MDBX_RESULT_TRUE вместо MDBX_SUCCESS. Таким образом, у пользователя появляется возможность легко диагностировать лишние/ненужные транзакции записи.

  • Добавлена опция сборки MDBX_ENABLE_NON_READONLY_EXPORT позволяющая использовать в режиме чтения-записи БД расположенных в файловых системах экспортированных через NFS. По-умолчанию опция выключена и при открытии в неэксклюзивном режиме чтения-записи БД расположенных в файловых системах доступных извне по NFS будет возвращаться ошибка MDBX_EREMOTE. Включение опции позволяет открывать БД в описанных выше ситуациях, но риск чтения неверных данных на удалённой стороне ложится на пользователя.

  • Добавлена операция MDBX_SEEK_AND_GET_MULTIPLE в API курсора, позволяющая за одну операцию выполнить позиционирование курсора на конкретное значение и начать чтение multi-значений в пакетном режиме.

  • В chk-функционал добавлена гистограмма количества multi-значений/дубликатов. При использовании утилиты mdbx_chk, для получения соответствующей (и массы другой) информации, достаточно увеличить детализацию несколько раз использовав опцию -v.

  • В политику управления выделением для 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.

  • В API добавлена функция mdbx_cursor_close2() возвращающая код ошибки.

  • Для закрытия или отсоединения всех курсоров с получением их количества в API добавлена функция mdbx_txn_release_all_cursors_ex().

  • Добавлены методы mdbx::cursor::put_multiple_samelength(), mdbx::cursor::seek_multiple_samelength(), mdbx::cursor_managed::withdraw_handle().

Изменение поведения:

  • Теперь при вставке данных в dupsort-таблицу CoW копирование целевых страниц выполняется после проверки отсутствия добавляемого значения среди уже присутствующих multi-значений (aka дубликатов). В результате вставка уже присутствующих "дубликатов" не приводит к каким-либо изменениям в БД и принципиально увеличивает производительность в таких сценариях. В текущем понимании, добавленная проверка не приводит к заметному увеличению накладных расходов и, как следствие, не приводит к снижению производительности в сценариях с обычным/регулярным обновлением и/или вставкой данных.

  • Использование системного кода ошибки EREMOTEIO ("Remote I/O error") вместо ENOTBLK ("Block device required") в качестве MDBX_EREMOTE для индикации ошибочной ситуации открытия БД расположенной на сетевом носителе.

  • Функция mdbx_txn_release_all_cursors() возвращает только код ошибки, не смешивая его с количеством обработанных/закрытых курсоров. Для аналогичных действий с получением количества закрытых курсоров в API добавлена функция mdbx_txn_release_all_cursors_ex().

  • Поддержка пустого набора данных в put-операции MDBX_MULTIPLE ради упрощения пользовательского кода, какой-либо модификации данных в БД при этом не происходит.

  • Для основных вариантов использования шаблона mdbx::buffer<> теперь явно инстанцируются внутри библиотеки, одновременно соответствующие специализации шаблона помечены как external для предотвращения повторного инстанцирования в пользовательском коде.

  • Запрещена отвязка/открепление курсоров во вложенных транзакциях, т.е. вызовы mdbx_cursor_unbind() и mdbx_txn_release_all_cursors(unbind=true) для курсоров открытых в одной из родительских транзакций. Причина в том, что в случае отмены вложенной транзакции возникает неконструктивная неопределенность — следует ли восстанавливать состояние курсоров. Если не восстанавливать, то получается что вложенная транзакция может поломать родительскую, сделав её продолжение невозможным. Если восстанавливать, то также следует «воскрешать» закрытые курсоры, что неизбежно приведет к путанице, утечкам памяти и использованию после освобождения.

  • В C++ API отменён вброс исключения при запросе транзакции у отсоединённого курсора посредством вывоза mdbx::cursor::txn().

  • При невозможности отвязки курсора от его текущей транзакции функция mdbx_cursor_bind() теперь возвращает MDBX_EINVAL вместо MDBX_BAD_TXN.

Загрузки:


За информацией о предыдущих версиях обращайтесь к тегам git и ChangeLog.

Please don't use github's tarballs nor zips, but the amalgamated sources or clone the git repository

libmdbx 0.13.6 "Бузина"

22 Apr 09:54
v0.13.6
a971c76

Choose a tag to compare

Поддерживающий выпуск стабильной ветки с исправлением обнаруженных ошибок и устранением недочётов, в память о погибшем украинском историке и писателе Алесе Бузине.

For translation to other languages please try Yandex or liar Google.

git diff' stat: 15 files changed, 194 insertions(+), 36 deletions(-)

Благодарности:

Исправления:

  • Устранён регресс при использовании курсоров для DBI=0 (aka GC/FreeDB) в читающих транзакциях.

    После рефакторинга и ряда оптимизаций для завершения/гашения курсоров в читающих и пишущих транзакций, стал использоваться общий код. Причем за основу, был взят соответствующий фрагмент относящийся к пишущим транзакциям, в которых пользователю не позволяется использоваться курсоры для DBI=0 и поэтому эта итераций пропускалась.

    В результате, при завершении читающих транзакциях, курсоры связанные с DBI=0 не завершались должным образом, а при их повторном использовании или явном закрытии после завершения читающей транзакции происходило обращение к уже освобожденной памяти. Если же такие курсоры отсоединялись или закрывались до завершения читающей транзакции, то ошибка не имела шансов на проявление.

  • Устранён регресс в виде ошибки EAGAIN при копировании БД на NFS и CIFS/SMB.

    При доработках/развитии API в функции копирования был добавлен захват файловой блокировки посредством как fcntl(), так и flock(). Однако, в зависимости от версии локального ядра, версии удалённого сервера NFS и опций монтирования, это могло приводить к возврату POSIX-ошибки EAGAIN (11 на большинстве платформ, включая Linux).

  • Устранена ошибка merge/rebase внутри mdbx_txn_release_all_cursors_ex(), что могло приводить к последующим неожиданным ошибкам MDBX_EBADSIGN и утечкам памяти.
    Для проверки сценария дополнен соответствующий тест.

  • Исправлена assert-проверка в пути завершения вложенных транзакций.
    Для проверки сценария дополнен соответствующий тест.

  • Устранена возможность возврата неожиданной ошибки MDBX_BUSY из mdbx_txn_lock(dont_wait=false).

  • Для совместимости с GCC 15.x в режиме C23 изменен порядок указания атрибутов функций.

Изменение поведения:

  • При невозможности отвязки курсора от его текущей транзакции функция mdbx_cursor_bind() теперь возвращает MDBX_EINVAL вместо MDBX_BAD_TXN.

Прочие доработки:

  • Во избежание потенциальных проблем отключено использование copy_file_range() на ядрах Linux 5.3 - 5.18.

  • Вброс std::invalid_argument теперь производится явным сообщением MDBX_EINVAL.

  • Уточнен тип адреса для пожертвований. Ethereum/ERC-20 позволяет перечислять не только ETH, но и другие валюты/токены, в том числе USDC.

  • Дополнен тест курсоров extra/cursor-closing.

  • В NOTICE обновлена информация о Github.

Загрузки:


За информацией о предыдущих версиях обращайтесь к тегам git и ChangeLog.

Please don't use github's tarballs nor zips, but the amalgamated sources or clone the git repository

libmdbx 0.13.5 "Труба"

21 Mar 19:31
v0.13.5
e3324ce

Choose a tag to compare

Поддерживающий выпуск стабильной ветки с исправлением обнаруженных ошибок и устранением недочётов.

Please don't use github's tarballs nor zips, but the amalgamated sources or clone the git repository. For translation to other languages please try Yandex or liar Google.

git diff: 49 files changed, 2106 insertions(+), 1135 deletions(-)

Благодарности:

Новое:

  • Добавлена опция сборки MDBX_ENABLE_NON_READONLY_EXPORT позволяющая использовать в режиме чтения-записи БД расположенных в файловых системах экспортированных через NFS. По-умолчанию опция выключена и при открытии в неэксклюзивном режиме чтения-записи БД расположенных файловых системах доступных извне по NFS будет возвращаться ошибка MDBX_EREMOTE. Включение опции позволяет открывать БД в описанных выше ситуациях, но риск чтения неверных данных на удалённой стороне ложится на пользователя.

  • Поддержка MacOS universal binaries при сборке посредством CMake.

  • Для закрытия или отсоединения всех курсоров с получением их количества в API добавлена функция mdbx_txn_release_all_cursors_ex().

  • Добавлена операция MDBX_SEEK_AND_GET_MULTIPLE в API курсора, позволяющая за одну операцию выполнить позиционирование курсора на конкретное значение и начать чтение multi-значений в пакетном режиме.

  • Добавлены методы mdbx::cursor::put_multiple_samelength(), mdbx::cursor::seek_multiple_samelength(), mdbx::cursor_managed::withdraw_handle().

  • В политику управления выделением для mdbx::buffer<ALLOCATOR, CAPACITY_POLICY> добавлен параметр inplace_storage_size_rounding. Одновременно с этим переработан внутренний union-тип mdbx::buffer<ALLOCATOR, CAPACITY_POLICY>::silo::bin для возможности увеличения без пенальти встроенного в экземпляр буфера места под данные.

  • В API добавлена функция mdbx_cursor_close2() возвращающая код ошибки.

Исправления:

  • Устранение лишнего/ненужного предупреждения в сценарии изменения размера БД посредством вызова mdbx_env_set_geometry() до её открытия. API предусматривает возможность запросить изменение геометрии/размера БД перед её открытием, чтобы избежать как лишних накладных расходов, так и потенциальных ошибок из-за нехватки адресного пространства. В этом сценарии ранее могло выдаваться лишнее/ненужное предупреждение о несоответствии файла БД новому размеру. Теперь этот недостаток исправлен.

  • Восстановлена доступность дескрипторов таблиц, открытых в дочерней транзакции, после её фиксации, в случае отсутствия изменений в данных. Проблема не была замечена ранее из-за специфического сценария проявления. Ошибка присутствует в версиях 0.13.x и последующих, начиная с коммита e6af7d7c53428ca2892bcbf7eec1c2acee06fd44 от 2023-11-05.

  • Устранён сбой аудита таблиц при инвалидации дескрипторов таблиц вследствие отмены вложенной транзакции. Проблема не была замечена ранее из-за специфического сценария проявления. Ошибка присутствует в версиях 0.13.x и последующих, начиная с коммита e6af7d7c53428ca2892bcbf7eec1c2acee06fd44 от 2023-11-05.

  • Устранена причина потенциальных сбоев и/и деградации производительности в сценарии закрытия курсора до завершения вложенной транзакции, с последующим изменением данных той-же таблицы в текущей вложенной транзакции, либо её дочерних транзакциях. Проблема обнаружена при ручном анализе кода, сценарии воспроизведения/проявления проблемы пока не известны. Ошибка присутствует в версиях 0.13.x и последующих, начиная с коммита 3de3d425a128a3c6f7866503f5f93b80c09dbe41 от 2024-05-19.

  • Устранена причина ложных ошибок при работе mdbx_chk с высоким уровнем логирования. Проблема возникала из-за неверной трактовки MDBX_NOTFOUND при штатном окончании итерируемых данных.

  • Устранена причина попыток рекурсивного захвата мьютекса при работе mdbx_chk -w в сборах с поддержкой Valring/ASAN и под управлением этих инструментов.

  • Устранены проверки потока владеющего транзакцией при сборке с опцией MDBX_TXN_CHECKOWNER=OFF.

  • Устранена вероятность ситуации гонки в tbl_setup(MDBX_DUPFIXED | MDBX_INTEGERDUP) при работе в разных потоках. В реальных сценариях вероятность проявления проблемы была близка к нулю. Для подробностей смотрите комментарий коммита 3e91500fac475947f5b58268d5edd3c9cc4f77f6.

  • Устранён регресс затенения курсоров во вложенных транзакциях. При реализации отложенной/ленивой инициализации dbi-дескрипторов также было реализовано отложенное затенение курсоров (создание копии состояния для отката при прерывании транзакции), что существенно уменьшало накладные расходы при старте и завершении вложенных транзакций в сценариях с большим количеством курсоров. Однако, была допущена логическая ошибка, вследствие которой отложенная инициализация и затенение выполнялись при использовании dbi-дескрипторов, но не курсора открытого в родительской транзакции. В результате, родительские курсоры во вложенных транзакциях могли не затеняться, что приводило к неконсистентному состоянию в случае прерывания/откате вложенной транзакции и в соответствующей таблицы были изменения в рамках прерванной вложенной транзакции. Проблема не реализовывалась в тестовых сценариях и не была замечена при эксплуатации, но была обнаружена при расширении тестов. Ошибка присутствует в версиях 0.13.x и последующих, начиная с коммита e6af7d7c53428ca2892bcbf7eec1c2acee06fd44 от 2023-11-05.

  • Устранён регресс в пути обработки операции MDBX_MULTIPLE. Пакетная вставка значений посредством MDBX_MULTIPLE могла приводить к падениям и повреждению структуры БД. Ошибка оставалось не замеченной из-за специфических условий проявления, которые не реализовались в тестах. Проблема присутствовала во всех выпусках начиная с v0.13.1, но соответствующая ошибка не связана с конкретным коммита в истории, а является следствием нескольких доработок (шагов рефакторинга), которые суммарно привели к регрессу. Технически ошибка обусловлена не-обнулением переменной, чего не происходило в некотором пути выполнения, так как исходно не требовалось. Однако, такое обнуление потребовалось после ряда этапов оптимизации и рефакторинга смежных участков кода. Для подробностей смотрите комментарий коммита 23a417fe19614481c6546845995d6dc845baf797.

  • Скорректировано описание ошибки MDBX_MVCC_RETARDED и текста соответствующего сообщения.

  • В C++ API добавлена упущенная проверка __cpp_concepts >= 202002 для использования концептов C++.

Изменение поведения:

  • Функция mdbx_txn_release_all_cursors() возвращает только код ошибки, не смешивая его с количеством обработанных/закрытых курсоров.
    Для аналогичных действий с получением количества закрытых курсоров в API добавлена функция mdbx_txn_release_all_cursors_ex().

  • Использование системного кода ошибки EREMOTEIO ("Remote I/O error") вместо ENOTBLK ("Block device required") в качестве MDBX_EREMOTE для индикации ошибочной ситуации открытия БД расположенной на сетевом носителе.

  • Для основных вариантов использования шаблона mdbx::buffer<> теперь явно инстанцируются внутри библиотеки,
    одновременно соответствующие специализации шаблона помечены как external для предотвращения повторного инстанцирования в пользовательском коде.

  • Запрещена отвязка/открепление курсоров во вложенных транзакциях, т.е. вызовы mdbx_cursor_unbind() и
    mdbx_txn_release_all_cursors(unbind=true) для курсоров открытых в одной из родительских транзакций.
    Причина в том, что в случае отмены вложенной транзакции возникает неконструктивная неопределенность
    — следует ли восстанавливать состояние курсоров. Если не восстанавливать, то получается что вложенная транзакция может
    поломать родительскую, сделав её продолжение невозможным. Если восстанавливать, то также следует «воскрешать» закрытые
    курсоры, что неизбежно приведет к путанице, утечкам памяти и использованию после освобождения.

  • В C++ API отменён вброс исключения при запросе транзакции у отсоединённого курсора посредством вызов mdbx::cursor::txn().

Прочие доработки:

  • Доработка использования LTO в CMake-сценариях: использование -flto=auto для GCC >= 11.4,
    расслабление условий для включения LTO для CLANG на Linux, расширение поиска LLVMgold.so в относительных lib-директориях.

  • Добавлены дополнительные проверки сигнатур курсоров при итерации связанных списков.

  • Кратное сокращение итераций тестов в зависимости от конфигурации Valgrind/Debug/CI.

  • Устранены предупреждения UBASN о невыравненном доступе в тесте extra/close-dbi.

  • Добавлен перехват и логирование исключений в extra-тестах на C++.

  • Расширены тесты extra/...

Read more

libmdbx 0.12.13

28 Feb 11:17
v0.12.13
1fff1f6

Choose a tag to compare

Завершающий выпуск архивной ветки с исправлением обнаруженных ошибок и устранением недочётов.

For translation to other languages please try Yandex or liar Google.

git diff' stat: 14 commits, 7 files changed, 256 insertions(+), 103 deletions(-)

Благодарности:

Значимые исправления:

  • Исправлена обработка MDBX_GET_MULTIPLE в специальных случаях и одного значения у ключа в позиции курсора.
  • Устранена ошибка неверной обработки попытки запуска вложенной читающей транзакции. Теперь в таких ситуациях возвращается ошибка MDBX_EINVAL, так как вложенность поддерживается только для транзакций чтения-записи. Ошибка была внесена при рефакторинге, коммитом 2f2df1ee76ab137ee66d00af69a82a30dc0d6deb чуть более 5 лет назад и долго оставалось не замеченной.
  • Поддержка получения boot_id при работе внутри LXC-контейнера. Из LXC-контейнера не доступен файл хостовой системы /proc/sys/kernel/random/boot_id. Вместо него, при каждом старте контейнера, создается и заполняется случайными данными собственный boot_id смонтированный через bind из tmpfs. lxc/lxc#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 для решения проблем со сборкой в старых компиляторах.

Загрузки:


За информацией о предыдущих версиях обращайтесь к тегам git и ChangeLog.

Please don't use github's tarballs nor zips, but the amalgamated sources or clone the git repository

libmdbx 0.13.4 "Sigma Boy"

15 Feb 11:23
v0.13.4
75122b3

Choose a tag to compare

Поддерживающий выпуск стабильной ветки с исправлением обнаруженных ошибок и устранением недочётов.

For translation to other languages please try Yandex or liar Google.

git diff' stat: 139 files changed, 391 insertions(+), 208 deletions(-)

Благодарности:

Новое:

  • Поддержка MacOS universal binaries при сборке посредством CMake.

Исправления:

  • Устранён регресс допускающий SIGSEGV в операциях обновления после вытеснения/spilling страниц в больших транзакциях. Ошибка присутствует в выпусках v0.13.1, v0.13.2, v0.13.3 и оставалась незамеченной из-за специфических условий и низкой вероятности проявления. Более подробная информация в описании коммита 21630ea115690a5cb39cfa921f9d199271a08102.

  • Исправлена опечатка в документации в упоминании mdbx_env_resurrect_after_fork().

  • Исправлена опечатка в условном операторе внутри cursor_touch(). При переделке курсоров было пропущено отрицание в условии, при оценке количества страниц, которые могут потребоваться для выполнения операции. В текущем понимании ошибка не приводила к каким-либо проблемам, ибо оценка делает по верхней границе с существенным запасом, а в худшем случае это могло приводить к прерыванию транзакции из-за достижения ограничения на кол-во грязных страниц.

  • Корректировка излишне строгого условия в assert-проверке внутри recalculate_subpage_thresholds(). Ошибка могла проявляться только в отладочных сборках при выставлении определенной комбинации предельных значений опций MDBX_opt_subpage_limit, MDBX_opt_subpage_room_threshold, MDBX_opt_subpage_reserve_prereq, MDBX_opt_subpage_reserve_limit.

  • Исправление опечатки в Conan-рецепте в коде протокольно-отладочного вывода в имени переменной version_json_pathname.

Загрузки:


За информацией о предыдущих версиях обращайтесь к тегам git и ChangeLog.

Please don't use github's tarballs nor zips, but the amalgamated sources or clone the git repository