libmdbx 0.13.3 "Королёв"
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
для информации о планах и ходе доработок.
Благодарности:
- Алексею Костюку (aka Keller) за сообщения об ошибках и недочетах.
- Erigon за спонсорство.
- Lazymio за новые привязки к Python.
Новое:
- В 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()
доработаны эвристики для подбора параметров геометрии БД запрошенных пользователем “по-умолчанию”.
Загрузки:
- 321K, libmdbx-amalgamated-0.13.3.zpaq, sha256sum:
1eb1685b2aa4435c22ad6034f0816b91267ea4b876ef9ceaf1c34457197b6fa6
- 433K, libmdbx-amalgamated-0.13.3.tar.xz, sha256sum:
2e42505f1ceb57945569db3c1a5db9b5216d8f72da7c75c240ff81196f8e9a0b
За информацией о предыдущих версиях обращайтесь к тегам git и ChangeLog.
Файлы
Нет файлов