libmdbx 0.13.3 "Королёв"

Леонид Юрьев обновлён 1 неделю назад v0.13.3 92e2b62 Релиз
0
Описание

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

git diff' stat: 67 files changed, 3514 insertions(+), 3004 deletions(-)

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

Одновременно с этим релизом:

  • ветка 0.12.x перестаёт поддерживаться и отправится в архив/0.12;
  • ветка 0.13.x получает статус стабильной и вливается в stable;
  • техническим тегом 0.14.0 отмечено начало разработки 0.14.x, см файл ChangeLog в ветке master для информации о планах и ходе доработок.

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

Новое:

  • В C API добавлена функция mdbx_cursor_count_ex() позволяющая получить как количество мульти-значений соответствующих текущему ключу, так и информацию о вложенном дереве хранящем эти значения.
  • В C++ API добавлен метод mdbx::txn::make_broken() аналогичный mdbx_txn_break().
  • В утилиты mdbx_copy, mdbx_drop, mdbx_dump, mdbx_load, mdbx_stat добавлено логирование ошибок, предупреждений и важных сообщений от libmdbx.

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

  • Устранён регресс неразблокировки мьютекса при попытки повторного закрытия dbi-дескриптора, в том числе при попытке явно закрыть дескриптор после удаления связанной с ним таблицы.
    Вместо возврата ошибки MDBX_BAD_DBI происходил выход из тела функции по успешному пути, но без освобождения захваченной блокировки. Ошибка была внесена 2024-10-23 коммитом 3049bb87b5b14d83b16d121c186ce8fb3f21383e.
  • Устранён регресс состояния вложенного/dupsort курсора после вставки данных в MDBX_APPEND-режиме.
    При добавлении нового ключа в append-режиме, в случае когда в текущей (последней) позиции с ключом связаны несколько значений и (соответственно) вложенный dupsort-курсор инициализирован, вставка происходила без сброса вложенного курсора.
    В результате вложенный курсор логически оставался стоять на multivalue-данных связанных с предыдущей позицией основного курсора, т.е. переходил в неконсистентное состояние. Ошибка проявлялась возвратом неверных значений из mdbx_cursor_count() или срабатывание assert-проверки в отладочных сборках.
  • Поддержка получения boot_id при работе внутри LXC-контейнера.
    Из LXC-контейнера не доступен файл хостовой системы /proc/sys/kernel/random/boot_id. Вместо него, при каждом старте контейнера, создается и заполняется случайными данными собственный boot_id смонтированный через bind из tmpfs, см сообщение о проблеме в LXC.
    Ранее этот подставной/замещенный boot_id отбраковывался внутри libmdbx, так как файл располагается в tmpfs, а не в файловой системе /proc. В результате boot_id для проверки целостности БД не был доступен. Теперь при работе внутри LXC-контейнера такой bootid будет использоваться.
    Однако, полноценно работающий контроль по boot_id не возможен, так как при рестарте LXC-контейнера (но не хоста) boot_id будет меняться, хотя данные в unified page cache сохраняются.
    Таким образом, при рестарте LXC-контейнера без рестарта хоста, libmdbx придется откатить состояние БД до крайней точки устойчивой фиксации, что повлечет утрату данных пользователя в случаях когда они могли быть сохранены. Однако, улучшить ситуацию пока не представляется возможным, как минимум до доступности boot_id хостовой системы изнутри LXC-контейнера.
  • Устранена ошибка неверной обработки попытки запуска вложенной читающей транзакции. Теперь в таких ситуациях возвращается ошибка MDBX_EINVAL, так как вложенность поддерживается только для транзакций чтения-записи.
    Ошибка была внесена при рефакторинге, коммитом 2f2df1ee76ab137ee66d00af69a82a30dc0d6deb чуть более 5 лет назад и долго оставалось не замеченной.
  • Устранён SIGSEGV-регресс обращения к нулевому адресу при работе в режиме только-чтение без использования LCK-файла, например при размещении БД на носителе доступном только для чтения.
    Ошибка была внесена при реализации функционала парковки читающих транзакций.

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

  • Теперь при включении профилирования GC (сборка с опцией MDBX_ENABLE_PROFGC=ON) подсчитываются затраты времени ЦПУ на слияние списков страниц, т.е. на работу функции pnl_merge().
  • В утилите тестирования значение режима данных переименовано из data.dups в data.multi.
  • Доработан контроль длины ключа внутри cursor_seek().
    Ранее проверка внутри cursor_seek() не позволяла искать ключи длиннее, чем можно поместить в таблицу. Однако, при поиске/позиционировании это не является ошибкой для таблиц с ключами переменного размера.
  • Если посредством mdbx_env_set_option(MDBX_opt_txn_dp_limit) пользователем не задано собственно значение, то теперь выполняется подстройка dirty-pages-limit при старте каждой не-вложенной пишущей транзакций, исходя из объёма доступного ОЗУ и размера БД.
  • Теперь в режиме MDBX_NOSTICKYTHREADS допускается commit/abort вложенных транзакций из любого треда/потока.
  • Теперь при попытке запуска вложенных транзакций в режиме MDBX_WRITEMAP производится логирование и возврат ошибки MDBX_INCOMPATIBLE.
  • Теперь в C++ API в конструкторах/инициализаторах и методах связанных с формированием геометрии БД по-умолчанию используются только default-значений, в том числа для минимального и максимального
  • Внутри mdbx_env_set_geometry() доработаны эвристики для подбора параметров геометрии БД запрошенных пользователем “по-умолчанию”.

Загрузки:


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

Файлы
  • Нет файлов