Я не нашел способа настроить мерзавца на этом четвертом уровне. Единственный путь, кажется, использование переопределений значения конфигурации на команду git -c key=value
.
Мое текущее hacky решение состоит в том, чтобы определить функцию оболочки, которая служит оберткой для мерзавца. При вызове это передает аргументы на системную команду мерзавца, но не прежде, чем проверить существующий рабочий каталог и добавить дополнительный аргумент команде если применимо.
function git () {
case "$PWD" in
/path/to/repos/*)
command git -c user.email=alternate@credentials.org "$@"
;;
*)
command git "$@"
;;
esac
}
Можно использовать dmsetup
создать устройство картопостроителя устройства с помощью любого error
или flakey
цели для моделирования отказов.
dmsetup create test --table '0 123 flakey 1 0 /dev/loop0'
Где 123 длина устройства, в секторах, и/dev/loop0 является исходным устройством, на котором Вы хотите моделировать ошибки. Для ошибки Вам не нужны последующие аргументы, поскольку она всегда возвращает ошибку.
Вы хотите механизм внесения неисправности для ввода-вывода.
На Linux вот метод, который не требует никакой предшествующей установки и генерирует необычную ошибку (не EIO “ошибка ввода/вывода”, но ESRCH “Никакой такой процесс”):
cat /proc/1234/mem
где 1234 является PID процесса, работающего как тот же пользователь как процесс, Вы тестируете, но не, которые обрабатывают себя. Кредиты к rubasov для размышления /proc/$pid/mem
.
При использовании PID самого процесса Вы получаете EIO, но только если Вы читаете из области, которая не отображается в памяти процесса. Первая страница никогда не отображается, таким образом, хорошо при чтении файла последовательно, но не подходящие для процесса базы данных, который ищет непосредственно на середину файла.
Еще с некоторой установкой как корень можно усилить картопостроитель устройства для создания файлов с допустимыми секторами и поврежденными секторами.
Другой подход должен был бы реализовать маленькую файловую систему FUSE. EIO является кодом ошибки по умолчанию, когда Ваш драйвер файловой системы пространства пользователя делает что-то не так, таким образом, легко достигнуть. И Perl и привязка Python идут с примерами для начала работы, можно быстро записать файловую систему, которая главным образом зеркально отражает существующие файлы, но вводит EIO в тщательно выбранных местах. Существует существующее такая файловая система: petardfs (статья), я не знаю, как хорошо это работает из поля.
Еще один метод LD_PRELOAD
обертка. Существующим является Libfiu (внесение неисправности в пространстве пользователя). Это работает путем предварительно загружения библиотеки, которая перегружает вызовы API POSIX. Можно записать простые директивы или произвольный код C для переопределения нормального поведения.
Решение намного легче, если нормально использовать файл устройств в качестве "файла с ошибками ввода-вывода". Мое предложение для тех случаев, где регулярный файл должен иметь такие ошибки.
> dd if=/dev/zero of=/path/to/ext2.img bs=10M count=10
> losetup /dev/loop0 /path/to/ext2.img
> blockdev --getsz /dev/loop0
204800
> echo "0 204800 linear /dev/loop0 0" | dmsetup create sane_dev
> mke2fs /dev/mapper/sane_dev # ext2 reicht
> mount -t ext2 /dev/mapper/sane_dev /some/where
> dd if=/dev/zero of=/some/where/unreadable_file bs=512 count=4
> hdparm --fibmap /some/where/unreadable_file
/mnt/tmp/unreadable_file:
filesystem blocksize 1024, begins at LBA 0; assuming 512 byte sectors.
byte_offset begin_LBA end_LBA sectors
0 2050 2053 4
> umount /dev/mapper/sane_dev
> dmsetup remove sane_dev
> start_sector=$((204800-2053-1))
> echo $'0 2053 linear /dev/loop0 0\n2053 1 error\n2054 '"${start_sector} linear /dev/loop0 2054" |
> dmsetup create error_dev
> mount -t ext2 /dev/mapper/error_dev /some/where
> cat /some/where/unreadable_file # 3rd sector of file is unreadable
cat: /some/where/unreadable_file: Input/output error
Я должен признать, что немного смущен, потому что мне не удалось считать единственные секторы из того файла без ошибки (с dd .. seek=...
). Возможно, это - считанная вперед проблема.
] В разделе Переполнение стека и Ошибка сервера уже есть отличный набор ответов на этот вопрос, но некоторые приемы отсутствовали. Чтобы сделать жизнь проще, вот список VM/Linux блочных устройств/Linux файловой системы/Linux библиотеки пользовательского пространства I/O механизмы инжекции ошибок: [
] []-макет[
] на странице man mdadm[] для настройки (биты пользовательского пространства ядра и mdadm).[]LD_PRELOAD[
])). []FAIL_MAKE_REQUEST=y[
]).[]BLK_DEV_NULL_BLK_FAULT_INJECTION=y[
]). []delay[
][] или [][]error[
][] , а затем подключите к нему блочное устройство через []nbd-клиент[
] (kernel + биты пользовательского пространства NBD, kernel >= 4.18, собранное с поддержкой NBD, nbdclient >= 3. 18 и nbdkit >= рекомендуется 1.8.1 - см. []Демонстрационное видео NBDKit[] около 20-минутной отметки).[]Бонусный факт: []SQLite имеет драйвер VFS для моделирования ошибок[], чтобы получить хорошее тестовое покрытие.[
] []Похожее:[
] []
dmsetup table test
. Можно даже записатьfoo bar
позадиerror
; это просто не заботится (и таким образом должен быть удален). – Hauke Laging 29.05.2013, 16:48