mirror of
https://github.com/isar/libmdbx.git
synced 2025-11-07 07:18:56 +08:00
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, и не оказывает никакого влияния в остальных случаях.
This commit is contained in:
@@ -1482,6 +1482,7 @@ struct MDBX_env {
|
||||
int me_valgrind_handle;
|
||||
#endif
|
||||
#if defined(MDBX_USE_VALGRIND) || defined(__SANITIZE_ADDRESS__)
|
||||
MDBX_atomic_uint32_t me_ignore_EDEADLK;
|
||||
pgno_t me_poison_edge;
|
||||
#endif /* MDBX_USE_VALGRIND || __SANITIZE_ADDRESS__ */
|
||||
|
||||
|
||||
Reference in New Issue
Block a user