2450 Commits

Author SHA1 Message Date
Леонид Юрьев (Leonid Yuriev)
3282adf8bd mdbx: исправление регресса в пути обработки MDBX_MULTIPLE (backport).
Пакетная вставка значений посредством операции `MDBX_MULTIPLE` могла
приводить к падениям и повреждению структуры БД. Ошибка оставалось не
замеченной из-за специфических условий проявления, которые не
реализовались в тестах.

Проблема присутствовала во всех выпусках начиная с v0.13.1, но
соответствующая ошибка не связана с конкретным коммита в истории, а
является следствием нескольких доработок (шагов рефакторинга), которые
суммарно привели к регрессу.

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

Основным условием проявления является пакетная вставка multi-значений в
dupsort-таблицу с фиксированным размером значений, при котором набор
значений соответствующий обновляемом ключу, перестаёт помещаться на
вложенной странице и преобразуется/выносится во вложенное дерево
страниц. Если такой вынос/преобразование происходило до исчерпания
переданного набора значений, то при следующей итерации повторно
производились действия соответствующие выносу данных в отдельное дерево
страниц. Что могла приводить как к разыменованию неверных указателей
(повреждению содержимого памяти) и/или к повреждению содержимого страниц
образующих структуру БД.

Исправление свелось к добавлению одной строчки кода, но также были
расширены тесты для покрытия соответствующих сценариев.
2025-03-20 01:49:42 +03:00
Леонид Юрьев (Leonid Yuriev)
c457804fad mdbx: исправление затенения курсоров во вложенных транзакциях (backport). 2025-03-20 01:46:13 +03:00
Леонид Юрьев (Leonid Yuriev)
6c036add8b mdbx: переработка проверки курсоров на входе API-функций с добавлением cursor_check() (backport). 2025-03-20 01:44:20 +03:00
Леонид Юрьев (Leonid Yuriev)
5fd319bbc2 mdbx: переработка mdbx_txn_release_all_cursors_ex() (backport). 2025-03-20 01:42:50 +03:00
Леонид Юрьев (Leonid Yuriev)
682233ba28 mdbx++: переформатирование (временно) неиспользуемого кода (backport). 2025-03-20 01:41:58 +03:00
Леонид Юрьев (Leonid Yuriev)
58729a2fbd mdbx: корректировка описания MDBX_MVCC_RETARDED и соответствующего сообщения об ошибке (backport). 2025-03-20 01:40:11 +03:00
Леонид Юрьев (Leonid Yuriev)
5dfe3433a8 mdbx: устранение гонки в tbl_setup(MDBX_DUPFIXED | MDBX_INTEGERDUP) при работе в разных потоках (backport).
Проблема была в том, что в случаях фиксированного размера значений
clc.lmin/clc.lmax устанавливались в env->kvs[], а затем корректировались
по актуальному размеру данных в БД. Поэтому при конкурентном вызове из
разных потоков, один поток мог выполнять инициализацию, а второй
прочитать временные/промежуточные значения lmin/lmax.

