Commit Graph

4196 Commits

Author SHA1 Message Date
Леонид Юрьев (Leonid Yuriev)
74f2bc813b mdbx: продолжение очистки/рефакторинга унаследованных ребусов в cursor_put_nochecklen() (backport). 2024-03-06 13:18:58 +03:00
Леонид Юрьев (Leonid Yuriev)
1a18369015 mdbx-test: фиксация транзакции при ошибках теста для последующего анализа БД (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)
f7e6bd770a mdbx-test: соответствие протоколируемых имен тестов опциям командной строки (backport). 2024-03-06 13:18:58 +03:00
Леонид Юрьев (Leonid Yuriev)
ba5c74e54d mdbx-test: добавление extra/dupfixed_addodd (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)
5df3eb6449 mdbx-test: усиление сценариев тестовых целей в GNUmakefile и CMake. 2024-03-06 11:35:10 +03:00
Леонид Юрьев (Leonid Yuriev)
1549d3970c mdbx: корректировка условия в assert-проверке для MDBX_TXN_DRAINED_GC. 2024-03-05 15:22:09 +03:00
Леонид Юрьев (Leonid Yuriev)
1c174e84c4 mdbx: добавление mdbx_preopen_snapinfo() в API.
https://gitflic.ru/project/erthink/libmdbx/issue/15
2024-03-05 13:10:29 +03:00
Леонид Юрьев (Leonid Yuriev)
0b87ddc6d4 mdbx-test: добавление в jitter простого теста txn_reset+txn_renew. 2024-03-05 13:10:29 +03:00
Леонид Юрьев (Leonid Yuriev)
eca0f46368 mdbx: исправление assert-проверки внутри check_txn() для случая завершенных транзакций в режиме MDBX_NO_TLS.
По сообщению о проблеме https://t.me/libmdbx/5424
2024-03-05 13:10:29 +03:00
Леонид Юрьев (Leonid Yuriev)
fe498de323 mdbx: устранение в cursor_set() повторного сравнения с нулевым элементом на листовой странице. 2024-03-05 13:10:29 +03:00
Леонид Юрьев (Leonid Yuriev)
4ed05689bc mdbx: переименование setup_sdb() для читаемости кода (косметика). 2024-03-05 13:10:29 +03:00
Леонид Юрьев (Leonid Yuriev)
0c24b49bbf mdbx-test: расширение стохастического теста dupfixed-сценариями. 2024-03-05 13:10:29 +03:00
Леонид Юрьев (Leonid Yuriev)
d8db63a67d mdbx-test: чуть более разумное/удобное поведение при коллизии генерации не-уникальных пар ключ-значение. 2024-03-05 13:10:29 +03:00
Леонид Юрьев (Leonid Yuriev)
e29cb076d3 mdbx-test: доработка генератора ключей/значений для надежной генерации уникальных значений.
В текущем понимании коммитом этим устраняется застарелая проблема редких
сбоев стохастического теста из-за вероятности ошибочной генерации
повторяющихся пар key-value.
2024-03-05 13:10:28 +03:00
Леонид Юрьев (Leonid Yuriev)
9480599afa mdbx: доработка rebalance() ради уменьшения WAF.
После предыдущей серии доработок весной 2021 года, функция `rebalance()`
обеспечивала слияние мало заполненной страницы с менее заполненной
соседней, одновременно пытаясь не вовлекать соседних страниц, если те
еще не были скопированы/клонированы/изменены в текущей транзакции.

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

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

Соответствующая опция в `enum MDBX_option_t` будет добавлена чуть позже.
2024-03-03 17:56:43 +03:00
Леонид Юрьев (Leonid Yuriev)
72e51ee370 mdbx: устранение yнаследованной от LMDB ошибки приводящей к повреждению БД при использовании MDBX_DUPFIXED.
Тезисно:

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

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

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

