summaryrefslogtreecommitdiff
path: root/tests/10ddf-fail-create-race
blob: bd5dfb5125abf25e3a149e78d2d5669263fdbff7 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
# This test creates a RAID1, fails a disk, and immediately
# (simultaneously) creates a new array. This tests for a possible
# race where the meta data reflecting the disk failure may not
# be written when the 2nd array is created.
. tests/env-ddf-template

mdadm --zero-superblock $dev8 $dev9 $dev10 $dev11 $dev12 $dev13

mdadm -CR $container -e ddf -l container -n 2 $dev11 $dev12
#$dir/mdadm -CR $member0 -l raid1 -n 2 $container -z 10000  >/tmp/mdmon.txt 2>&1
mdadm -CR $member0 -l raid1 -n 2 $container -z 10000
check wait
fail0=$dev11
mdadm --fail $member0 $fail0 &

# The test can succeed two ways:
# 1) mdadm -C member1 fails - in this case the meta data
# was already on disk when the create attempt was made
# 2) mdadm -C succeeds in the first place (meta data not on disk yet),
# but mdmon detects the problem and sets the disk faulty.

if mdadm -CR $member1 -l raid1 -n 2 $container; then

   echo create should have failed / race condition?

   check wait
   set -- $(get_raiddisks $member0)
   d0=$1
   ret=0
   if [ $1 = $fail0 -o $2 = $fail0 ]; then
       ret=1
   else
       set -- $(get_raiddisks $member1)
       if [ $1 = $fail0 -o $2 = $fail0 ]; then
	   ret=1
       fi
   fi
   if [ $ret -eq 1 ]; then
       echo ERROR: failed disk $fail0 is still a RAID member
       echo $member0: $(get_raiddisks $member0)
       echo $member1: $(get_raiddisks $member1)
   fi
   tmp=$(mktemp /tmp/mdest-XXXXXX)
   mdadm -E $d0 >$tmp
   if [ x$(grep -c 'state\[[01]\] : Degraded' $tmp) != x2 ]; then
       echo ERROR: non-degraded array found
       mdadm -E $d0
       ret=1
   fi
   if ! grep -q '^  *0  *[0-9a-f]\{8\} .*Offline, Failed' $tmp; then
       echo ERROR: disk 0 not marked as failed in meta data
       mdadm -E $d0
       ret=1
   fi
   rm -f $tmp
else
   ret=0
fi

[ -f /tmp/mdmon.txt ] && {
    cat /tmp/mdmon.txt
    rm -f /tmp/mdmon.txt
}

[ $ret -eq 0 ]