2494 Commits

Author SHA1 Message Date
Леонид Юрьев (Leonid Yuriev)
02b56e185f mdbx: добавление rkl_find() и rkl_merge(). 2025-04-21 21:38:17 +03:00
Леонид Юрьев (Leonid Yuriev)
a56f5acc3d mdbx: рефакторинг tree_rebalance() и реализации опции MDBX_opt_prefer_waf_insteadof_balance. 2025-04-20 18:46:08 +03:00
Леонид Юрьев (Leonid Yuriev)
4b9427685a mdbx: добавление внутренней опции MDBX_DEBUG_DPL_LIMIT. 2025-03-31 00:54:07 +03:00
Леонид Юрьев (Leonid Yuriev)
650569cc6a mdbx: merge branch master into devel. 2025-03-31 00:52:52 +03:00
Леонид Юрьев (Leonid Yuriev)
d8f46344b5
mdbx: добавление MDBX_VERSION_UNSTABLE и маркировка master-ветки для предотвращения ошибок сборки. 2025-03-31 00:51:23 +03:00
Леонид Юрьев (Leonid Yuriev)
4c3df230d3 mdbx: hole-iterator для rkl. 2025-03-30 20:04:49 +03:00
Леонид Юрьев (Leonid Yuriev)
b8c1b835ed mdbx: добавление rkl с итераторами.
RKL — сортированный набор txnid, использующий внутри комбинацию
непрерывного интервала и списка. Обеспечивает хранение id записей при
переработке, очистку и обновлении GC, включая возврат остатков
переработанных страниц.

Итератор для RKL — обеспечивает изоляцию внутреннего устройства rkl от
остального кода, чем существенно его упрощает. Фактически именно
использованием rkl с итераторами ликвидируется "ребус" исторически
образовавшийся в gc-update.

--

При переработке GC записи преимущественно выбираются последовательно, но
это не гарантируется. В LIFO-режиме переработка и добавление записей в
rkl происходит преимущественно в обратном порядке, но из-за завершения
читающих транзакций могут быть «скачки» в прямом направлении. В
FIFO-режиме записи GC перерабатываются в прямом порядке и при этом
линейно, но не обязательно строго последовательно, при этом
гарантируется что между добавляемыми в rkl идентификаторами в GC нет
записей, т.е. между первой (минимальный id) и последней (максимальный
id) в GC нет записей и весь интервал может быть использован для возврата
остатков страниц в GC.

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