Для вложенных страниц типа LEAF2 (которые содержат только значения
одинаковой длины, без таблицы смещений к ним), упомянутым выше коммитом,
было добавлено резервирование места (что в целом спорно, но в некоторых
сценариях позволяет уменьшить накладные расходы). Ошибка была в том, что
в коде не исключалась возможность превышения размера страницы БД, что
далее приводило к арифметическому переполнению, повреждению БД и/или
просписи памяти.
2024-03-03 17:56:43 +03:00
Леонид Юрьев (Leonid Yuriev)
aa9d2387e5 mdbx: исправление me_dxb_mmap.current > me_dxb_mmap.limit и срабатывания соответствующей assert-проверки.
Устранение упущения приводящего к нелогичной ситуации `me_dxb_mmap.curren > me_dxb_mmap.limit` при "дребезге" размера БД.
В текущем понимании, последствий кроме срабатывания assert-проверки нет, а вероятность проявления близка к нулю.
2024-03-03 17:56:16 +03:00
Леонид Юрьев (Leonid Yuriev)
fa0017591d mdbx: продолжение очистки/рефакторинга унаследованных ребусов в cursor_put_nochecklen(). 2024-03-03 17:38:41 +03:00
Леонид Юрьев (Leonid Yuriev)
d7f259110c mdbx-test: фиксация транзакции при ошибках теста для последующего анализа БД. 2024-03-03 17:38:41 +03:00
Леонид Юрьев (Leonid Yuriev)
d53dc4572c mdbx: рефакторинг node_shrink() для ясности исходного кода. 2024-03-03 17:38:41 +03:00
Леонид Юрьев (Leonid Yuriev)
2e863cf7e0 mdbx: исправление недочета корректировки сопутствующих курсоров при разделении страницы по сценарию добавления пустой страницы слева. 2024-03-03 17:38:41 +03:00
Леонид Юрьев (Leonid Yuriev)
826441741d mdbx: добавление keysize_min() и valsize_min() в API. 2024-03-03 17:38:41 +03:00
Леонид Юрьев (Leonid Yuriev)
00c4e2636e mdbx-test: обновление ГПСЧ. 2024-03-03 17:38:41 +03:00
Леонид Юрьев (Leonid Yuriev)
3373631cff mdbx-test: унификация PRNG и изменение опции командной строки на --prng-seed. 2024-03-03 17:38:23 +03:00
Леонид Юрьев (Leonid Yuriev)
c5ac7b25c9 mdbx-test: доработка генератора пар key-value для поддержки коротких ключей в режиме MDBX_DUPFIXED. 2024-02-28 20:12:39 +03:00
Леонид Юрьев (Leonid Yuriev)
544c6bc1e4 mdbx-test: поддержка rnd/rand/random для опций --keylen и --datalen. 2024-02-28 20:12:39 +03:00
Леонид Юрьев (Leonid Yuriev)
164d112507 mdbx: доработка chk-функционала с устранением ошибок и недочетов. 2024-02-28 20:12:39 +03:00
Леонид Юрьев (Leonid Yuriev)
fb5dbbdf20 mdbx-test: соответствие протоколируемых имен тестов опциям командной строки (косметика). 2024-02-28 20:12:38 +03:00
Леонид Юрьев (Leonid Yuriev)
b1dcd07be4 mdbx: устранение ошибки в поддержке MDBX_ENABLE_DBI_LOCKFREE. 2024-02-28 20:12:38 +03:00
Леонид Юрьев (Leonid Yuriev)
603ce05435 mdbx: исправление vlen_min для режима dupfixed. 2024-02-28 20:12:38 +03:00
Леонид Юрьев (Leonid Yuriev)
ba719ef12a mdbx-test: доработка after-fork сценариев с устранением логической ошибки. 2024-02-28 20:12:38 +03:00
Леонид Юрьев (Leonid Yuriev)
f0cfedc26f mdbx-test: добавление extra/dupfixed_addodd. 2024-02-28 20:12:38 +03:00
Леонид Юрьев (Leonid Yuriev)
fbc83dd069 mdbx: исправление ложной ошибки MDBX_CORRUPTED (-30796) в сценарии "odd dupfixed".
Повреждение БД и/или потери данных не происходило, проблема лишь в
возврате ложной ошибки.

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

--

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

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

Ошибка не проявлялась в большинстве случаев (в том числе в
стохастических тестах), так как штатно лишняя проверка производилась
только при чтении страницы и перебалансировке ключей, но не при каждом
добавлении значения. Тем не менее, сценарии тестов требуют
доработки/расширения для явного добавления нечетных dupfixed-сценариев.
2024-02-28 20:12:38 +03:00
Леонид Юрьев (Leonid Yuriev)
185e43f3a8
mdbx: выпуск 0.12.9 "Ясень-4"
Стабилизирующий выпуск с исправлением обнаруженных ошибок и устранением недочетов.

Исправления и доработки:
------------------------

 - Ликвидация зависимости от ранее удаленной опции `MDBX_ENABLE_PREFAULT`, из-за
   чего опция `MDBX_ENABLE_MINCORE` не включалась автоматически, что приводило
   к не-активации соответствующего улучшения и не-достижению  декларируемого уровня
   производительности в сценариях использования в режиме `MDBX_WRITEMAP`.

 - Исправление авто-установки `MDBX_ENV_CHECKPID` при отключении использования
   функционала `madvise()` посредством опции сборки `MDBX_ENABLE_MADVISE=0`.
   Из-за чего при поддержке системой `madvise(MADV_DONTFORK)` не включался контроль pid.

 - Добавлена проверка переданного ключа на `NULL` при обработке `MDBX_GET_MULTIPLE`.

 - Добавлена проверка номеров корневых страниц в `coherency_check()`.

 - Обеспечен `const` для начала и конца диапазона в аргументах `mdbx_estimate_range()`.

 - Из разрабатываемой версии перенесены не-нарушающие совместимости доработки C++ API:

     - добавлен тип `mdbx::cursor::estimation_result`, а поведение методов
      `cursor::estimate()` унифицировано с `cursor::move()`;
     - для предотвращения незаметного неверного использования API, для инициализации
       возвращаемых по ссылке срезов, вместо пустых срезов задействован `slice::invalid()`;
     - добавлены дополнительные C++ операторы преобразования к типам C API;
     - для совместимости со старыми стандартами C++ и старыми версиями STL перенесены
       в public классы `buffer::move_assign_alloc` и `buffer::copy_assign_alloc`;
     - добавлен тип `mdbx::default_buffer`;
     - для срезов и буферов добавлены методы `hex_decode()`, `base64_decode()`, `base58_decode()`;
     - добавлен тип `mdbx::comparator` и функций `mdbx::default_comparator()`;
     - добавлены статические методы `buffer::hex()`, `base64()`, `base58()`;
     - для транзакций и курсоров добавлены методы `get_/set_context`;
     - добавлен метод `cursor::clone()`;

 - Поддержка base58 приведена в соответствии с черновиком RFC.

 - Переработка/исправление `to_hex()` и `from_hex()`.

 - Уменьшение `MDBX_opt_rp_augment_limit` по умолчанию до 1/3 от текущего количества страниц в БД.

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