В результате, при конкурентном старте транзакций в разных потоках при
использовании только-что открытого dbi-хендла, проверка допустимости
длины значения могла заканчиваться ложной ошибкой MDBX_BAD_VALSIZE.
2025-03-20 01:24:34 +03:00
Леонид Юрьев (Leonid Yuriev)
1720762080 mdbx: переименование cursor_validate() (backport). 2025-03-20 01:24:30 +03:00
Леонид Юрьев (Leonid Yuriev)
91570a084f mdbx: добавление MDBX_SEEK_AND_GET_MULTIPLE в API операций курсора (backport). 2025-03-20 01:17:47 +03:00
Леонид Юрьев (Leonid Yuriev)
753b2270fd mdbx: добавление mdbx_cursor_close2() в API (backport). 2025-03-20 01:14:34 +03:00
Леонид Юрьев (Leonid Yuriev)
33ceba0a5a mdbx: добавление cursor_reset() и cursor_drown() (backport). 2025-03-20 01:13:44 +03:00
Леонид Юрьев (Leonid Yuriev)
2476fba287 mdbx: рефакторинг cursor_eot() для упрощения txn_done_cursors() (backport). 2025-03-20 01:12:59 +03:00
Леонид Юрьев (Leonid Yuriev)
2b6a768750 mdbx: косметический рефакторинг cursor_shadow() (backport). 2025-03-20 01:12:15 +03:00
Леонид Юрьев (Leonid Yuriev)
b6dcdcf2dc mdbx: запрещение unbind/close курсоров для вложенных транзакций (backport). 2025-03-20 01:10:11 +03:00
Леонид Юрьев (Leonid Yuriev)
175e4a2e1b mdbx: проверка владельца потока владеющего транзакцией только при MDBX_TXN_CHECKOWNER=ON (backport). 2025-03-20 01:06:56 +03:00
Леонид Юрьев (Leonid Yuriev)
15bd9cfc89 mdbx: удаление const у транзакции в cursor_bind() и cursor_renew() (backport). 2025-03-20 00:52:16 +03:00
Леонид Юрьев (Leonid Yuriev)
d8f9f3ba58 mdbx: проверяем выравнивание размера БД на юнит выделения памяти, а не на размер страницы (backport).
Теоретически до этого коммита могла быть некоторая неувязка:
 - при открытии БД с размером страницы 4K на Windows (где размер секции кратен 64K) в режиме read-only,
 - после того как БД использовалась на POSIX (где размер отображения кратен размеру системной страницы).

Ранее ошибка могла возвращаться со стороны системы (например INVALID_PARAMETER) и по ней крайне сложно было понять в чем дело.
Теперь же будет логирование ошибки и возврат MDBX_WANNA_RECOVERY.
2025-03-20 00:46:45 +03:00
Леонид Юрьев (Leonid Yuriev)
4150f411dc mdbx: переработка проверка размера файла БД при открытии (backport).
Переработка 05cdf9d202b14ac09c801c7893e65271fa27f378. У предыдущего
варианта был недостаток, при необходимости выдачи предупреждения
и открытии БД с изменением геометрии, предупреждение не выдавалось,
что может затруднять анализ/разбор проблемных ситуаций.
2025-03-20 00:45:57 +03:00
Леонид Юрьев (Leonid Yuriev)
94a2abaf31 mdbx: добавление в API mdbx_txn_release_all_cursors_ex() и изменение семантики результата mdbx_txn_release_all_cursors() (backport).
По недосмотру в выпусках остался предварительный/черновой вариант
функции mdbx_txn_release_all_cursors(), который смешивает в возвращаемом
значении информацию об ошибке/успехе и количество обработанных курсоров.
За-за чего невозможно отличить одно от другого, например ошибку EPERM на
Linux от одного успешно закрытого курсора.

Теперь mdbx_txn_release_all_cursors() возвращает только код ошибки,
а для получения кол-ва закрытых курсоров в API добавлена функция mdbx_txn_release_all_cursors_ex().
2025-03-04 14:45:13 +03:00
Леонид Юрьев (Leonid Yuriev)
0604accecf mdbx: проверка владельца потока владеющего транзакцией только при MDBX_TXN_CHECKOWNER=ON (backport). 2025-03-04 10:44:42 +03:00
Леонид Юрьев (Leonid Yuriev)
40f655e2da mdbx: корректировка log_error() для устранение ложных ошибок при работе mdbx_chk с высоким уровнем логирования (backport).
Некая проблема была в том, что при высоком уровне логирования в логгер
также отправлялись неизбежные MDBX_NOTFOND при достижении конца
интегрируемых данных. В свою очередь, chk-логика формирования отчета
подсчитывала эти сообщения как ошибки при проверке БД...
2025-03-03 01:49:32 +03:00
Леонид Юрьев (Leonid Yuriev)
5e714ed946 mdbx: переделка env_owned_wrtxn() и мест её вызова (backport).
Цель в том чтобы избавить от коллизии блокировки возникающей внутри
dxb_sanitize_tail() при использовании Valgrind/ASAN, а также упросить
код.
2025-03-03 01:49:25 +03:00
Леонид Юрьев (Leonid Yuriev)
d313008d82 mdbx: дополнительные проверки сигнатур курсоров при итерации связанных списков (backport). 2025-03-02 16:38:27 +03:00
Леонид Юрьев (Leonid Yuriev)
9277daa185 mdbx: более полная очистка курсоров при закрытии/отключении (backport). 2025-03-02 16:37:49 +03:00
Леонид Юрьев (Leonid Yuriev)
90635e7248 mdbx: исправление наследования dbi-хендла открытого в дочерней транзакции без изменения данных. 2025-03-02 16:03:20 +03:00
Леонид Юрьев (Leonid Yuriev)
1ec13c63ab mdbx: устранение сбоя аудита таблиц при инвалидации dbi-хендла вследствие отмены вложенной транзакции (backport). 2025-03-02 16:03:20 +03:00
Леонид Юрьев (Leonid Yuriev)
c712147eeb mdbx: исправление оплошности в спецификации формата при логировании имен таблиц (backport). 2025-03-02 16:03:20 +03:00
Леонид Юрьев (Leonid Yuriev)
23600241e1 mdbx: уменьшение в 16 раз предлагаемого размера БД для устранения проблем Valgrind/ASAN (backport). 2025-03-02 16:03:20 +03:00
Леонид Юрьев (Leonid Yuriev)
0ef0f49e2e mdbx: устранение излишнего предупреждения при смене размера БД во время открытия (backport).
Изменение геометрии (увеличение размера) больших БД может быть не
возможно после их открытия вследствие системных ограничений (отсутствия
свободного адресного пространства).

