Skip to content

Commit

Permalink
Limit gmirror failpoint tests to the test worker
Browse files Browse the repository at this point in the history
This avoids injecting errors into the test system's mirrors.

gnop seems like a good solution here but it injects errors at the wrong
place vs where these tests expect and does not support a 'max global count'
like the failpoints do with 'n*' syntax.

Reviewed by:	cem, vangyzen
Sponsored by:	Dell EMC Isilon
  • Loading branch information
bdrewery committed Jul 23, 2020
1 parent 98b765e commit 3cee7cb
Show file tree
Hide file tree
Showing 7 changed files with 12 additions and 7 deletions.
2 changes: 1 addition & 1 deletion tests/sys/geom/class/mirror/10_test.sh
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ tmp2=$(mktemp $base.XXXXXX)

EIO=5
# gmirror should retry a failed read from the other mirror.
sysctl ${regreadfp}="1*return(${EIO})"
sysctl ${regreadfp}="1*return(${EIO})[pid $(gmirror_worker_pid)]"
dd if=/dev/mirror/$name of=$tmp1 iseek=256 bs=$ddbs count=1 >/dev/null 2>&1
dd if=/dev/$us1 of=$tmp2 iseek=256 bs=$ddbs count=1 >/dev/null 2>&1
sysctl ${regreadfp}='off'
Expand Down
2 changes: 1 addition & 1 deletion tests/sys/geom/class/mirror/11_test.sh
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ tmp2=$(mktemp $base.XXXXXX)
ENXIO=6
# gmirror has special handling for ENXIO. It does not mark the failed component
# as broken, allowing it to rejoin the mirror automatically when it appears.
sysctl ${regreadfp}="1*return(${ENXIO})"
sysctl ${regreadfp}="1*return(${ENXIO})[pid $(gmirror_worker_pid)]"
dd if=/dev/mirror/$name of=$tmp1 iseek=512 bs=$ddbs count=1 >/dev/null 2>&1
dd if=/dev/$us1 of=$tmp2 iseek=512 bs=$ddbs count=1 >/dev/null 2>&1
sysctl ${regreadfp}='off'
Expand Down
2 changes: 1 addition & 1 deletion tests/sys/geom/class/mirror/12_test.sh
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ dd if=/dev/random of=$tmp1 bs=$ddbs count=1 >/dev/null 2>&1

EIO=5
# gmirror should kick one of the mirrors out after hitting EIO.
sysctl ${regwritefp}="1*return(${EIO})"
sysctl ${regwritefp}="1*return(${EIO})[pid $(gmirror_worker_pid)]"
dd if=$tmp1 of=/dev/mirror/$name bs=$ddbs count=1 >/dev/null 2>&1
dd if=/dev/mirror/$name of=$tmp2 bs=$ddbs count=1 >/dev/null 2>&1
sysctl ${regwritefp}='off'
Expand Down
2 changes: 1 addition & 1 deletion tests/sys/geom/class/mirror/13_test.sh
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ dd if=/dev/random of=$tmp1 bs=$ddbs count=1 >/dev/null 2>&1
ENXIO=6
# gmirror has special handling for ENXIO. It does not mark the failed component
# as broken, allowing it to rejoin the mirror automatically when it appears.
sysctl ${regwritefp}="1*return(${ENXIO})"
sysctl ${regwritefp}="1*return(${ENXIO})[pid $(gmirror_worker_pid)]"
dd if=$tmp1 of=/dev/mirror/$name bs=$ddbs count=1 >/dev/null 2>&1
dd if=/dev/mirror/$name of=$tmp2 bs=$ddbs count=1 >/dev/null 2>&1
sysctl ${regwritefp}='off'
Expand Down
2 changes: 1 addition & 1 deletion tests/sys/geom/class/mirror/9_test.sh
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ devwait
# Break one of the mirrors by forcing a single metadata write error.
# When dd closes the mirror provider, gmirror will attempt to mark the mirrors
# clean, and will kick one of the mirrors out upon hitting the error.
sysctl debug.fail_point.g_mirror_metadata_write='1*return(5)' || exit 1
sysctl debug.fail_point.g_mirror_metadata_write="1*return(5)[pid $(gmirror_worker_pid)]" || exit 1
dd if=/dev/random of=/dev/mirror/$name bs=$ddbs count=1 >/dev/null 2>&1
sysctl debug.fail_point.g_mirror_metadata_write='off' || exit 1

Expand Down
5 changes: 5 additions & 0 deletions tests/sys/geom/class/mirror/conf.sh
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,11 @@ gmirror_test_cleanup()
}
trap gmirror_test_cleanup ABRT EXIT INT TERM

gmirror_worker_pid()
{
pgrep -S -n "g_mirror mirror\..*"
}

syncwait()
{
while $(gmirror status -s $name | grep -q SYNCHRONIZING); do
Expand Down
4 changes: 2 additions & 2 deletions tests/sys/geom/class/mirror/sync_error.sh
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ sync_read_error_2_disks_body()
atf_check gmirror label $name $md1
devwait

atf_check -s ignore -e empty -o not-empty sysctl ${REG_READ_FP}='1*return(5)'
atf_check -s ignore -e empty -o not-empty sysctl ${REG_READ_FP}="1*return(5)[pid $(gmirror_worker_pid)]"

# If a read error occurs while synchronizing and the mirror contains
# a single active disk, gmirror has no choice but to fail the
Expand Down Expand Up @@ -75,7 +75,7 @@ sync_read_error_3_disks_body()
atf_check gmirror insert $name $md2
syncwait

atf_check -s exit:0 -e empty -o not-empty sysctl ${REG_READ_FP}='1*return(5)'
atf_check -s exit:0 -e empty -o not-empty sysctl ${REG_READ_FP}="1*return(5)[pid $(gmirror_worker_pid)]"

# If a read error occurs while synchronizing a new disk, and we have
# multiple active disks, we retry the read after an error. The disk
Expand Down

0 comments on commit 3cee7cb

Please sign in to comment.