Commit Graph

4011 Commits

Author SHA1 Message Date
Леонид Юрьев (Leonid Yuriev)
5c40f6983c mdbx: использование clang-format-19. 2024-07-22 14:53:28 +03:00
Леонид Юрьев (Leonid Yuriev)
cda8ebe0bd mdbx: проверка совместмости флагов GC/FreeDB (backport). 2024-07-22 14:53:28 +03:00
Леонид Юрьев (Leonid Yuriev)
f5bbadf3a5 mdbx: отмена корректировки assert-проверки внутри override_meta() (revert-backport).
This reverts commit a0b520fa32.
2024-07-22 12:33:16 +03:00
Леонид Юрьев (Leonid Yuriev)
58cad2995b mdbx: до-исправление коммита 796b7e44976132944847694fc8caa5b01c07a406 для отладочных сборок. 2024-07-21 23:20:10 +03:00
Леонид Юрьев (Leonid Yuriev)
37217cb199 mdbx-windows: исправление нарезки FILE_SEGMENT_ELEMENT (backport).
Ошибка слишком грубая.
Похоже при переработке I/O под Windows при `git pull --rebase` потерялся коммит.

К повреждению БД проблема не приводила, так как сбой происходил во время записи данных с возвратом ERROR_INVALID_PARAMETER из системного вызова.
2024-07-20 22:54:15 +03:00
Леонид Юрьев (Leonid Yuriev)
a0b520fa32 mdbx: корректировка assert-проверки внутри override_meta() (backport).
После доработок/рефакторинга условие проверки стало неверным.
2024-06-28 12:44:51 +03:00
Леонид Юрьев (Leonid Yuriev)
796b7e4497 mdbx: устранение вероятности SIGSEGV при включении логирования MDBX_LOG_TRACE в отладочных сборках (backport). 2024-06-26 12:26:16 +03:00
Леонид Юрьев (Leonid Yuriev)
341a8b8b5c mdbx++: исправление генерации исключения key_exists (backport).
Из-за совершенной при размножении кода ошибки, вместо отдельного
исключения `mdbx::key_exists` при ошибке `MDBX_KEYEXIST` вбрасывалось
исключении более общего/генерализированного типа `mdbx::exception`.
2024-06-13 11:12:12 +03:00
Леонид Юрьев (Leonid Yuriev)
ad0b13a544 mdbx-doc: исправление опечаток в README. 2024-06-04 12:48:48 +03:00
Леонид Юрьев (Leonid Yuriev)
ba42390a56 mdbx++: исправление append_u8() (backport).
Добавленные после предыдущего выпуска append-функции оказались ошибочны.
Алгоритмически там серия однотипных банальных ошибок (почти опечаток),
из-за которых добавляемые данные записывались в начало среза/slice, а не
в конец.

