876 Commits

Author SHA1 Message Date
Леонид Юрьев (Leonid Yuriev)
c70ef83e4a
mdbx: исправление опечатки равно/неравно в условии внутри update_gc().
Существенных последствий ошибки не было (иначе бы давно было замечено).
Но в определенных сценариях, сходимость требовала еще одного цикла
повтора внутри update_gc().
2024-03-15 06:10:10 +03:00
Леонид Юрьев (Leonid Yuriev)
aea40fb79f
mdbx: выпуск 0.12.10 "СЭМ"
Поддерживающий выпуск с исправлением обнаруженных ошибок и устранением недочетов
в память Героя России гвардии майора Дмитрия Семёнова с позывным "СЭМ".

Значимые исправления и доработки:
---------------------------------

 - Устранение унаследованной от LMDB ошибки приводящей к повреждению БД при использовании `MDBX_DUPFIXED`.

 - Исправление ложной ошибки `MDBX_CORRUPTED (-30796)` в сценарии работы
   в режиме `MDBX_DUPFIXED` и нечетной длинной мульти-значений.

 - Исправление недочета корректировки сопутствующих курсоров при разделении страницы
   по сценарию добавления пустой страницы слева.

 - Доработка `rebalance()` ради уменьшения WAF.

 - Исправление assert-проверки внутри `check_txn()` для случая завершенных транзакций в режиме `MDBX_NO_TLS`.
   Последствий ошибки, кроме срабатывания assert-проверки в отладочных сборках, нет.

 - Устранение ошибки при открытии БД на файловой системе только-для-чтения.

 - Удалены излишне строгие проверки в утилите `mdbx_chk`, которые
   приводили к ложно-позитивным ошибкам при проверке БД после серии
   последних доработок.