Поэтому API предусматривает возможность запросить изменение
геометрии/размера БД перед её открытием. В этом сценарии ранее могло
выдаваться лишнее/ненужное предупреждение о несоответствии файла БД
новому размеру. Теперь этот недостаток исправлен.

Спасибо Илье Михееву (Erigon) за сообщение об этом недочете.
2025-02-19 23:38:15 +03:00
Леонид Юрьев (Leonid Yuriev)
79572b4850 mdbx: корректировка излишне строгого условия в assert-проверке внутри recalculate_subpage_thresholds() (backport). 2025-02-11 14:03:13 +03:00
Леонид Юрьев (Leonid Yuriev)
21630ea115 mdbx: устранение регресса вероятности SIGSEGV при вытеснении/spilling страниц (backport).
Ошибка внесена коммитом `a6f7d74a32a3cbcc310916a624a31302dbebfa07` от
2024-03-07 и присутствует в выпусках v0.13.1, v0.13.2, v0.13.3. Проблема
оставалась незамеченной из-за специфических условий и низкой вероятности
проявления.

Суть ошибки:

- функция cursor_touch() подготавливает стек страниц курсора к внесению
  изменений, при этом все страницы в стеке (от корневой до листовой
  в текущей позиции курсора) должны стать доступными для модификации.

- микрооптимизация добавленная коммитом пропускала обход стека, если
  корневая страница уже доступна для модификации, но это
  допустимо/корректно только при отсутствии в стеке вытесненных/spilled
  страниц.

- если же складывалась ситуация когда в стека была вытесненная
  некорневая страница, то она так и оставалась недоступной для записи и
  при попытке её изменения возникал SIGSEGV.
2025-01-27 11:18:50 +03:00
Леонид Юрьев (Leonid Yuriev)
11e1346f9d mdbx: исправление опечатки в cursor_touch() (backport).
При переделке курсоров было пропущено отрицание в условии, при оценке
кол-ва страниц, которые могут потребоваться для выполнения операции.