Исходные ошибки были выявлены тестами в другом проекте и исправлены
почти сразу, но плохой код всё-таки попал в stable-ветку.
Предположительно я спутал ветки и/или tmux-окна, и взял в stable-ветку не
исправленный коммит. Удивительно, что плохой код в devel-ветке не
нарушил работу части новых тестов. Поэтому проблема некоторое время
оставалась не замеченной.
2024-06-04 10:56:15 +03:00
Леонид Юрьев (Leonid Yuriev)
07cfe65ea0 mdbx: исправление закрытия курсоров при завершении вложенных транзакций (backport). 2024-05-25 18:17:10 +03:00
Леонид Юрьев (Leonid Yuriev)
75fd4ecf54 mdbx-testing: костыль для MSVC ARM/ARM64 для предотвращения ICE (backport). 2024-05-22 01:21:10 +03:00
Леонид Юрьев (Leonid Yuriev)
97b0b0192e mdbx-windows: чистка результатов FormatMessageA() от концевых переводов строк (backport). 2024-05-21 18:29:22 +03:00
Леонид Юрьев (Leonid Yuriev)
12e6c631f1 mdbx: уточнение макроса __always_inline для особо яблочных компиляторов (backport). 2024-05-20 18:26:45 +03:00
Леонид Юрьев (Leonid Yuriev)
458f713c53 mdbx++: использование \n вместо std::endl (backport). 2024-05-20 18:24:47 +03:00
Леонид Юрьев (Leonid Yuriev)
a5ed725ae3 mdbx: явное обноление txn и dbi_state у вложенных курсоров для вложенных транзакций. 2024-05-18 13:12:08 +03:00
Леонид Юрьев (Leonid Yuriev)
dd9ba2c769 mdbx: проверка на ноль дополнительных и пока не используемых полей в meta-страницах. 2024-05-13 21:18:30 +03:00
Леонид Юрьев (Leonid Yuriev)
d1565fd326 mdbx: отключение уже ненужной отладки внутри txn_merge() (backport). 2024-04-15 08:18:08 +03:00
Леонид Юрьев (Leonid Yuriev)
e3d4cd5758 mdbx: исправление условий для MDBX_DEPRECATED (backport). 2024-04-04 15:24:10 +03:00
Леонид Юрьев (Leonid Yuriev)
2d2cec094e mdbx: устранение MDBX_EINVAL в случае mdbx_env_remove(".") (backport). 2024-04-04 15:24:04 +03:00
Леонид Юрьев (Leonid Yuriev)
41ebd6dcf3 mdbx++: исправление инверсии bool-результата env::remove() (backport). 2024-04-04 15:15:46 +03:00
Леонид Юрьев (Leonid Yuriev)
f40b2fc164 mdbx++: больше __cold для редко-используемых функций (backport). 2024-04-04 15:15:46 +03:00
Леонид Юрьев (Leonid Yuriev)
8f32f4ac98 mdbx++: buffer::append_bytes() (backport). 2024-04-04 15:15:46 +03:00
Леонид Юрьев (Leonid Yuriev)
c1d3afcbe1 mdbx++: добавление buffer::clear_and_reserve() (backport). 2024-04-04 15:15:46 +03:00
Леонид Юрьев (Leonid Yuriev)
5721296e16 mdbx: опечатки и орфография в ChangeLog. 2024-03-28 11:37:23 +03:00
Леонид Юрьев (Leonid Yuriev)
04f1200c3d
mdbx-doc: исправление опечатки в MDBX_ENV_JUST_DELETE (backport). 2024-03-22 00:28:03 +03:00
Леонид Юрьев (Leonid Yuriev)
dfcd652e5c
mdbx: не взводим MDBX_FATAL_ERROR для не-активной среды при проверке MDBX_ENV_CHECKPID (backport). 2024-03-21 13:22:33 +03:00
Леонид Юрьев (Leonid Yuriev)
25089e6491
mdbx: merge branch master into stable. 2024-03-21 01:10:00 +03:00
Леонид Юрьев (Leonid Yuriev)
61a073687f
mdbx: время учить Русский. 2024-03-19 15:56:37 +03:00
Леонид Юрьев (Leonid Yuriev)
3865e85248 mdbx: орфоргафия. 2024-03-16 20:45:35 +03:00
Леонид Юрьев (Leonid Yuriev)
c70ef83e4a
mdbx: исправление опечатки равно/неравно в условии внутри update_gc().
Существенных последствий ошибки не было (иначе бы давно было замечено).
Но в определенных сценариях, сходимость требовала еще одного цикла
повтора внутри update_gc().
2024-03-15 06:10:10 +03:00
Леонид Юрьев (Leonid Yuriev)
8cc3dba7ae
mdbx: merge branch master into stable. 2024-03-14 19:48:12 +03:00
Леонид Юрьев (Leonid Yuriev)
872bddaee6
mdbx: обновление патча для старых версий buildroot. 2024-03-14 19:46:38 +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)
0741c81cfd mdbx-chk: не считаем ошибкой под-страницы без данных пользователя.
Коммитом 36a7e7ac24 был скорректирован
подсчет места занимаемого заголовками и данными. В частности, байты
занимаемые заголовков вложенной под-страницы теперь относится к
заголовкам, а не пользовательским данным.

Однако, в случае когда на под-странице, созданной для хранения куста
мульти-значений (MDBX_DUPSORT), после серии удалений остаётся одно
значение, которое в MDBX может нулевой длины, получается под-страница с
нулевым количеством пользовательских данных. Этот коммит исправляет
2024-03-12 09:02:50 +03:00
Леонид Юрьев (Leonid Yuriev)
781b3f64d5 mdbx-chk: не считаем ошибочными/проблемными записи нулевой длины в GC.
Технически такие записи не являются проблемными, а образовываются в
случае когда внутри update_gc() резервируется больше места, чем реально
остается номеров свободных страниц для возврата в GC.

Изначально такое избыточное резервирование считалось алгоритмическим
недостатком update_gc(). Поэтому утилита mdbx_chk была временно
доработана для выявления таких случаев в ходе стохастических тестов.

Постепенно все реальные недочеты update_gc() (если не считать
запутанности и неочевидности кода) были устранены, формирование пустых
записей в GC не наблюдалось и излишне строгий контроль в mdbx_chk не
создавал проблем.

В ходе же последних точечных доработок была предпринята попытка еще
немного уменьшить затраты ЦПУ внутри update_gc(), в частности уменьшить
кол-во циклов/повторов посредством улучшения сходимости, а также
уменьшить WAF. При этом образование пустых записей в GC стало возможным
в достаточно редких ситуациях, когда (например) для возврата в GC
остается только одна страница и добавление записи единичной длины
приводит к перебалансировке или разделению листовой страницы по
легковесному пути, без вовлечения других страниц дерева и без
переработки дополнительных записей GC, но с поглощением остававшейся на
возврат страницы.

Проще говоря, в актуальная версии MDBX пустые записи в GC могут
образовываться, когда это энергетически выгодно. Тогда как в предыдущих
выпусках в таких ситуациях выполнялось более дорогое обновление GC с
переработкой и возвратом дополнительных записей.
2024-03-12 02:38:17 +03:00
Леонид Юрьев (Leonid Yuriev)
446d6c9421 mdbx: исправление ошибки открытия БД на ФС только-для-чтения. 2024-03-11 00:34:04 +03:00
Леонид Юрьев (Leonid Yuriev)
fff3fbd866 mdbx: обновление ChangeLog (подготовка к выпуску). 2024-03-06 22:58:31 +03:00
Леонид Юрьев (Leonid Yuriev)
3e850981c7 mdbx-test: расширение стохастического теста dupfixed-сценариями (backport). 2024-03-06 13:18:58 +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)
2b88c6261f mdbx-test: добавление в jitter простого теста txn_reset+txn_renew (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)
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