This commit is contained in:
Wenchao Hao 2023-09-14 09:55:23 +08:00
commit 9af0fb7c34
4 changed files with 508 additions and 0 deletions

10
clear.sh Normal file
View File

@ -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

381
error_inject.sh Normal file
View File

@ -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
}

94
loop.sh Normal file
View File

@ -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
}

23
test.sh Normal file
View File

@ -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 &