Я хочу автоматически проверить, реагирует ли программа должным образом, если не удается прочитать необходимый файл БД SQLite (что приводит к ошибке ввода-вывода). Именно это произошло несколько дней назад у клиента. Мы исправили это вручную, но теперь я хочу создать автоматический код, чтобы исправить это, и мне нужен доступ к поврежденному файлу, чтобы проверить это.
Поскольку все в Unix - это файл, я подозревал, что может существовать специальный файл, который всегда вызывает ошибки ввода-вывода, когда кто-то пытается его прочитать (например, в / dev).
Некоторые похожие файлы (IMO) будут:
/dev/full
который всегда говорит "Нет свободного места на устройстве", если вы пытаетесь написать его/dev/null
и/dev/zero
поэтому я предположил, что просто должен быть такой файл (но пока не нашел).
Кто-нибудь знает такой файл или любой другой метод для меня, чтобы получить желаемый результат (намеренно неисправный образ раздела, обертка вокруг open () с использованием LD_PRELOAD, ...)?
Какой лучший способ пойти сюда?
Ответы:
Вы можете использовать
dmsetup
для создания устройства сопоставления устройств, используя целиerror
илиflakey
для имитации сбоев.Где 123 - длина устройства, в секторах, а / dev / loop0 - исходное устройство, на котором вы хотите симулировать ошибки. Для ошибки вам не нужны последующие аргументы, поскольку она всегда возвращает ошибку.
источник
dmsetup table test
. Вы можете даже написатьfoo bar
позадиerror
; это просто не волнует (и поэтому должно быть удалено).Ответы на этот вопрос уже есть о переполнении стека и сбое сервера, но некоторые методы отсутствовали. Чтобы упростить жизнь, вот список виртуальных устройств / блочных устройств Linux / файловой системы Linux / библиотеки пользовательских пространств ввода-вывода Linux:
--layout
Параметр справочной страницы mdadm, чтобы узнать, как его настроить (биты ядра и ядра mdadm).LD_PRELOAD
).FAIL_MAKE_REQUEST=y
).BLK_DEV_NULL_BLK_FAULT_INJECTION=y
).delay
или,error
а затем подключите к нему блочное устройствоnbd-client
(биты ядра + NBD, пространство> = 4.18, построенное с поддержкой NBD, nbdclient> = 3.18 и nbdkit> = 1.8.1 рекомендуется - см. Демонстрационное видео NBDKit около 20-минутной отметки).Дополнительный факт: в SQLite есть драйвер VFS для имитации ошибок, поэтому он может обеспечить хорошее тестовое покрытие.
Связанный:
источник
Вы хотите механизм ввода неисправности для ввода / вывода.
В Linux есть метод, который не требует предварительной настройки и генерирует необычную ошибку (не EIO «Ошибка ввода-вывода», а ESRCH «Нет такого процесса»):
где 1234 - PID процесса, запущенного от имени того же пользователя, что и тестируемый процесс, но не самого процесса. Кредиты rubasov для мышления о
/proc/$pid/mem
.Если вы используете PID самого процесса, вы получаете EIO, но только если вы читаете из области, которая не отображается в памяти процесса. Первая страница никогда не отображается, поэтому нормально, если вы читаете файл последовательно, но не подходит для процесса базы данных, который ищет непосредственно в середине файла.
С некоторыми дополнительными настройками в качестве пользователя root вы можете использовать устройство отображения карт для создания файлов с допустимыми секторами и поврежденными секторами.
Другой подход заключается в реализации небольшой файловой системы FUSE . EIO - это код ошибки по умолчанию, когда драйвер вашей файловой системы пользователя делает что-то не так, так что это легко сделать. Оба Perl и Python привязки поставляются с примерами , чтобы начать работу, вы можете быстро написать файловую систему , которая в основном зеркала существующие файлы , но впрыскивает EIO в тщательно выбранных местах. Существует такая файловая система: petardfs ( статья ), я не знаю, насколько хорошо она работает из коробки.
Еще один метод - это
LD_PRELOAD
обертка. Существующим является Libfiu (внедрение ошибок в пользовательском пространстве). Он работает путем предварительной загрузки библиотеки, которая перегружает вызовы API POSIX. Вы можете написать простые директивы или произвольный C-код для переопределения нормального поведения.источник
Решение намного проще, если можно использовать файл устройства как «файл с ошибками ввода-вывода». Мое предложение для тех случаев, когда обычный файл должен иметь такие ошибки.
Я должен признать, что я немного запутался, потому что мне не удалось прочитать отдельные сектора из этого файла без ошибки (с
dd .. seek=...
). Может быть, это проблема упреждающего чтения.источник
Вы можете использовать CharybdeFS, которая была сделана именно для этой цели.
Это сквозная файловая система с предохранителями типа PetardFS, но гораздо более настраиваемая.
Смотрите кулинарную книгу CharybdeFS здесь: http://www.scylladb.com/2016/05/02/fault-injection-filesystem-cookbook/
Он достаточно продвинут, чтобы проверить базу данных.
источник