mdadm/tests/19raid6repair
Robert Buchholz f2e29ad691 Repair mode for raid6
In repair mode, raid6check will rewrite one single stripe
by regenerating the data (or parity) of two raid devices that
are specified via the command line.
If you need to rewrite just one slot, pick any other slot
at random.

Note that the repair option will change data on the disks
directly, so both the md layer above as well as any layers
above md (such as filesystems) may be accessing the stripe
data from cached buffers. Either instruct the kernels
to drop the caches or reassemble the raid after repair.

Signed-off-by: NeilBrown <neilb@suse.de>
2012-07-09 17:22:45 +10:00

48 lines
1.9 KiB
Plaintext

number_of_disks=4
chunksize_in_kib=512
chunksize_in_b=$[chunksize_in_kib*1024]
array_data_size_in_kib=$[chunksize_in_kib*(number_of_disks-2)*number_of_disks]
array_data_size_in_b=$[array_data_size_in_kib*1024]
devs="$dev1 $dev2 $dev3 $dev4"
# default 32 sectors
data_offset_in_kib=$[32/2]
for failure in "$dev3 3 3 2" "$dev3 3 2 3" "$dev3 3 2 1" "$dev3 3 2 0" "$dev4 3 3 0" "$dev4 3 3 1" "$dev4 3 3 2" \
"$dev1 3 0 1" "$dev1 3 0 2" "$dev1 3 0 3" "$dev2 3 1 0" "$dev2 3 1 2" "$dev2 3 1 3" ; do
failure_split=( $failure )
device_with_error=${failure_split[0]}
stripe_with_error=${failure_split[1]}
repair_params="$stripe_with_error ${failure_split[2]} ${failure_split[3]}"
start_of_errors_in_kib=$[data_offset_in_kib+chunksize_in_kib*stripe_with_error]
# make a raid5 from a file
dd if=/dev/urandom of=/tmp/RandFile bs=1024 count=$array_data_size_in_kib
mdadm -CR $md0 -l6 -n$number_of_disks -c $chunksize_in_kib $devs
dd if=/tmp/RandFile of=$md0 bs=1024 count=$array_data_size_in_kib
blockdev --flushbufs $md0; sync
check wait
blockdev --flushbufs $devs; sync
echo 3 > /proc/sys/vm/drop_caches
cmp -s -n $array_data_size_in_b $md0 /tmp/RandFile || { echo sanity cmp failed ; exit 2; }
dd if=/dev/urandom of=$device_with_error bs=1024 count=$chunksize_in_kib seek=$start_of_errors_in_kib
blockdev --flushbufs $device_with_error; sync
echo 3 > /proc/sys/vm/drop_caches
$dir/raid6check $md0 0 0 2>&1 | grep -qs "Error" || { echo should detect errors; exit 2; }
$dir/raid6check $md0 repair $repair_params > /dev/null || { echo repair failed; exit 2; }
blockdev --flushbufs $md0 $devs; sync
echo 3 > /proc/sys/vm/drop_caches
$dir/raid6check $md0 0 0 2>&1 | grep -qs "Error" && { echo errors detected; exit 2; }
cmp -s -n $array_data_size_in_b $md0 /tmp/RandFile || { echo cmp failed ; exit 2; }
mdadm -S $md0
udevadm settle
blockdev --flushbufs $md0 $devs; sync
echo 3 > /proc/sys/vm/drop_caches
done