Commit Graph

886 Commits

Author SHA1 Message Date
Леонид Юрьев (Leonid Yuriev)
44beae00ec mdbx: const для начала и конца диапазона в аргументах mdbx_estimate_range(). 2023-11-12 20:37:57 +03:00
Леонид Юрьев (Leonid Yuriev)
b7605e8033 mdbx: рефакторинг обработки MDBX_GET_MULTIPLE добавление проверки key на NULL. 2023-11-12 20:37:57 +03:00
Леонид Юрьев (Leonid Yuriev)
af4dfe541b mdbx: добавление mdbx_env_resurrect_after_fork() в API. 2023-11-12 01:49:53 +03:00
Леонид Юрьев (Leonid Yuriev)
a22ec56938 mdbx: использование pthread_atfork(after_fork). 2023-11-12 01:49:53 +03:00
Леонид Юрьев (Leonid Yuriev)
ce74fae036 mdbx: рефакторинг и выделение env_open(). 2023-11-12 01:49:53 +03:00
Леонид Юрьев (Leonid Yuriev)
54efb8bd81 mdbx: не считаем ошибки ipc-unlock критичными в случае смены pid. 2023-11-12 01:49:53 +03:00
Леонид Юрьев (Leonid Yuriev)
a3e2300f58 mdbx: возможность вызова osal_lck_destroy() в дочернем процессе после fork(). 2023-11-12 01:49:53 +03:00
Леонид Юрьев (Leonid Yuriev)
7ad54f54b4 mdbx: объединение lck-списка и rthc-таблицы для упрощения (де)регистрации TLS-деструкторов. 2023-11-12 01:49:53 +03:00
Леонид Юрьев (Leonid Yuriev)
97418d5c9c mdbx: рефакторинг env_handle_pathname() для одной точки выделения/освобождения памяти. 2023-11-12 01:00:41 +03:00
Леонид Юрьев (Leonid Yuriev)
1b2f5f25d4 mdbx: рефакторинг и вынос txn_abort() без кода входящих пероверок. 2023-11-12 01:00:41 +03:00
Леонид Юрьев (Leonid Yuriev)
2fe01eee89 mdbx: проверка pid только для запроса активной env. 2023-11-12 01:00:41 +03:00
Леонид Юрьев (Leonid Yuriev)
dea6570fc1 mdbx: доработка coherency_check() для случая плохих номеров корневых страниц. 2023-11-11 12:29:15 +03:00
Леонид Юрьев (Leonid Yuriev)
0916d24321 mdbx: использование опции ENABLE_MEMCHECK вместо ENABLE_VALGRIND и MDBX_USE_VALGRIND. 2023-11-11 12:29:13 +03:00
Леонид Юрьев (Leonid Yuriev)
c9c02dddfb mdbx: добавление mdbx_dbi_rename() в API. 2023-11-11 12:29:10 +03:00
Леонид Юрьев (Leonid Yuriev)
903d964f4d mdbx: интенсивное использование __restrict, в том числе при определении элементов структур. 2023-11-11 12:29:10 +03:00
Леонид Юрьев (Leonid Yuriev)
96504bf338 mdbx: отложенное освобождение имен связанных c dbi-хендлами и добавление опции MDBX_ENABLE_DBI_LOCKFREE.
Отложенное освобождение позволяет реализовать безопасное выполнение
fastpath/lockfree при повторном открытии из других потоков/транзакцйий
уже открытых subDB, что и происходит при активации добавленной опции
сборки `MDBX_ENABLE_DBI_LOCKFREE`.
2023-11-11 12:29:10 +03:00
Леонид Юрьев (Leonid Yuriev)
3622669a9f mdbx: проверка db-флагов и ре-инициализация MainDB при изменении флагов другим процессом. 2023-11-11 12:29:10 +03:00
Леонид Юрьев (Leonid Yuriev)
e6af7d7c53 mdbx: переработка инициализации, проверки и импорта dbi-хендлов в транзакциях.
Ранее инициализация в транзакциях структур данных, связанных с
dbi-хендлами и subDb, выполнялась непосредственно при запуске
транзакций. Что в сценариях с большим кол-вом dbi-дексприторов (например
libfpta) порождало заметные накладные расходы, которые расли линейно от
общего кол-ва открытых subDb, а не от реально используемых в транзакции.
При использовании одной-двух сотен хендлов, при старте каждой транзакции
могли копироваться и/или обнуляться десятки килобайт. Теперь этот
недостаток устранен.

Изменена схема инициализации, валидации и импорта хендлов открытых после
старта транзакции:

1) Инициализация теперь выполняется отложенна, а при старте транзации
   обнуляется только массив с однобайтовыми статустами dbi-хендлов.
   При этом доступнва опция сборки `MDBX_ENABLE_DBI_SPARSE`, при активации
   которой используется битовая карты, что снижает объем инициализации
   при старте транзакции в 8 раз (CHAR_BIT).

2) Переработана валидация dbi-хендлов на входах API, с уменьшением кол-ва
   проверок и ветвлений до теоретического минимума.

3) Переработ импорт dbi-хендов открытых после старта транзакци, теперь
   при этом не захватывается мьютекс.
2023-11-11 12:29:10 +03:00
Леонид Юрьев (Leonid Yuriev)
4b79d46d38 mdbx: удаление поля mt_dbxs из транзакции.
Явного выигрыша или проигрыша в производительности тут нет. Но теперь
меньше алиасинга указателей и чуть меньше полей в транзакциях.
2023-11-11 12:29:10 +03:00
Леонид Юрьев (Leonid Yuriev)
f317170706 mdbx: переименование внутренних полей и макросов для улучшения читаемости кода. 2023-11-11 12:29:10 +03:00
Леонид Юрьев (Leonid Yuriev)
c254c728d2 mdbx: костыль для ложно-положительного предупреждения Coverity. 2023-10-23 20:25:03 +03:00
Леонид Юрьев (Leonid Yuriev)
04511a7a99 mdbx: использование const MDBX_txn где это возможно в API. 2023-10-23 20:25:03 +03:00
Леонид Юрьев (Leonid Yuriev)
4d3f7e1edc mdbx: добавление mdbx_txn_release_all_cursors() в API. 2023-10-23 20:25:03 +03:00
Леонид Юрьев (Leonid Yuriev)
d28a397b2d mdbx: добавление mdbx_cursor_unbind() в API. 2023-10-23 20:25:03 +03:00
Леонид Юрьев (Leonid Yuriev)
5f274eb4c6 mdbx: вывод информации из mdbx_env_chk() о boot-id в каждой мета-странице. 2023-10-23 20:25:03 +03:00
Леонид Юрьев (Leonid Yuriev)
a67b9b9729 mdbx: доработка env_info_snap(). 2023-10-23 20:25:03 +03:00
Леонид Юрьев (Leonid Yuriev)
224f26813e mdbx: возвращение MDBX_TXN_INVALID (INT32_MIN) из mdbx_txn_flags() при передаче невалидной транзакции. 2023-10-23 20:25:03 +03:00
Леонид Юрьев (Leonid Yuriev)
fc1685a178 mdbx: STATIC_ASSERT() для MDBX_TXN_RDONLY_PREPARE. 2023-10-23 20:25:03 +03:00
Леонид Юрьев (Leonid Yuriev)
253a56206b mdbx: переработка и перенос функционала утилиты mdbx_chk внутрь библиотеки. 2023-10-23 20:25:03 +03:00
Леонид Юрьев (Leonid Yuriev)
f0d523c507 mdbx: дополнение API функциями lock/unlock/upgrade/downgrade основной блокировки. 2023-10-23 20:25:03 +03:00
Леонид Юрьев (Leonid Yuriev)
e2ed55853d mdbx: удаление устаревших mdbx_set_compare() и mdbx_set_dupsort(). 2023-10-23 16:17:05 +03:00
Леонид Юрьев (Leonid Yuriev)
f02a0ffa21 mdbx: возможность использования MDBX_GET_MULTIPLE без предварительной установки курсора. 2023-10-10 22:34:05 +03:00
Леонид Юрьев (Leonid Yuriev)
39f2bb142a mdbx: сокращение излишнего вызова osal_thread_self(). 2023-10-09 20:58:01 +03:00
Леонид Юрьев (Leonid Yuriev)
687622b8b1 mdbx: устранение предупреждений Valgrind при логировании в отладочных сборках.
Достаточно запутано:

 - Внутри `update_gc()` используется создание записей с резервированием
   посредством `put(MDBX_RESERVE)` в циклах с ранним выходом и последующим
   заполнением.

 - При этом в случае раннего выхода (из цикла из-за изменения набора
   страниц) зарезервированное место в добавленных записях остается
   незаполненным/неиницилизированным (подкрашенным в Valgrind или ASAN).

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

 - В свою очередь, `update_gc()` либо удаляет, либо заполняет
   зарезервированные записи, но для этого требуется позиционирование
   курсора, что в отладочных сборках приводит к чтению
   незаполненных/неиницилизированных записей и печали Valgrind/ASAN.

