| # Test suggested by Albert Pauw: Create, fail one disk, have mdmon |
| # activate the spare, |
| # then run create again. Shouldn't use the failed disk for Create, |
| . tests/env-ddf-template |
| |
| tmp=$(mktemp /tmp/mdtest-XXXXXX) |
| rm -f $tmp |
| |
| mdadm --zero-superblock $dev8 $dev9 $dev10 $dev11 $dev12 $dev13 |
| mdadm -CR $container -e ddf -l container -n 5 $dev8 $dev9 $dev10 $dev11 $dev12 |
| |
| mdadm -CR $member0 -l raid1 -n 2 $container |
| #$dir/mdadm -CR $member0 -l raid1 -n 2 $container >/tmp/mdmon.txt 2>&1 |
| |
| check wait |
| |
| set -- $(get_raiddisks $member0) |
| fail0=$1 |
| mdadm --fail $member0 $fail0 |
| |
| # To make sure the spare is activated, we may have to sleep |
| # 2s has always been enough for me |
| sleep 2 |
| check wait |
| |
| # This test can succeed both ways - if spare was activated |
| # before new array was created, we see only member 0. |
| # otherwise, we see both, adn member0 is degraded because the |
| # new array grabbed the spare |
| # which case occurs depends on the sleep time above. |
| ret=0 |
| if mdadm -CR $member1 -l raid5 -n 3 $container; then |
| # Creation successful - must have been quicker than spare activation |
| |
| check wait |
| set -- $(get_raiddisks $member1) |
| if [ $1 = $fail0 -o $2 = $fail0 -o $3 = $fail0 ]; then |
| echo ERROR: $member1 must not contain $fail0: $@ |
| ret=1 |
| fi |
| d1=$1 |
| mdadm -E $d1 >$tmp |
| if ! grep -q 'state\[1\] : Optimal, Consistent' $tmp; then |
| echo ERROR: member 1 should be optimal in meta data |
| ret=1 |
| fi |
| state0=Degraded |
| else |
| # Creation unsuccessful - spare was used for member 0 |
| state0=Optimal |
| fi |
| |
| # need to delay a little bit, sometimes the meta data aren't |
| # up-to-date yet |
| sleep 0.5 |
| set -- $(get_raiddisks $member0) |
| if [ $1 = $fail0 -o $2 = $fail0 ]; then |
| echo ERROR: $member0 must not contain $fail0: $@ |
| ret=1 |
| fi |
| d0=$1 |
| |
| [ -f $tmp ] || mdadm -E $d0 >$tmp |
| |
| if ! grep -q 'state\[0\] : '$state0', Consistent' $tmp; then |
| echo ERROR: member 0 should be $state0 in meta data |
| ret=1 |
| fi |
| if ! grep -q 'Offline, Failed' $tmp; then |
| echo ERROR: Failed disk expected in meta data |
| ret=1 |
| fi |
| if [ $ret -eq 1 ]; then |
| cat /proc/mdstat |
| mdadm -E $d0 |
| mdadm -E $d1 |
| mdadm -E $fail0 |
| fi |
| |
| [ -f /tmp/mdmon.txt ] && { |
| cat /tmp/mdmon.txt |
| rm -f /tmp/mdmon.txt |
| } |
| |
| rm -f $tmp |
| [ $ret -eq 0 ] |