Реализация rkl достаточно проста/прозрачная, если не считать неочевидную
«магию» обмена непрерывного интервала и образующихся в списке
последовательностей. Однако, именно этот автоматически выполняемый без
лишних операций обмен оправдывает все накладные расходы.
2025-03-30 20:04:49 +03:00
Леонид Юрьев (Leonid Yuriev)
db163cbcfd mdbx: перемещение узлов в node_add_branch() после проверки переполнения страницы. 2025-03-30 17:41:33 +03:00
Леонид Юрьев (Leonid Yuriev)
936c25e671 mdbx: добавление assert-проверок для отлова ошибок приводящих к переполнению/повреждению страниц. 2025-03-30 17:41:33 +03:00
Леонид Юрьев (Leonid Yuriev)
b308559dd9 mdbx: понижение уровня логирования для "skip update meta".
Спасибо [Илье Михееву](https://github.com/JkLondon) за сообщение о недочете.
2025-03-28 15:12:10 +03:00
Леонид Юрьев (Leonid Yuriev)
94531a9cdc mdbx++: вброс std::invalid_argument с явным сообщением "MDBX_EINVAL" . 2025-03-22 19:43:23 +03:00
Леонид Юрьев (Leonid Yuriev)
021d83b841 mdbx: устранение регресса при использовании курсоров для DBI=0 в читающих транзакциях.
В результате рефакторинга и ряда оптимизаций для завершения/гашения
курсоров в читающих и пишущих транзакций стал использоваться общий код.
Причем за основу, был взят соответствующий фрагмент относящийся к
пишущим транзакциям, в которых пользователю не позволяется
использоваться курсоры для DBI=0 и поэтому эта итераций пропускалась.

В результате, при завершении читающих транзакциях, курсоры связанные с
DBI=0 не завершались должным образом, а при их повторном использовании
или явном закрытии после завершения читающей транзакции происходило
обращение к уже освобожденной памяти. Если же такие курсоры
отсоединялись или закрывались до завершения читающей транзакции, то
ошибка не имела шансов на проявление.

Спасибо Илье Михееву (https://github.com/JkLondon) и команде Erigon (https://erigon.tech) за сообщения о проблеме.
2025-03-22 19:08:52 +03:00
Леонид Юрьев (Leonid Yuriev)
06f8573f5f mdbx: усиление контроля сигнатур курсоров. 2025-03-20 17:20:47 +03:00
Леонид Юрьев (Leonid Yuriev)
694626727f mdbx: использование cmp_lenfast() вместо cmp_lenfast(). 2025-03-18 10:46:55 +03:00
Леонид Юрьев (Leonid Yuriev)
7a923b3d41 mdbx: рефакторинг проверок с выносом в cursor_check_multiple(). 2025-03-18 10:46:55 +03:00
Леонид Юрьев (Leonid Yuriev)
8008afc6e1 mdbx: поддержка MDBX_MULTIPLE с нулевым размером данных. 2025-03-18 10:46:55 +03:00
Леонид Юрьев (Leonid Yuriev)
7ae11e0fdb mdbx++: явное определение external-инстанцирования mdbx::buffer<> c API-атрибутами. 2025-03-17 23:28:58 +03:00
Леонид Юрьев (Leonid Yuriev)
5c1745a7cd mdbx: добавление гистограммы количества multi-значений/дубликатов в chk. 2025-03-17 23:28:46 +03:00
Леонид Юрьев (Leonid Yuriev)
23a417fe19 mdbx: исправление регресса в пути обработки MDBX_MULTIPLE.
Пакетная вставка значений посредством операции `MDBX_MULTIPLE` могла
приводить к падениям и повреждению структуры БД. Ошибка оставалось не
замеченной из-за специфических условий проявления, которые не
реализовались в тестах.

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

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

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

Исправление свелось к добавлению одной строчки кода, но также были
расширены тесты для покрытия соответствующих сценариев.
2025-03-17 23:28:28 +03:00
Леонид Юрьев (Leonid Yuriev)
db44f4ed71 mdbx-tools: добавление опции -c (concise) в mdbx_dump. 2025-03-17 23:28:16 +03:00
Леонид Юрьев (Leonid Yuriev)
dcf35e5306 mdbx: исправление затенения курсоров во вложенных транзакциях. 2025-03-17 23:25:53 +03:00
Леонид Юрьев (Leonid Yuriev)
aeac971f0b mdbx: переработка проверки курсоров на входе API-функций с добавлением cursor_check(). 2025-03-17 23:25:30 +03:00
Леонид Юрьев (Leonid Yuriev)
6c8047a402 mdbx: переработка mdbx_txn_release_all_cursors_ex(). 2025-03-17 23:20:40 +03:00
Леонид Юрьев (Leonid Yuriev)
438d185250 mdbx++: переформатирование (временно) неиспользуемого кода. 2025-03-17 23:20:28 +03:00
Леонид Юрьев (Leonid Yuriev)
7a72d1b273 mdbx: корректировка описания MDBX_MVCC_RETARDED и соответствующего сообщения об ошибке. 2025-03-17 23:15:48 +03:00
Леонид Юрьев (Leonid Yuriev)
3e91500fac mdbx: устранение гонки в tbl_setup(MDBX_DUPFIXED | MDBX_INTEGERDUP) при работе в разных потоках.
Проблема была в том, что в случаях фиксированного размера значений
clc.lmin/clc.lmax устанавливались в env->kvs[], а затем корректировались
по актуальному размеру данных в БД. Поэтому при конкурентном вызове из
разных потоков, один поток мог выполнять инициализацию, а второй
прочитать временные/промежуточные значения lmin/lmax.

В результате, при конкурентном старте транзакций в разных потоках при
использовании только-что открытого dbi-хендла, проверка допустимости
длины значения могла заканчиваться ложной ошибкой MDBX_BAD_VALSIZE.
2025-03-17 23:13:26 +03:00
Леонид Юрьев (Leonid Yuriev)
546b48b6eb mdbx: переименование cursor_validate(). 2025-03-17 23:01:30 +03:00
Леонид Юрьев (Leonid Yuriev)
2ffa5cf371 mdbx: добавление MDBX_SEEK_AND_GET_MULTIPLE в API операций курсора. 2025-03-17 22:58:57 +03:00
Леонид Юрьев (Leonid Yuriev)
b2bd8bae38 mdbx: добавление mdbx_cursor_close2() в API. 2025-03-17 22:57:38 +03:00
Леонид Юрьев (Leonid Yuriev)
1299653457 mdbx: добавление cursor_reset() и cursor_drown(). 2025-03-17 22:24:23 +03:00
Леонид Юрьев (Leonid Yuriev)
333069e7a8 mdbx: рефакторинг cursor_eot() для упрощения txn_done_cursors(). 2025-03-17 21:38:42 +03:00
Леонид Юрьев (Leonid Yuriev)
436998ca83 mdbx: косметический рефакторинг cursor_shadow(). 2025-03-17 21:06:45 +03:00
Леонид Юрьев (Leonid Yuriev)
b0665f7016 mdbx: запрещение unbind/close курсоров для вложенных транзакций. 2025-03-17 20:48:19 +03:00
Леонид Юрьев (Leonid Yuriev)
4fcfb07b97 mdbx: корректировка mdbx_panic() для вывода переданного сообщения через __assert_failed(). 2025-03-17 20:47:47 +03:00
Леонид Юрьев (Leonid Yuriev)
a3265e11dc mdbx: добавление в API mdbx_txn_release_all_cursors_ex() и изменение семантики результата mdbx_txn_release_all_cursors().
По недосмотру в выпусках остался предварительный/черновой вариант
функции mdbx_txn_release_all_cursors(), который смешивает в возвращаемом
значении информацию об ошибке/успехе и количество обработанных курсоров.
За-за чего невозможно отличить одно от другого, например ошибку EPERM на
Linux от одного успешно закрытого курсора.

Теперь mdbx_txn_release_all_cursors() возвращает только код ошибки,
а для получения кол-ва закрытых курсоров в API добавлена функция mdbx_txn_release_all_cursors_ex().
2025-03-04 14:21:25 +03:00
Леонид Юрьев (Leonid Yuriev)
709d524d21 mdbx: проверка владельца потока владеющего транзакцией только при MDBX_TXN_CHECKOWNER=ON. 2025-03-04 10:52:30 +03:00
Леонид Юрьев (Leonid Yuriev)
826cdb708f mdbx: корректировка log_error() для устранение ложных ошибок при работе mdbx_chk с высоким уровнем логирования.
Некая проблема была в том, что при высоком уровне логирования в логгер
также отправлялись неизбежные MDBX_NOTFOND при достижении конца
интегрируемых данных. В свою очередь, chk-логика формирования отчета
подсчитывала эти сообщения как ошибки при проверке БД...
2025-03-03 01:12:35 +03:00
Леонид Юрьев (Leonid Yuriev)
da24fda578 mdbx: добавление print-подобных функций в chk для удобства отладки. 2025-03-03 01:11:55 +03:00
Леонид Юрьев (Leonid Yuriev)
0fa21a3c0d mdbx: переделка env_owned_wrtxn() и мест её вызова.
Цель в том чтобы избавить от коллизии блокировки возникающей внутри
dxb_sanitize_tail() при использовании Valgrind/ASAN, а также упросить
код.
2025-03-02 23:29:40 +03:00
Леонид Юрьев (Leonid Yuriev)
dd9f608320 mdbx: дополнительные проверки сигнатур курсоров при итерации связанных списков. 2025-03-02 11:46:10 +03:00
Леонид Юрьев (Leonid Yuriev)
28ca18972a mdbx: более полная очистка курсоров при закрытии/отключении. 2025-03-02 11:44:10 +03:00
Леонид Юрьев (Leonid Yuriev)
fbb93f9cfb mdbx: удаление const у транзакции в cursor_bind() и cursor_renew(). 2025-03-02 10:41:38 +03:00
Леонид Юрьев (Leonid Yuriev)
9273e2ee60 mdbx: исправление наследования dbi-хендла открытого в дочерней транзакции без изменения данных. 2025-03-02 00:40:18 +03:00
Леонид Юрьев (Leonid Yuriev)
e035f102ab mdbx: устранение сбоя аудита таблиц при инвалидации dbi-хендла вследствие отмены вложенной транзакции. 2025-03-02 00:10:56 +03:00
Леонид Юрьев (Leonid Yuriev)
1240ed2ba3 mdbx: исправление оплошности в спецификации формата при логировании имен таблиц. 2025-03-02 00:10:56 +03:00
Леонид Юрьев (Leonid Yuriev)
6ca63b46d8 mdbx: уменьшение в 16 раз предлагаемого размера БД для устранения проблем Valgrind/ASAN. 2025-03-02 00:10:56 +03:00
Леонид Юрьев (Leonid Yuriev)
9b31c517e6 mdbx: проверяем выравнивание размера БД на юнит выделения памяти, а не на размер страницы.
Теоретически до этого коммита могла быть некоторая неувязка:
 - при открытии БД с размером страницы 4K на Windows (где размер секции кратен 64K) в режиме read-only,
 - после того как БД использовалась на POSIX (где размер отображения кратен размеру системной страницы).

Ранее ошибка могла возвращаться со стороны системы (например INVALID_PARAMETER) и по ней крайне сложно было понять в чем дело.
Теперь же будет логирование ошибки и возврат MDBX_WANNA_RECOVERY.
2025-02-20 23:11:28 +03:00
Леонид Юрьев (Leonid Yuriev)
54d8c0d290 mdbx: переработка проверка размера файла БД при открытии.
Переработка 05cdf9d202b14ac09c801c7893e65271fa27f378. У предыдущего
варианта был недостаток, при необходимости выдачи предупреждения
и открытии БД с изменением геометрии, предупреждение не выдавалось,
что может затруднять анализ/разбор проблемных ситуаций.
2025-02-20 23:11:28 +03:00
Леонид Юрьев (Leonid Yuriev)
05cdf9d202 mdbx: устранение излишнего предупреждения при смене размера БД во время открытия.
Изменение геометрии (увеличение размера) больших БД может быть не
возможно после их открытия вследствие системных ограничений (отсутствия
свободного адресного пространства).

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

Спасибо Илье Михееву (Erigon) за сообщение об этом недочете.
2025-02-19 23:22:18 +03:00
Леонид Юрьев (Leonid Yuriev)
4730abe3e5 mdbx: корректировка излишне строгого условия в assert-проверке внутри recalculate_subpage_thresholds(). 2025-02-11 14:01:10 +03:00