1*612d42e5SPeter Holm#!/bin/sh 2*612d42e5SPeter Holm 3*612d42e5SPeter Holm# g_mirror: don't fail reads while losing next-to-last disk 4*612d42e5SPeter Holm 5*612d42e5SPeter Holm# Fixed by https://cgit.FreeBSD.org/src/commit/?id=5d5f44623eb3d121d528060d131ee5d6bcd63489 6*612d42e5SPeter Holm# Test scenario by: Andriy Gapon <avg@FreeBSD.org> 7*612d42e5SPeter Holm 8*612d42e5SPeter Holmset -u 9*612d42e5SPeter Holm 10*612d42e5SPeter Holmcleanup() 11*612d42e5SPeter Holm{ 12*612d42e5SPeter Holm echo "cleanup" 2>&1 13*612d42e5SPeter Holm gnop destroy -f ${dev1}.nop 14*612d42e5SPeter Holm gnop destroy -f ${dev2}.nop 15*612d42e5SPeter Holm gmirror destroy testmirror 16*612d42e5SPeter Holm mdconfig -d -u ${dev2#md} 17*612d42e5SPeter Holm mdconfig -d -u ${dev1#md} 18*612d42e5SPeter Holm} 19*612d42e5SPeter Holm 20*612d42e5SPeter Holmlist_descendants() 21*612d42e5SPeter Holm{ 22*612d42e5SPeter Holm local children 23*612d42e5SPeter Holm 24*612d42e5SPeter Holm children=$(pgrep -P "$1") 25*612d42e5SPeter Holm for pid in $children ; do 26*612d42e5SPeter Holm list_descendants "$pid" 27*612d42e5SPeter Holm done 28*612d42e5SPeter Holm echo "$children" 29*612d42e5SPeter Holm} 30*612d42e5SPeter Holm 31*612d42e5SPeter Holm# Note that the size of gnop providers is smaller than the 32*612d42e5SPeter Holm# size of backing md-s to avoid gmirror auto-tasting. 33*612d42e5SPeter Holmfor i in 1 2; do 34*612d42e5SPeter Holm eval dev$i=$(mdconfig -a -t swap -s 1024m) 35*612d42e5SPeter Holm eval gnop create -d 8 -s 1000m \${dev$i} 36*612d42e5SPeter Holmdone 37*612d42e5SPeter Holm 38*612d42e5SPeter Holmtrap cleanup EXIT INT TERM QUIT 39*612d42e5SPeter Holm 40*612d42e5SPeter Holmgmirror load 2>/dev/null || true 41*612d42e5SPeter Holmgmirror label -b round-robin -F testmirror ${dev1}.nop ${dev2}.nop 42*612d42e5SPeter Holm 43*612d42e5SPeter Holm( 44*612d42e5SPeter Holm #my_pid=$(exec sh -c 'echo "$PPID"') 45*612d42e5SPeter Holm 46*612d42e5SPeter Holm sleep 100000 & 47*612d42e5SPeter Holm sentry=$! 48*612d42e5SPeter Holm 49*612d42e5SPeter Holm children="" 50*612d42e5SPeter Holm for i in $(seq 8) ; do 51*612d42e5SPeter Holm ( 52*612d42e5SPeter Holm while dd if=/dev/mirror/testmirror of=/dev/null > /dev/null ; ds=$? ; [ $ds -eq 0 ] ; do 53*612d42e5SPeter Holm : 54*612d42e5SPeter Holm done 55*612d42e5SPeter Holm if [ $ds -lt 128 ] ; then 56*612d42e5SPeter Holm # Not killed 57*612d42e5SPeter Holm echo "dd exited with $ds" 1>&2 58*612d42e5SPeter Holm kill $sentry 2>/dev/null 59*612d42e5SPeter Holm fi 60*612d42e5SPeter Holm ) & 61*612d42e5SPeter Holm 62*612d42e5SPeter Holm children="${children:+${children},}$!" 63*612d42e5SPeter Holm 64*612d42e5SPeter Holm sleep 0.1 65*612d42e5SPeter Holm done 66*612d42e5SPeter Holm 67*612d42e5SPeter Holm wait $sentry 68*612d42e5SPeter Holm pkill -P ${children} -x dd 69*612d42e5SPeter Holm 70*612d42e5SPeter Holm # Reap background children 71*612d42e5SPeter Holm wait 72*612d42e5SPeter Holm) & 73*612d42e5SPeter Holmrunner=$! 74*612d42e5SPeter Holm 75*612d42e5SPeter Holm# Give dd-s some time to get running 76*612d42e5SPeter Holmsleep 2 77*612d42e5SPeter Holm 78*612d42e5SPeter Holm# Destroy one of the members 79*612d42e5SPeter Holmecho "destroying one member" 1>&2 80*612d42e5SPeter Holmgnop destroy -f ${dev1}.nop 81*612d42e5SPeter Holm 82*612d42e5SPeter Holmcount=0 83*612d42e5SPeter Holmwhile kill -0 $runner 2>/dev/null && [ $count -lt 5 ] ; do 84*612d42e5SPeter Holm sleep 1 85*612d42e5SPeter Holm count=$((count + 1)) 86*612d42e5SPeter Holmdone 87*612d42e5SPeter Holm 88*612d42e5SPeter Holmif ! kill -0 $runner 2>/dev/null ; then 89*612d42e5SPeter Holm echo "the test has self-terminated" 1>&2 90*612d42e5SPeter Holm ret=1 91*612d42e5SPeter Holmelse 92*612d42e5SPeter Holm echo "the test is stuck, killing..." 1>&2 93*612d42e5SPeter Holm ret=0 94*612d42e5SPeter Holm kill $(list_descendants $runner) 2>/dev/null 95*612d42e5SPeter Holmfi 96*612d42e5SPeter Holm 97*612d42e5SPeter Holm# Reap background processes 98*612d42e5SPeter Holmwait 99*612d42e5SPeter Holm 100*612d42e5SPeter Holm# Just in case 101*612d42e5SPeter Holmsleep 5 102*612d42e5SPeter Holm 103*612d42e5SPeter Holmexit $ret 104