4081 Commits

Author SHA1 Message Date
Леонид Юрьев (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>
v0.12.9
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: устранение внутреннего регресса проверки состояние внутри транзакции.
После f0d523c507042cc70eeeb690778c9b2be6a8b33f, при использовании
добавленного 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
Леонид Юрьев (Leonid Yuriev)
1db44c7914 mdbx++: перенос в public типов buffer::move_assign_alloc и buffer::copy_assign_alloc для старых стандартов C++. 2023-12-05 15:32:18 +03:00
Леонид Юрьев (Leonid Yuriev)
f97c127455 mdbx-test: тест для doubtless-API позиционирования курсоров. 2023-12-05 15:32:18 +03:00
Леонид Юрьев (Leonid Yuriev)
100f07e89a mdbx++: дополнительные операторы преобразования к типам C API. 2023-12-05 15:32:18 +03:00
Леонид Юрьев (Leonid Yuriev)
e68771df18 mdbx++: Добавление buffer_pair<> и buffer_pair_spec<>. 2023-12-05 15:32:18 +03:00
Леонид Юрьев (Leonid Yuriev)
ef69336189 mdbx-test: добавление теста для транскодеров hex/base64/base58. 2023-12-05 15:32:18 +03:00
Леонид Юрьев (Leonid Yuriev)
0e250a4457 mdbx++: добавление поддержки std::span<>. 2023-12-05 15:32:18 +03:00
Леонид Юрьев (Leonid Yuriev)
be8428257d mdbx++: переделка поддержки base58 по RFC-draft. 2023-12-05 15:32:18 +03:00
Леонид Юрьев (Leonid Yuriev)
dd47f1bfd9 mdbx++: переход на использование по-умолчанию default_allocator вместо legacy_allocator. 2023-12-05 15:32:18 +03:00
Леонид Юрьев (Leonid Yuriev)
1f2ff07796 mdbx++: переработка/исправление to_hex(). 2023-12-05 15:32:18 +03:00
Леонид Юрьев (Leonid Yuriev)
b412807fc1 mdbx++: добавление mdbx::default_buffer. 2023-12-05 15:32:18 +03:00
Леонид Юрьев (Leonid Yuriev)
8a6bddef44 mdbx++: поправка форматирования против бага clang-format. 2023-12-05 15:32:18 +03:00
Леонид Юрьев (Leonid Yuriev)
304cf25149 mdbx++: использование slice::invalid() для предотвращения незаметного неверного использования API. 2023-12-05 15:32:18 +03:00
Леонид Юрьев (Leonid Yuriev)
869cfb3fae mdbx++: исправление опечатки в doxygen-описании. 2023-12-05 15:32:18 +03:00
Леонид Юрьев (Leonid Yuriev)
0a58601cdf mdbx++: добавление pair::invalid() и взаимодействия с std::pair<>. 2023-12-05 15:32:18 +03:00
Леонид Юрьев (Leonid Yuriev)
355090f02e mdbx++: добавление is_xyz() для key_mode и value_mode. 2023-12-05 15:32:18 +03:00