git diff' stat: 32 commits, 8 files changed, 667 insertions(+), 401 deletions(-)
Signed-off-by: Леонид Юрьев (Leonid Yuriev) <leo@yuriev.ru>
2023-12-11 23:24:05 +03:00
Леонид Юрьев (Leonid Yuriev)
f16c4303bf mdbx: исправление опечатки в комментарии. 2023-12-08 16:47:40 +03:00
Леонид Юрьев (Leonid Yuriev)
72332a8f9e mdbx: устранение несущественного замечания Coverity. 2023-12-08 15:09:01 +03:00
Леонид Юрьев (Leonid Yuriev)
6b72d88fde mdbx: исправление внутреннего регресса lck_serize_rc в сценарии повторного открытия БД одним процессом. 2023-12-05 15:32:18 +03:00
Леонид Юрьев (Leonid Yuriev)
4c139b3619 mdbx: устранение внутреннего регресса проверки состояние внутри транзакции.
После f0d523c507, при использовании
добавленного API блокировок, возможно ложно-положительное определение
состояние "внутри транзакции".
2023-12-05 15:32:18 +03:00
Леонид Юрьев (Leonid Yuriev)
169e69c52e mdbx: подстройка rp_augment_limit в зависимости от gc_time_limit.
Когда rp_augment_limit не задан пользователем посредством
`MDBX_opt_rp_augment_limit`, то как и ранее он подстраивается в
зависимости от текущего размера БД (актуального кол-ва страниц).

Теперь-же авто-устанавливаемое значение rp_augment_limit вычисляется
обратно-пропорционально `MDBX_opt_gc_time_limit`:

 - Если gc_time_limit == 0, то rp_augment_limit устанавливается в 1/3 от
   общего кол-ва страниц БД, но не меньше рационального минимума.
   Это соответствует прежнему поведению и обеспечивает достаточно глубокую
   переработку GC во всех не-экстремальных сценариях.

 - При gc_time_limit >= 16_секунд
   rp_augment_limit устанавливается в минимальное значение.

 - Когда 0 < gc_time_limit < 16_секунд
   rp_augment_limit устанавливается между минимумом и 1/3 от размера БД
   пропорционально остатку gc_time_limit до 16 секунд.

Соответственно, при больших значениях gc_time_limit, выбирается меньшее
значение rp_augment_limit, и контроль глубины переработки GC
ограничивается в основном по-времени.
2023-12-05 15:32:18 +03:00
Леонид Юрьев (Leonid Yuriev)
eeec44f56d mdbx: добавление MDBX_opt_gc_time_limit. 2023-12-05 15:32:18 +03:00
Леонид Юрьев (Leonid Yuriev)
508cf83c32 mdbx: исправление несущественной опечатки в комментарии. 2023-12-05 15:32:18 +03:00
Леонид Юрьев (Leonid Yuriev)
eb90ec6192 mdbx: новый размер MDBX_opt_rp_augment_limit по умолчанию в 1/3 от текущего кол-ва страниц в БД. 2023-12-05 15:32:18 +03:00
Леонид Юрьев (Leonid Yuriev)
e316bc8b29 mdbx-test: увеличения таймаута для smoke-теста на случай параллельного выполнения под Valgrind. 2023-12-05 15:32:18 +03:00
Леонид Юрьев (Leonid Yuriev)
5a86afaac3 mdbx-test: 3-часовой таймаут для extra_doubtless_positioning при использовании Valgrind. 2023-12-05 15:32:18 +03:00
Леонид Юрьев (Leonid Yuriev)
349759648d mdbx: правка rthc_afterfork() для Valgrind. 2023-12-05 15:32:18 +03:00
Леонид Юрьев (Leonid Yuriev)
43dbf8ec4f mdbx: правка txn_valgrind() для случая resurrect-after-fork. 2023-12-05 15:32:18 +03:00
Леонид Юрьев (Leonid Yuriev)
14558fa90b mdbx-test: правка тестов для совместимости с проблемными версиями glibc и glibc++. 2023-12-05 15:32:18 +03:00