aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMariusz Zaborski <oshogbo@FreeBSD.org>2019-12-29 15:47:37 +0000
committerMariusz Zaborski <oshogbo@FreeBSD.org>2019-12-29 15:47:37 +0000
commit645532a4487a4a5a5d203ff393322380b6e614ef (patch)
tree1b524da72b0ec6f21993fb58a9ff239c0ba2f4c8
parentad382bd8eb4950033413f4c04f59dc085e043768 (diff)
downloadsrc-645532a4487a4a5a5d203ff393322380b6e614ef.tar.gz
src-645532a4487a4a5a5d203ff393322380b6e614ef.zip
gnop: change the "count until fail" option
Change the "count_until_fail" option of gnop, now it enables the failing rating instead of setting them to 100%. The original patch introduced the new flag, which sets the fail/rate to 100% after N requests. In some cases, we don't want to have 100% of failure probabilities. We want to start failing at some point. For example, on the early stage, we may like to allow some read/writes requests before having some requests delayed - when we try to mount the partition, or when we are trying to import the pool. Another case may be to check how scrub in ZFS will behave on different stages. This allows us to cover more cases. The previous behavior still may be configured. Reviewed by: kib Differential Revision: https://reviews.freebsd.org/D22632
Notes
Notes: svn path=/head/; revision=356176
-rw-r--r--lib/geom/nop/gnop.84
-rw-r--r--sys/geom/nop/g_nop.c27
2 files changed, 18 insertions, 13 deletions
diff --git a/lib/geom/nop/gnop.8 b/lib/geom/nop/gnop.8
index 21efb64a415e..67eef9e0a044 100644
--- a/lib/geom/nop/gnop.8
+++ b/lib/geom/nop/gnop.8
@@ -123,8 +123,8 @@ See
Additional options:
.Bl -tag -width "-c count_until_fail"
.It Fl c Ar count_until_fail
-Specifies the number of I/O requests to allow before setting the read and write
-failure probabilities to 100%.
+Specifies the number of I/O requests to allow before setting the read, write and
+delay failure probabilities.
.It Fl d Ar delaymsec
Specifies the delay of the requests in milliseconds.
Note that requests will be delayed before they are sent to the backing device.
diff --git a/sys/geom/nop/g_nop.c b/sys/geom/nop/g_nop.c
index 84c8849d1fc7..c2e529cf03c1 100644
--- a/sys/geom/nop/g_nop.c
+++ b/sys/geom/nop/g_nop.c
@@ -204,31 +204,35 @@ g_nop_start(struct bio *bp)
struct bio *cbp;
u_int failprob, delayprob, delaytime;
- failprob = delayprob = 0;
+ failprob = delayprob = delaytime = 0;
gp = bp->bio_to->geom;
sc = gp->softc;
G_NOP_LOGREQ(bp, "Request received.");
mtx_lock(&sc->sc_lock);
- if (sc->sc_count_until_fail != 0 && --sc->sc_count_until_fail == 0) {
- sc->sc_rfailprob = 100;
- sc->sc_wfailprob = 100;
- }
switch (bp->bio_cmd) {
case BIO_READ:
sc->sc_reads++;
sc->sc_readbytes += bp->bio_length;
- failprob = sc->sc_rfailprob;
- delayprob = sc->sc_rdelayprob;
- delaytime = sc->sc_delaymsec;
+ if (sc->sc_count_until_fail != 0) {
+ sc->sc_count_until_fail -= 1;
+ } else {
+ failprob = sc->sc_rfailprob;
+ delayprob = sc->sc_rdelayprob;
+ delaytime = sc->sc_delaymsec;
+ }
break;
case BIO_WRITE:
sc->sc_writes++;
sc->sc_wrotebytes += bp->bio_length;
- failprob = sc->sc_wfailprob;
- delayprob = sc->sc_wdelayprob;
- delaytime = sc->sc_delaymsec;
+ if (sc->sc_count_until_fail != 0) {
+ sc->sc_count_until_fail -= 1;
+ } else {
+ failprob = sc->sc_wfailprob;
+ delayprob = sc->sc_wdelayprob;
+ delaytime = sc->sc_delaymsec;
+ }
break;
case BIO_DELETE:
sc->sc_deletes++;
@@ -262,6 +266,7 @@ g_nop_start(struct bio *bp)
break;
}
mtx_unlock(&sc->sc_lock);
+
if (failprob > 0) {
u_int rval;