commit 9af0fb7c3431a252ba0abc243427b312ffa78ba4 Author: Wenchao Hao Date: Thu Sep 14 09:55:23 2023 +0800 init diff --git a/clear.sh b/clear.sh new file mode 100644 index 0000000..59fbf51 --- /dev/null +++ b/clear.sh @@ -0,0 +1,10 @@ +#!/bin/sh + +source ./error_inject.sh + +for dev in `lsscsi | grep scsi_debug | awk '{print $6}'` +do + echo clear error $(basename $dev) + clear_error $(basename $dev) +done + diff --git a/error_inject.sh b/error_inject.sh new file mode 100644 index 0000000..38bff8f --- /dev/null +++ b/error_inject.sh @@ -0,0 +1,381 @@ +function clear_error() +{ + local str=$(lsscsi | grep scsi_debug | grep $1 | awk '{print $1}') + local scsi_id=${str#*\[} + local scsi_id=${scsi_id%\]*} + local error=/sys/kernel/debug/scsi_debug/$scsi_id/error + local target_id=${scsi_id%\:*} + + tmpfile=$$_clear + cat $error + cat $error | grep -v Type | awk '{print $1,$3}' > $tmpfile + while read -r line; do echo "- $line" > $error; done < $tmpfile + rm -rf $tmpfile + + echo 0 > /sys/kernel/debug/scsi_debug/target$target_id/fail_reset +} + +function disk_id() +{ + local str=$(lsscsi | grep scsi_debug | grep $1 | awk '{print $1}') + local scsi_id=${str#*\[} + local scsi_id=${scsi_id%\]*} + echo $error +} + +function disk_target_id() +{ + local str=$(lsscsi | grep scsi_debug | grep $1 | awk '{print $1}') + local scsi_id=${str#*\[} + local scsi_id=${scsi_id%\]*} + local target_id=${scsi_id%\:*} + + echo $target_id +} + +function disk_error() +{ + local str=$(lsscsi | grep scsi_debug | grep $1 | awk '{print $1}') + local scsi_id=${str#*\[} + local scsi_id=${scsi_id%\]*} + local error=/sys/kernel/debug/scsi_debug/$scsi_id/error + + echo $error +} + +# time out and abort failed command +# would trigger error recovery from timeout +# $1: diskname +# $2: command name +# $3: rule time +function inject_TIMEOUT_ABORT() +{ + error=$(disk_error $1) + echo "0 $3 $2" > ${error} + echo "3 $3 $2" > ${error} +} + +# finish command with DID_TIME_OUT +# would trigger error recovery when command finihed in scsi_decide_position +# $1: diskname +# $2: command name +# $3: rule time +function inject_DID_TIME_OUT() +{ + error=$(disk_error $1) + echo "2 $3 $2 0x3 0 0 0 0 0" > ${error} +} + +# finish command with LUN NOT READY, INITIALIZING COMMAND REQUIRED +# would trigger error recovery when command finihed in scsi_check_sense +# status: 0x2 +# sense_key: 0x6 +# asc: 0x4 +# ascq: 0x2 +# $1: diskname +# $2: command name +# $3: rule time +function inject_LUN_NOT_READY() +{ + error=$(disk_error $1) + echo "2 $3 $2 0 0 0x2 0x6 0x4 0x2" > ${error} +} + +# finish command with Medium Error +# would not trigger error recovery but EIO is triggered +# $1: diskname +# $2: command name +# $3: rule time +function inject_MEDIUM_ERROR() +{ + error=$(disk_error $1) + echo "2 $3 $2 0 0 0x2 0x3 0x11 0x0" > ${error} +} + +# device reset failed for 10 time +# $1: disk name to inject, for example sda +function recovery_inject1() +{ + error=$(disk_error $1) + echo "4 -10 0xff" > ${error} +} + +# target failed for 10 time +# $1: disk name to inject, for example sda +function recovery_inject2() +{ + target_id=$(disk_target_id $1) + + echo 1 > /sys/kernel/debug/scsi_debug/target$target_id/fail_reset +} + +function recovery_inject3() +{ + inject_DID_TIME_OUT $1 0x12 -10 +} + +function recovery_inject4() +{ + inject_LUN_NOT_READY $1 0x12 -10 +} + +function recovery_inject5() +{ + inject_TIMEOUT_ABORT $1 0x12 -10 +} + +function recovery_inject6() +{ + inject_DID_TIME_OUT $1 0x1b -10 +} + +function recovery_inject7() +{ + inject_LUN_NOT_READY $1 0x1b -10 +} + +function recovery_inject8() +{ + inject_TIMEOUT_ABORT $1 0x1b -10 +} + +function error_inject1() +{ + inject_TIMEOUT_ABORT $1 0x28 -10 +} + +function error_inject2() +{ + inject_TIMEOUT_ABORT $1 0xa8 -10 +} + +function error_inject3() +{ + inject_TIMEOUT_ABORT $1 0x88 -10 +} + +function error_inject4() +{ + inject_TIMEOUT_ABORT $1 0x2a -10 +} + +function error_inject5() +{ + inject_TIMEOUT_ABORT $1 0xaa -10 +} + +function error_inject6() +{ + inject_TIMEOUT_ABORT $1 0x8a -10 +} + +function error_inject7() +{ + inject_TIMEOUT_ABORT $1 0x28 1 +} + +function error_inject8() +{ + inject_TIMEOUT_ABORT $1 0xa8 1 +} + +function error_inject9() +{ + inject_TIMEOUT_ABORT $1 0x88 1 +} + +function error_inject10() +{ + inject_TIMEOUT_ABORT $1 0x2a 1 +} + +function error_inject11() +{ + inject_TIMEOUT_ABORT $1 0xaa 1 +} + +function error_inject12() +{ + inject_TIMEOUT_ABORT $1 0x8a 1 +} + +function error_inject13() +{ + inject_DID_TIME_OUT $1 0x28 -10 +} + +function error_inject14() +{ + inject_DID_TIME_OUT $1 0xa8 -10 +} + +function error_inject15() +{ + inject_DID_TIME_OUT $1 0x88 -10 +} + +function error_inject16() +{ + inject_DID_TIME_OUT $1 0x2a -10 +} + +function error_inject17() +{ + inject_DID_TIME_OUT $1 0xaa -10 +} + +function error_inject18() +{ + inject_DID_TIME_OUT $1 0x8a -10 +} + +function error_inject19() +{ + inject_DID_TIME_OUT $1 0x28 1 +} + +function error_inject20() +{ + inject_DID_TIME_OUT $1 0xa8 1 +} + +function error_inject21() +{ + inject_DID_TIME_OUT $1 0x88 1 +} + +function error_inject22() +{ + inject_DID_TIME_OUT $1 0x2a 1 +} + +function error_inject23() +{ + inject_DID_TIME_OUT $1 0xaa 1 +} + +function error_inject24() +{ + inject_DID_TIME_OUT $1 0x8a 1 +} + +function error_inject25() +{ + inject_LUN_NOT_READY $1 0x28 -10 +} + +function error_inject26() +{ + inject_LUN_NOT_READY $1 0xa8 -10 +} + +function error_inject27() +{ + inject_LUN_NOT_READY $1 0x88 -10 +} + +function error_inject28() +{ + inject_LUN_NOT_READY $1 0x2a -10 +} + +function error_inject29() +{ + inject_LUN_NOT_READY $1 0xaa -10 +} + +function error_inject30() +{ + inject_LUN_NOT_READY $1 0x8a -10 +} + +function error_inject31() +{ + inject_LUN_NOT_READY $1 0x28 1 +} + +function error_inject32() +{ + inject_LUN_NOT_READY $1 0xa8 1 +} + +function error_inject33() +{ + inject_LUN_NOT_READY $1 0x88 1 +} + +function error_inject34() +{ + inject_LUN_NOT_READY $1 0x2a 1 +} + +function error_inject35() +{ + inject_LUN_NOT_READY $1 0xaa 1 +} + +function error_inject36() +{ + inject_LUN_NOT_READY $1 0x8a 1 +} + +function error_inject37() +{ + inject_MEDIUM_ERROR $1 0x28 -10 +} + +function error_inject38() +{ + inject_MEDIUM_ERROR $1 0xa8 -10 +} + +function error_inject39() +{ + inject_MEDIUM_ERROR $1 0x88 -10 +} + +function error_inject40() +{ + inject_MEDIUM_ERROR $1 0x2a -10 +} + +function error_inject41() +{ + inject_MEDIUM_ERROR $1 0xaa -10 +} + +function error_inject42() +{ + inject_MEDIUM_ERROR $1 0x8a -10 +} + +function error_inject43() +{ + inject_MEDIUM_ERROR $1 0x28 1 +} + +function error_inject44() +{ + inject_MEDIUM_ERROR $1 0xa8 1 +} + +function error_inject45() +{ + inject_MEDIUM_ERROR $1 0x88 1 +} + +function error_inject46() +{ + inject_MEDIUM_ERROR $1 0x2a 1 +} + +function error_inject47() +{ + inject_MEDIUM_ERROR $1 0xaa 1 +} + +function error_inject48() +{ + inject_MEDIUM_ERROR $1 0x8a 1 +} + diff --git a/loop.sh b/loop.sh new file mode 100644 index 0000000..62621b8 --- /dev/null +++ b/loop.sh @@ -0,0 +1,94 @@ +#!/bin/sh + +source ./error_inject.sh + +function add_fio() +{ + while : + do + fio_cnt=$(ps aux | grep fio -c) + if [ $fio_cnt -gt 50 ]; then + echo "$fio_cnt larger than 50, do not add" + continue + fi + for dev in `lsscsi | grep scsi_debug | awk '{print $6}'` + do + inject=$[RANDOM%3] + if [ $inject -eq 0 ]; then + disk=$(basename $dev) + threads=$[RANDOM%31+1] + echo "add $threads fio for $disk" + fio -filename=/dev/$disk -name=rand_write -rw=randrw -bs=4k -direct=1 -size=1G -numjobs=$threads -runtime=240 -group_reporting 2>&1 > /dev/null & + fi + done + + sleep 10 + done +} + +function add_error() +{ + while : + do + for dev in `lsscsi | grep scsi_debug | awk '{print $6}'` + do + inject=$[RANDOM%3] + if [ $inject -eq 0 ]; then + errtype=$[RANDOM%35+1] + echo add error to $(basename $dev) + error_inject$errtype $(basename $dev) + fi + done + + sleep 3 + done +} + +function add_recovery_error() +{ + while : + do + for dev in `lsscsi | grep scsi_debug | awk '{print $6}'` + do + inject=$[RANDOM%3] + if [ $inject -eq 0 ]; then + recovtype=$[RANDOM%7+1] + echo add recovery error to $(basename $dev) + recovery_inject$recovtype $(basename $dev) + fi + done + + sleep 3 + done +} + +function clear_error() +{ + while : + do + for dev in `lsscsi | grep scsi_debug | awk '{print $6}'` + do + inject=$[RANDOM%3] + if [ $inject -eq 0 ]; then + echo clear error $(basename $dev) + clear_error $(basename $dev) + fi + done + + sleep 100 + done +} + +function set_running() +{ + while : + do + for dev in `lsscsi | grep scsi_debug | awk '{print $6}'` + do + echo "running" > /sys/block/$(basename $dev)/device/state + done + + sleep 1 + done +} + diff --git a/test.sh b/test.sh new file mode 100644 index 0000000..22c5000 --- /dev/null +++ b/test.sh @@ -0,0 +1,23 @@ +#!/bin/sh + +source ./loop.sh + +insmod /mnt/mainline/drivers/scsi/scsi_debug.ko add_host=1 num_tgts=2 max_luns=4 per_host_store=1 dev_size_mb=1024 lun_eh=0 lun_eh_fallback=0 target_eh=1 target_eh_fallback=0 +#insmod /mnt/mainline/drivers/scsi/scsi_debug.ko add_host=1 num_tgts=2 max_luns=4 per_host_store=1 dev_size_mb=1024 lun_eh=1 lun_eh_fallback=0 + +scsi_logging_level -s --error 3 > /dev/null 2>&1 + +for dev in `lsscsi | grep scsi_debug | awk '{print $6}'` +do + disk=$(basename $dev) + echo none > /sys/block/$disk/queue/scheduler + echo 1 > /sys/block/$disk/device/timeout + echo 1 > /sys/block/$disk/device/eh_timeout +done + +add_fio & +add_error & +set_running & +clear_error & +add_recovery_error & +