В текущем понимании ошибка не приводила к каким-либо проблемам, ибо
оценка делает по верхней границе с существенным запасом, а в худшем
случае это могло приводить к прерыванию транзакции из-за достижения
ограничения на кол-во грязных страниц.
2025-01-26 17:05:40 +03:00
Леонид Юрьев (Leonid Yuriev)
a59c5f9316 mdbx: упрощение gcu_loose() (backport). 2025-01-26 10:16:02 +03:00
Леонид Юрьев (Leonid Yuriev)
36abcc57f0 mdbx: обновление года в © (backport). 2025-01-18 10:58:31 +03:00
Леонид Юрьев (Leonid Yuriev)
c751977bf7 mdbx-tools: добавление логирования ошибок/предупреждений по все утилиты. 2025-01-12 14:38:20 +03:00
Леонид Юрьев (Leonid Yuriev)
e5fe279632 mdbx: логирование ошибок при открытии lck-файла. 2025-01-12 14:30:39 +03:00
Леонид Юрьев (Leonid Yuriev)
8408a2eed3 mdbx: добавление разделителя между MDBX_BUILD_FLAGS_CONFIG и MDBX_BUILD_FLAGS (косметика). 2025-01-12 11:54:24 +03:00
Леонид Юрьев (Leonid Yuriev)
0297136648 mdbx: улучшение авто-переключения в режим without-lck при открытии БД на read-only-носителе. 2025-01-12 02:58:59 +03:00
Леонид Юрьев (Leonid Yuriev)
92a49c7c8c mdbx: устранение риска потери/перезаписи errno при неожиданных ошибках в close(). 2025-01-12 02:58:59 +03:00
Леонид Юрьев (Leonid Yuriev)
b75e16f4f8 mdbx: устранение null-dereference регресса в режиме readonly-without-lck. 2025-01-12 02:58:59 +03:00
Леонид Юрьев (Leonid Yuriev)
9c8f90b713 mdbx: доработка эвристик для выбора/подстройки default-значений в mdbx_env_set_geometry(). 2025-01-11 02:30:53 +03:00
Леонид Юрьев (Leonid Yuriev)
b00e8ea13f mdbx: использование txl_contain() в audit(). 2025-01-08 13:29:10 +03:00
Леонид Юрьев (Leonid Yuriev)
faa9753d2d mdbx: перемещение и корректировка комментария размечающего внутренние поля пишущей транзакции. 2025-01-05 14:44:00 +03:00
Леонид Юрьев (Leonid Yuriev)
5ba257fafc mdbx: добавление упущенного static для txl_reserve(). 2025-01-05 14:44:00 +03:00
Леонид Юрьев (Leonid Yuriev)
bad6e3c2e2 mdbx: очистка флажка ENV_TXKEY внутри rthc_dtor().
На штатную работу это никак не влияет, но немного облегчит разбор
ситуаций когда глобальный конструктор не вызывается, либо делается
попытка вызвать его дважды (из-за ошибок rtc/libc, etc).
2025-01-05 14:40:56 +03:00
Леонид Юрьев (Leonid Yuriev)
dc98f06d2c mdbx: логирование и возврат MDBX_INCOMPATIBLE при попытке запуска вложенных транзакций в режиме MDBX_WRITEMAP. 2025-01-03 22:14:00 +03:00
Леонид Юрьев (Leonid Yuriev)
1bf008ac16 mdbx: доработка контроля потока-владельца транзакции.
1. Теперь допускается commit/abort вложенных транзакций из любого треда в режиме MDBX_NOSTICKYTHREADS.

2. Более наглядные/явные проверки без зависимости от больше/меньше.
Одна проверка внутри check_txn() для всех основных случаев (bad_bits != 0) и две проверки для abort/reset/break (bad_bits == 0).

+-------------------------------------------------------------------------------------------------------+
|          Три анализируемых txn->flags       |         Проверка txn->owner == osal_thread_self()       |
+-----------------+------------+--------------+-----------------------+---------------------------------+
| NOSTICKYTHREADS | TXN_RDONLY | TXN_FINISHED | usual (bad_bits != 0) | abort/reset/break (bad_bits==0) |
|      -          |     -      |     -        |     +                 |         +                       |
|      -          |     -      |     +        |     +                 |         +                       |
|      -          |     +      |     -        |     +                 |         +                       |
|      -          |     +      |     +        |     +                 |         -                       |
|      +          |     -      |     -        |     -                 |         -                       |
|      +          |     -      |     +        |     +                 |         +                       |
|      +          |     +      |     -        |     -                 |         -                       |
|      +          |     +      |     +        |     +                 |         -                       |
+-------------------------------------------------------------------------------------------------------+
2025-01-03 22:12:17 +03:00
Леонид Юрьев (Leonid Yuriev)
1e4e2eb3c8 mdbx-doc: исправление опечатки в комментарии. 2024-12-29 08:42:48 +03:00
Леонид Юрьев (Leonid Yuriev)
df8b15f639 mdbx: const для транзакции в txn_take_gcprof(). 2024-12-28 09:38:08 +03:00
Леонид Юрьев (Leonid Yuriev)
26f6fd351a mdbx: подстройка dirty-pages-limit при старте транзакций. 2024-12-27 09:39:36 +03:00