Теперь внутри `update_gc()` в отладочных сборках с поддержкой Valgrind
или ASAN место в резервируемых записях явно инициализируется.
2023-10-08 18:31:12 +03:00
Леонид Юрьев (Leonid Yuriev)
fd8a99acff mdbx: доработка mdbx_dump_val() используемой для логирования и отладки.
- Обеспечении терминирующего нуля даже при нехватке буфера и
   опосредованных предупреждений Valgrind из-за чтения внутри strlen()
   неинициализированных данных при последующем логировании/печати.

 - Ускорение за счет отказа от использования snpruintf().
2023-10-08 17:43:13 +03:00
Леонид Юрьев (Leonid Yuriev)
1aead6869a mdbx: костыль для глушения/игнорирования EDEADLK в ряде сценариев при использовании Valgrind или ASAN.
Достаточно запутанно:

 - Для полноценного контроля при использовании Valgrind или ASAN
   требуется закрашивать/отравлять отображение файла БД выше границы
   распределенных страниц.

 - Производить такое подкрашивание/отравление необходимо в синхронизации
   с пишущими транзакциями и запросами на изменение геометрии, в том числе
   при изменении размера БД и/или геометрии другим процессом.

 - Для такой синхронизации логично и проще всего использовать основной
   мьютекс/механизм блокировки пишущих транзакций, что и происходит внутри
   txn_valgrind().

 - Однако, в этой схеме может возникать ошибка EDEADLK, когда
   txn_valgrind() вызывается при завершении читающей транзакции
   выполняющейся с дополнительной блокировкой пишущих транзакций.

 - Как таковая ошибка EDEADLK при этом проблем не создаёт и поэтому
   просто игнорируется. Но утилита mdbx_chk при работе в кооперативном
   (не эксклюзивном) режиме чтения-записи использует именно такой сценарий,
   а возникающую при этом ошибку EDEADLK засчитывает как проблему при
   проверке.

 = В результате, при использовании Valgrind или ASAN утилита mdbx_chk
   запущенная с опциями `-wc` всегда завершается неудачей из-за как минимум
   одной проблемы в ходе проверки. Что внешне выглядит как
   недочет/ошибка/регресс и создает проблемы при автоматизированном
   тестировании.

Добавленный костыль использует atomic-счетчик, который инкремируется до
и декремируется после попытки захвата блокировки изнутри txn_valgrind().
В свою очередь, код обрабатывающий ошибку захвата блокировки, игнорирует
EDEADLK при ненулевом значении счетчика. Активируется костыль только при
сборке с поддержкой Valgrind или включенном ASAN, и не оказывает
никакого влияния в остальных случаях.
2023-10-07 23:37:51 +03:00
Леонид Юрьев (Leonid Yuriev)
6de15514df mdbx: устранение жалобы Valgrind на чтение неинициализированной памяти.
Маркер steady/weak в прототипе/заготовке мета-страницы не
инициализировался, но опосредованно читался кодом проверки
когерентности unified buffer/page cache.

Прочитанное не-инициализированное/случайное значение использовалось в
условии одного из ветвлений, но не оказывало какого-либо влияния, так
как в данном контексте все пути приводят к одному инварианту результата.
2023-10-07 18:27:32 +03:00
Леонид Юрьев (Leonid Yuriev)
cb48ee8f3d mdbx: перезапись в mdbx_put() всех мульти-значений ключа при отсутствии флага MDBX_NOOVERWRITE. 2023-10-07 09:08:28 +03:00
Леонид Юрьев (Leonid Yuriev)
a387284458 mdbx: микро-оптимизация и рефакториг cursor_put_nochecklen().
- удалены переменные-флаги dupdata_flag и do_sub;
 - вместо dupdata_flag используется условие dkey.iov_base != nullptr;
 - вместо do_sub используется условие flags & F_DUPDATA;
 - очищено использование dkey, добавлена инициализация dkey.iov_base в ключевых точках;
 - декларация части переменных перенеса ближе к месту использования.