Более подробная информация в [ChangeLog](https://libmdbx.dqdkfa.ru/md__change_log.html).

git diff' stat: 19 commits, 57 files changed, 751 insertions(+), 331 deletions(-)
Signed-off-by: Леонид Юрьев (Leonid Yuriev) <leo@yuriev.ru>
2024-03-13 14:57:38 +03:00
Леонид Юрьев (Leonid Yuriev)
446d6c9421 mdbx: исправление ошибки открытия БД на ФС только-для-чтения. 2024-03-11 00:34:04 +03:00
Леонид Юрьев (Leonid Yuriev)
36a7e7ac24 mdbx-chk: исправление подсчета места затраченного на выравнивание в случае нечетного кол-ва dupfixed-элементов нечетного размера (backport). 2024-03-06 13:18:58 +03:00
Леонид Юрьев (Leonid Yuriev)
2d7fe42327 mdbx: корректировка условия в assert-проверке для MDBX_TXN_DRAINED_GC (backport). 2024-03-06 13:18:58 +03:00
Леонид Юрьев (Leonid Yuriev)
e515bd56e9 mdbx: исправление assert-проверки внутри check_txn() для случая завершенных транзакций в режиме MDBX_NO_TLS (backport).
По сообщению о проблеме https://t.me/libmdbx/5424
2024-03-06 13:18:58 +03:00
Леонид Юрьев (Leonid Yuriev)
20160ae98f mdbx: доработка rebalance() ради уменьшения WAF (backport).
После предыдущей серии доработок весной 2021 года, функция `rebalance()`
обеспечивала слияние мало заполненной страницы с менее заполненной
соседней, одновременно пытаясь не вовлекать соседних страниц, если те
еще не были скопированы/клонированы/изменены в текущей транзакции.

В целом, реализованная тактика представляется успешной. Однако, при
обновлении GC она иногда приводила к исчерпанию подготовленного резерва
извлеченных из GC страниц. Это не является проблемой, если не считать
вероятность срабатывания `assert(txn->mt_flags & MDBX_TXN_DRAINED_GC)`
в отладочных сборках.

Тем не менее, из этой ситуации можно сделать вывод, что поведение
`rebalance()`, как минимум, может быть обогащено опцией уменьшения WAF
ценой меньшей сбалансированности дерева. Технически при этом слияние
выполняется преимущественно с грязной страницей, если на ней достаточно
места и соседняя страница с другой стороны еще чистая.

ВАЖНО: Соответствующая опция в `enum MDBX_option_t` будет добавлена чуть
позже в следующую версию, а в текущих ветках `master` и `stable` это
именение поведение будет заглушено.
2024-03-06 13:18:58 +03:00
Леонид Юрьев (Leonid Yuriev)
ea97fbae74 mdbx: устранение yнаследованной от LMDB ошибки приводящей к повреждению БД при использовании MDBX_DUPFIXED (backport).
Тезисно:

 - Использование DUPFIXED (включая INTEGERDUP) могло приводить к
   повреждению БД и/или потере данных. Этот коммит устраняет эту угрозу.

 - Вероятность проявления существенно увеличивается с увеличением
   размера/длины мульти-значений/дубликатов (не ключей).

 - В MDBX проблема унаследована от LMDB, где существует более 11 лет,
   начиная с коммита ccc4d23e74
   и до настоящего времени.

Для вложенных страниц типа LEAF2 (которые содержат только значения
одинаковой длины, без таблицы смещений к ним), упомянутым выше коммитом,
было добавлено резервирование места (что в целом спорно, но в некоторых
сценариях позволяет уменьшить накладные расходы). Ошибка была в том, что
в коде не исключалась возможность превышения размера страницы БД, что
далее приводило к арифметическому переполнению, повреждению БД и/или
просписи памяти.
2024-03-06 13:18:58 +03:00
Леонид Юрьев (Leonid Yuriev)
a0a4af7701 mdbx: исправление me_dxb_mmap.current > me_dxb_mmap.limit и срабатывания соответствующей assert-проверки (backport).
Устранение упущения приводящего к нелогичной ситуации `me_dxb_mmap.curren > me_dxb_mmap.limit` при "дребезге" размера БД.
В текущем понимании, последствий кроме срабатывания assert-проверки нет, а вероятность проявления близка к нулю.
2024-03-06 13:18:58 +03:00
Леонид Юрьев (Leonid Yuriev)
74f2bc813b mdbx: продолжение очистки/рефакторинга унаследованных ребусов в cursor_put_nochecklen() (backport). 2024-03-06 13:18:58 +03:00
Леонид Юрьев (Leonid Yuriev)
e2f2fd8652 mdbx: рефакторинг node_shrink() для ясности исходного кода (backport). 2024-03-06 13:18:58 +03:00
Леонид Юрьев (Leonid Yuriev)
fb6be62046 mdbx: исправление недочета корректировки сопутствующих курсоров при разделении страницы по сценарию добавления пустой страницы слева (backport). 2024-03-06 13:18:58 +03:00
Леонид Юрьев (Leonid Yuriev)
049b71c148 mdbx: исправление ложной ошибки MDBX_CORRUPTED (-30796) в сценарии "odd dupfixed" (backport).
Повреждение БД и/или потери данных не происходило, проблема лишь в
возврате ложной ошибки.

Благодарю пользователя/разработчика @Dvirsw (https://t.me/Dvirsw) за
сообщения о проблеме и предоставление минимального/оптимального сценария
воспроизведения.

--

Проблема была из-за излишнего условия при контроле внутренего поля
mp_upper в ходе проверки структуры страниц БД.

Поле mp_upper указывает на нижнуюю границу заполнения страницы от конца
к началу. Вследствие того, что значения ключей выравниваетня на четную
границу, это поле четно во всех случаях за исключением LEAF2-страницы
(листовая страница вложенного дерева для множественных значений
финсированной/одинаковой длины одного ключа), на которой размещено
нечетное количество значений нечетной длины.

Ошибка не проявлялась в большинстве случаев (в том числе в
стохастических тестах), так как штатно лишняя проверка производилась
только при чтении страницы и перебалансировке ключей, но не при каждом
добавлении значения. Тем не менее, сценарии тестов требуют
доработки/расширения для явного добавления нечетных dupfixed-сценариев.
2024-03-06 13:18:58 +03:00
Леонид Юрьев (Leonid Yuriev)
8d67d23224 mdbx: исправление несущественной опечатки в комментарии. 2023-11-28 21:45:41 +03:00
Леонид Юрьев (Leonid Yuriev)
4a7a2034c0 mdbx: новый размер MDBX_opt_rp_augment_limit по умолчанию в 1/3 от текущего кол-ва страниц в БД. 2023-11-28 21:45:21 +03:00
Леонид Юрьев (Leonid Yuriev)
6e4473777e mdbx: проверка pid только для запроса активной env (backport). 2023-11-28 01:10:23 +03:00
Леонид Юрьев (Leonid Yuriev)
b905a6a391 mdbx: const для начала и конца диапазона в аргументах mdbx_estimate_range() (backport). 2023-11-12 21:30:09 +03:00
Леонид Юрьев (Leonid Yuriev)
d94f34b2c0 mdbx: рефакторинг обработки MDBX_GET_MULTIPLE добавление проверки key на NULL (backport). 2023-11-12 21:30:09 +03:00
Леонид Юрьев (Leonid Yuriev)
ab5d290f11 mdbx: проверка номеров корневых страниц в coherency_check() (backport). 2023-11-12 21:29:18 +03:00
Леонид Юрьев (Leonid Yuriev)
7eb2f4130e mdbx: использование const MDBX_txn где это возможно в API (backport). 2023-11-12 19:33:27 +03:00
Леонид Юрьев (Leonid Yuriev)
e2ed55853d mdbx: удаление устаревших mdbx_set_compare() и mdbx_set_dupsort(). 2023-10-23 16:17:05 +03:00
Леонид Юрьев (Leonid Yuriev)
f02a0ffa21 mdbx: возможность использования MDBX_GET_MULTIPLE без предварительной установки курсора. 2023-10-10 22:34:05 +03:00
Леонид Юрьев (Leonid Yuriev)
39f2bb142a mdbx: сокращение излишнего вызова osal_thread_self(). 2023-10-09 20:58:01 +03:00
Леонид Юрьев (Leonid Yuriev)
687622b8b1 mdbx: устранение предупреждений Valgrind при логировании в отладочных сборках.
Достаточно запутано:

 - Внутри `update_gc()` используется создание записей с резервированием
   посредством `put(MDBX_RESERVE)` в циклах с ранним выходом и последующим
   заполнением.

 - При этом в случае раннего выхода (из цикла из-за изменения набора
   страниц) зарезервированное место в добавленных записях остается
   незаполненным/неиницилизированным (подкрашенным в Valgrind или ASAN).

 - Чтение этих незаполненных/неиницилизированных данных штатно не
   происходит, но в отладочных сборках при включении детального уровне
   логирования выполняется отладочный вывод значений ключей и данных при
   позиционировании курсоров.

 - В свою очередь, `update_gc()` либо удаляет, либо заполняет
   зарезервированные записи, но для этого требуется позиционирование
   курсора, что в отладочных сборках приводит к чтению
   незаполненных/неиницилизированных записей и печали Valgrind/ASAN.

Теперь внутри `update_gc()` в отладочных сборках с поддержкой Valgrind
или ASAN место в резервируемых записях явно инициализируется.
2023-10-08 18:31:12 +03:00
Леонид Юрьев (Leonid Yuriev)
fd8a99acff mdbx: доработка mdbx_dump_val() используемой для логирования и отладки.
- Обеспечении терминирующего нуля даже при нехватке буфера и
   опосредованных предупреждений Valgrind из-за чтения внутри strlen()
   неинициализированных данных при последующем логировании/печати.

 - Ускорение за счет отказа от использования snpruintf().
2023-10-08 17:43:13 +03:00
Леонид Юрьев (Leonid Yuriev)
1aead6869a mdbx: костыль для глушения/игнорирования EDEADLK в ряде сценариев при использовании Valgrind или ASAN.
Достаточно запутанно:

 - Для полноценного контроля при использовании Valgrind или ASAN
   требуется закрашивать/отравлять отображение файла БД выше границы
   распределенных страниц.

 - Производить такое подкрашивание/отравление необходимо в синхронизации
   с пишущими транзакциями и запросами на изменение геометрии, в том числе
   при изменении размера БД и/или геометрии другим процессом.

 - Для такой синхронизации логично и проще всего использовать основной
   мьютекс/механизм блокировки пишущих транзакций, что и происходит внутри
   txn_valgrind().

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

 - Как таковая ошибка EDEADLK при этом проблем не создаёт и поэтому
   просто игнорируется. Но утилита mdbx_chk при работе в кооперативном
   (не эксклюзивном) режиме чтения-записи использует именно такой сценарий,
   а возникающую при этом ошибку EDEADLK засчитывает как проблему при
   проверке.

 = В результате, при использовании Valgrind или ASAN утилита mdbx_chk
   запущенная с опциями `-wc` всегда завершается неудачей из-за как минимум
   одной проблемы в ходе проверки. Что внешне выглядит как
   недочет/ошибка/регресс и создает проблемы при автоматизированном
   тестировании.

Добавленный костыль использует atomic-счетчик, который инкремируется до
и декремируется после попытки захвата блокировки изнутри txn_valgrind().
В свою очередь, код обрабатывающий ошибку захвата блокировки, игнорирует
EDEADLK при ненулевом значении счетчика. Активируется костыль только при
сборке с поддержкой Valgrind или включенном ASAN, и не оказывает
никакого влияния в остальных случаях.
2023-10-07 23:37:51 +03:00
Леонид Юрьев (Leonid Yuriev)
6de15514df mdbx: устранение жалобы Valgrind на чтение неинициализированной памяти.
Маркер steady/weak в прототипе/заготовке мета-страницы не
инициализировался, но опосредованно читался кодом проверки
когерентности unified buffer/page cache.

Прочитанное не-инициализированное/случайное значение использовалось в
условии одного из ветвлений, но не оказывало какого-либо влияния, так
как в данном контексте все пути приводят к одному инварианту результата.
2023-10-07 18:27:32 +03:00
Леонид Юрьев (Leonid Yuriev)
cb48ee8f3d mdbx: перезапись в mdbx_put() всех мульти-значений ключа при отсутствии флага MDBX_NOOVERWRITE. 2023-10-07 09:08:28 +03:00
Леонид Юрьев (Leonid Yuriev)
a387284458 mdbx: микро-оптимизация и рефакториг cursor_put_nochecklen().
- удалены переменные-флаги dupdata_flag и do_sub;
 - вместо dupdata_flag используется условие dkey.iov_base != nullptr;
 - вместо do_sub используется условие flags & F_DUPDATA;
 - очищено использование dkey, добавлена инициализация dkey.iov_base в ключевых точках;
 - декларация части переменных перенеса ближе к месту использования.
2023-10-07 09:08:28 +03:00
Леонид Юрьев (Leonid Yuriev)
e7ae8214fd mdbx: исправление cursor_put_nochecklen(MDBX_MULTIPLE). 2023-10-06 21:57:25 +03:00
Леонид Юрьев (Leonid Yuriev)
bc6d320bb2 mdbx: исправление несущественных предупреждений при MDBX_ENABLE_PROFGC=ON.
Thanks @Alain (reported via https://t.me/libmdbx).
2023-10-04 08:18:10 +03:00
Леонид Юрьев (Leonid Yuriev)
d02bdcf2bd mdbx: костыль для GCC при сборке с -m32 -arch=i686 -Ofast.
Обходное решение проблем сборки посредством GCC с использование опций `-m32 -arch=i686 -Ofast`.

Проблема обусловлена ошибкой GCC, из-за которой конструкция `__attribute__((__target__("sse2")))`
не включает полноценное использование инструкций SSE и SSE2, если это не было сделано посредством
опций командной строки, но была использована опция `-Ofast`.

В результате сборка заканчивалась сообщением об ошибке:
    gcc/i686-buildroot-linux-gnu/12.2.0/include/xmmintrin.h: In function 'diffcmp2mask_sse2':
    gcc/i686-buildroot-linux-gnu/12.2.0/include/xmmintrin.h:814:1: error: inlining failed in call to 'always_inline' '_mm_movemask_ps': target specific option mismatch
      814 | _mm_movemask_ps (__m128 __A)
2023-06-09 00:02:31 +03:00
Леонид Юрьев (Leonid Yuriev)
5561cec9c5 mdbx: дополнительный static_assert для контроля выравнивания 64-битного atomic-типа. 2023-06-09 00:02:31 +03:00
Леонид Юрьев (Leonid Yuriev)
ff6674b377 mdbx: не делаем неявных обновлений БД (изменения размера или статуса мета-страниц) в режиме восстановления.
Это позволяет обезопасить БД (снизить шанс её разрушения) если
пользователь при попытке восстановления, либо просто в качестве
эксперимента, задал утилите `mdbx_chk` неверную или опасную комбинацию
параметров.

При этом обычная проверка, как и явное переключение мета-страниц,
работают по-прежнему.
2023-06-09 00:02:31 +03:00
Леонид Юрьев (Leonid Yuriev)
ca6f04c52a mdbx: не учитываем geo.next при сверке геометрии после открытия БД.
Полная сверка геометрии на совпадение (включая geo.next) не является
ошибкой, но может приводить к выводу бессмысленного предупреждения о
пропуске обновлении/перезаписи геометрии при открытии БД в режиме
восстановления (с явным указанием мета-страницы).
2023-06-09 00:02:31 +03:00
Леонид Юрьев (Leonid Yuriev)
db6cf469c9 mdbx: доработка mdbx_env_turn_for_recovery() чтобы не обновлять мета-страницы при отсутствии изменений. 2023-06-09 00:02:31 +03:00
Леонид Юрьев (Leonid Yuriev)
d516e903d4 mdbx: исправление очепятки в mdbx_env_turn_for_recovery().
Исправление опечатки в имени переменной внутри `mdbx_env_turn_for_recovery()`,
что приводило к неверному поведению в некоторых ситуациях.

С точки зрения пользователя, с учетом актуальных сценариев использования
утилиты `mdbx_chk`, был только один специфический/редкий сценарий
проявления ошибки/проблемы - когда выполнялась проверка и активация
слабой/weak мета-страницы с НЕ-последней транзакцией после системной
аварии машины, где БД использовалась в хрупком/небезопасном режиме.
В сценарии, при успешной проверке целевой страницы и её последующей
активации выводилось сообщение об ошибке, связанной со срабатыванием
механизма контроля не-когерентности кэша файловой системы и отображенных
в ОЗУ данных БД. При этом БД успешно восстанавливалось и не было
каких-либо негативных последствия, кроме самого сообщения об ошибке.

Технически же ошибка проявлялась при "переключении" на мета-страницу,
когда у хотя-бы одной из двух других мета-страниц номер транзакции был
больше:

  * Если содержимое других мета-страниц было корректным, а номера
    связанных транзакций были больше, то результирующий номер транзакции в
    целевой/активируемой мета-страницы устанавливается без учета этих
    мета-страниц и мог быть меньше-или-равным.

  * В результате, если такие мета-страницы были в статусе слабых/weak, то
    при закрытии БД после переключения могла срабатывать защита от
    не-когерентности unified buffer/page cache, а в отладочных сборках могла
    срабатывать assert-проверка.

  * Если же такие мета-страницы были в статусе сильных/steady, то
    переключение на новую мета-страницу могло не давать эффекта либо
    приводить к появлению двух мета-страниц с одинаковым номером транзакции,
    что является ошибочной ситуацией.
2023-06-09 00:01:41 +03:00
Леонид Юрьев (Leonid Yuriev)
99c9bc2411 mdbx: использование clang-format-16. 2023-04-19 11:02:53 +03:00
Леонид Юрьев (Leonid Yuriev)
cf9145bb46 mdbx: использование enum-типов вместо int для устранения предупреждений GCC >= 13. 2023-04-19 10:19:11 +03:00
Леонид Юрьев (Leonid Yuriev)
7489c8ce28 mdbx: рефакторинг проверки "когерентности" мета-страниц. 2023-04-05 21:40:00 +03:00
Леонид Юрьев (Leonid Yuriev)
74256efc64 mdbx: refine comment. 2023-04-05 21:40:00 +03:00
Леонид Юрьев (Leonid Yuriev)
fdb2b5b0f1 mdbx: обнуление компараторов при пересоздании MainDB. 2023-03-31 00:55:03 +03:00
Леонид Юрьев (Leonid Yuriev)
95cb73646e mdbx: корректировка отладочного кода для устранения срабатывания assert-проверки. 2023-03-26 22:54:50 +03:00
Леонид Юрьев (Leonid Yuriev)
e0be0d9a5e mdbx: корректировка экспорта устаревших функций API. 2023-03-20 15:48:04 +03:00
Леонид Юрьев (Leonid Yuriev)
2ba7051719 mdbx: удаление из node_read_bigdata() дублирующей диагностики.
Аналогичные проверки и предупреждения выполняются при чтении страниц в режиме `MDBX_VALIDATION`.
2023-03-20 14:39:09 +03:00
Леонид Юрьев (Leonid Yuriev)
22405885f6 mdbx: корректировка излишней assert-проверки внутри override_meta(). 2023-03-01 01:09:10 +03:00
Leonid Yuriev
6d74b10db1 mdbx: поддержка ASAN (Address Sanitizer) при сборке посредством MSVC. 2023-02-28 00:50:30 +03:00
Леонид Юрьев (Leonid Yuriev)
359489e271 mdbx: исправление семантической опечатки в комментарии о режиме работы. 2023-02-27 16:59:10 +03:00
Леонид Юрьев (Leonid Yuriev)
1b6e32071c mdbx: повторное "устранение" предупреждений MSVC Static Analyzer (aka Prefast).
Никаких значимых изменений, только обход "странностей" в MSVC.

Как оказалось MSVC распространяет действие директивы
`pragma(warning(supppress:#))` строго на следующую строку, даже если эта
строка является продолжением комментария начатого в самой директиве
и/или не содержит синтаксических конструкций языка.

Поэтому большинство из добавленных ранее директив для подавления ложных
предупреждений, перестало работать после переформатирования исходного
кода.
2023-02-27 16:59:06 +03:00
Леонид Юрьев (Leonid Yuriev)
29d12f1fc3 mdbx-doc: добавлено примечание к опции MDBX_HAVE_BUILTIN_CPU_SUPPORTS. 2023-02-14 12:09:44 +03:00