init
This commit is contained in:
commit
9af0fb7c34
|
|
@ -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
|
||||
|
||||
|
|
@ -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
|
||||
}
|
||||
|
||||
|
|
@ -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
|
||||
}
|
||||
|
||||
|
|
@ -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 &
|
||||
|
||||
Loading…
Reference in New Issue