2023-10-07 09:08:28 +03:00
Леонид Юрьев (Leonid Yuriev)
e7ae8214fd mdbx: исправление cursor_put_nochecklen(MDBX_MULTIPLE). 2023-10-06 21:57:25 +03:00
Леонид Юрьев (Leonid Yuriev)
bc6d320bb2 mdbx: исправление несущественных предупреждений при MDBX_ENABLE_PROFGC=ON.
Thanks @Alain (reported via https://t.me/libmdbx).
2023-10-04 08:18:10 +03:00
Леонид Юрьев (Leonid Yuriev)
d02bdcf2bd mdbx: костыль для GCC при сборке с -m32 -arch=i686 -Ofast.
Обходное решение проблем сборки посредством GCC с использование опций `-m32 -arch=i686 -Ofast`.

Проблема обусловлена ошибкой GCC, из-за которой конструкция `__attribute__((__target__("sse2")))`
не включает полноценное использование инструкций SSE и SSE2, если это не было сделано посредством
опций командной строки, но была использована опция `-Ofast`.

В результате сборка заканчивалась сообщением об ошибке:
    gcc/i686-buildroot-linux-gnu/12.2.0/include/xmmintrin.h: In function 'diffcmp2mask_sse2':
    gcc/i686-buildroot-linux-gnu/12.2.0/include/xmmintrin.h:814:1: error: inlining failed in call to 'always_inline' '_mm_movemask_ps': target specific option mismatch
      814 | _mm_movemask_ps (__m128 __A)
2023-06-09 00:02:31 +03:00
Леонид Юрьев (Leonid Yuriev)
5561cec9c5 mdbx: дополнительный static_assert для контроля выравнивания 64-битного atomic-типа. 2023-06-09 00:02:31 +03:00
Леонид Юрьев (Leonid Yuriev)
ff6674b377 mdbx: не делаем неявных обновлений БД (изменения размера или статуса мета-страниц) в режиме восстановления.
Это позволяет обезопасить БД (снизить шанс её разрушения) если
пользователь при попытке восстановления, либо просто в качестве
эксперимента, задал утилите `mdbx_chk` неверную или опасную комбинацию
параметров.

При этом обычная проверка, как и явное переключение мета-страниц,
работают по-прежнему.
2023-06-09 00:02:31 +03:00
Леонид Юрьев (Leonid Yuriev)
ca6f04c52a mdbx: не учитываем geo.next при сверке геометрии после открытия БД.
Полная сверка геометрии на совпадение (включая geo.next) не является
ошибкой, но может приводить к выводу бессмысленного предупреждения о
пропуске обновлении/перезаписи геометрии при открытии БД в режиме
восстановления (с явным указанием мета-страницы).
2023-06-09 00:02:31 +03:00
Леонид Юрьев (Leonid Yuriev)
db6cf469c9 mdbx: доработка mdbx_env_turn_for_recovery() чтобы не обновлять мета-страницы при отсутствии изменений. 2023-06-09 00:02:31 +03:00
Леонид Юрьев (Leonid Yuriev)
d516e903d4 mdbx: исправление очепятки в mdbx_env_turn_for_recovery().
Исправление опечатки в имени переменной внутри `mdbx_env_turn_for_recovery()`,
что приводило к неверному поведению в некоторых ситуациях.

С точки зрения пользователя, с учетом актуальных сценариев использования
утилиты `mdbx_chk`, был только один специфический/редкий сценарий
проявления ошибки/проблемы - когда выполнялась проверка и активация
слабой/weak мета-страницы с НЕ-последней транзакцией после системной
аварии машины, где БД использовалась в хрупком/небезопасном режиме.
В сценарии, при успешной проверке целевой страницы и её последующей
активации выводилось сообщение об ошибке, связанной со срабатыванием
механизма контроля не-когерентности кэша файловой системы и отображенных
в ОЗУ данных БД. При этом БД успешно восстанавливалось и не было
каких-либо негативных последствия, кроме самого сообщения об ошибке.

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

  * Если содержимое других мета-страниц было корректным, а номера
    связанных транзакций были больше, то результирующий номер транзакции в
    целевой/активируемой мета-страницы устанавливается без учета этих
    мета-страниц и мог быть меньше-или-равным.

  * В результате, если такие мета-страницы были в статусе слабых/weak, то
    при закрытии БД после переключения могла срабатывать защита от
    не-когерентности unified buffer/page cache, а в отладочных сборках могла
    срабатывать assert-проверка.

  * Если же такие мета-страницы были в статусе сильных/steady, то
    переключение на новую мета-страницу могло не давать эффекта либо
    приводить к появлению двух мета-страниц с одинаковым номером транзакции,
    что является ошибочной ситуацией.
2023-06-09 00:01:41 +03:00
Леонид Юрьев (Leonid Yuriev)
99c9bc2411 mdbx: использование clang-format-16. 2023-04-19 11:02:53 +03:00
Леонид Юрьев (Leonid Yuriev)
cf9145bb46 mdbx: использование enum-типов вместо int для устранения предупреждений GCC >= 13. 2023-04-19 10:19:11 +03:00
Леонид Юрьев (Leonid Yuriev)
7489c8ce28 mdbx: рефакторинг проверки "когерентности" мета-страниц. 2023-04-05 21:40:00 +03:00