diff options
Diffstat (limited to 'tests')
-rw-r--r-- | tests/bitrot/br-stub.c | 47 | ||||
-rw-r--r-- | tests/bitrot/bug-1221914.t | 48 |
2 files changed, 80 insertions, 15 deletions
diff --git a/tests/bitrot/br-stub.c b/tests/bitrot/br-stub.c index e164170bb83..5b862832e77 100644 --- a/tests/bitrot/br-stub.c +++ b/tests/bitrot/br-stub.c @@ -9,6 +9,7 @@ #include <stdint.h> #include <sys/types.h> #include <sys/xattr.h> +#include <errno.h> #include "bit-rot-object-version.h" @@ -24,23 +25,26 @@ brstub_validate_version (char *bpath, unsigned long version) xsize = sizeof (br_version_t); xv = calloc (1, xsize); - if (!xv) + if (!xv) { + match = -1; goto err; + } ret = getxattr (bpath, "trusted.bit-rot.version", xv, xsize); - if (ret < 0) + if (ret < 0) { + if (errno == ENODATA) + match = -2; goto err; + } if (xv->ongoingversion != version) { - match = -1; + match = -3; fprintf (stderr, "ongoingversion: %lu\n", xv->ongoingversion); } free (xv); - return match; - err: - return -1; + return match; } int @@ -58,8 +62,9 @@ brstub_write_validation (char *filp, char *bpath, unsigned long startversion) close (fd1); ret = brstub_validate_version (bpath, startversion); - if (ret == 0) + if (ret != -2) goto err; + /* single open (write/) check */ fd1 = open (filp, O_RDWR); if (fd1 < 0) @@ -76,19 +81,26 @@ brstub_write_validation (char *filp, char *bpath, unsigned long startversion) * versioning as it would have not reached the bit-rot-stub. */ fsync (fd1); - startversion++; ret = brstub_validate_version (bpath, startversion); - if (ret < 0) + if (ret != 0) goto err; ret = write (fd1, string, strlen (string)); if (ret <= 0) goto err; + fsync (fd1); /* let it reach the disk */ ret = brstub_validate_version (bpath, startversion); - if (ret < 0) + if (ret != 0) goto err; close (fd1); + + /** + * Well, this is not a _real_ test per se . For this test to pass + * the inode should not get a forget() in the interim. Therefore, + * perform this test asap. + */ + /* multi open (write/) check */ fd1 = open (filp, O_RDWR); if (fd1 < 0) @@ -101,9 +113,14 @@ brstub_write_validation (char *filp, char *bpath, unsigned long startversion) if (ret <= 0) goto err; - ret = write (fd1, string, strlen (string)); + ret = write (fd2, string, strlen (string)); if (ret <= 0) goto err; + + /* probably do a syncfs() */ + fsync (fd1); + fsync (fd2); + close (fd1); close (fd2); @@ -111,7 +128,7 @@ brstub_write_validation (char *filp, char *bpath, unsigned long startversion) * incremented once per write()/write().../close()/close() sequence */ ret = brstub_validate_version (bpath, startversion); - if (ret < 0) + if (ret != 0) goto err; return 0; @@ -134,12 +151,12 @@ brstub_new_object_validate (char *filp, char *brick) (void) snprintf (bpath, PATH_MAX, "%s/%s", brick, fname); printf ("Validating initial version..\n"); - ret = brstub_validate_version (bpath, 1); - if (ret == 0) + ret = brstub_validate_version (bpath, 2); + if (ret != -2) /* version _should_ be missing */ goto err; printf ("Validating version on modifications..\n"); - ret = brstub_write_validation (filp, bpath, 1); + ret = brstub_write_validation (filp, bpath, 2); if (ret < 0) goto err; diff --git a/tests/bitrot/bug-1221914.t b/tests/bitrot/bug-1221914.t new file mode 100644 index 00000000000..85715e5a83c --- /dev/null +++ b/tests/bitrot/bug-1221914.t @@ -0,0 +1,48 @@ +#!/bin/bash + +. $(dirname $0)/../include.rc +. $(dirname $0)/../volume.rc +. $(dirname $0)/../nfs.rc + +STUB_SOURCE=$(dirname $0)/br-stub.c +STUB_EXEC=$(dirname $0)/br-stub + +cleanup; + +TEST glusterd +TEST pidof glusterd + +## Create a distribute volume (B=2) +TEST $CLI volume create $V0 $H0:$B0/${V0}1 $H0:$B0/${V0}2; +EXPECT "$V0" volinfo_field $V0 'Volume Name'; +EXPECT 'Created' volinfo_field $V0 'Status'; +EXPECT '2' brick_count $V0 + +## Turn off write-behind (write-behind clubs writes together) +TEST $CLI volume set $V0 performance.write-behind off + +## Start the volume +TEST $CLI volume start $V0; +EXPECT 'Started' volinfo_field $V0 'Status'; + +## Mount the volume +TEST $GFS --volfile-server=$H0 --volfile-id=$V0 $M0; + +## Build stub C source +build_tester $STUB_SOURCE -o $STUB_EXEC -I$(dirname $0)/../../xlators/features/bit-rot/src/stub +TEST [ -e $STUB_EXEC ] + +## create & check version +fname="$M0/filezero" +$PYTHON -c "import os,stat; os.mknod('${fname}', stat.S_IFREG | stat.S_IRUSR | stat.S_IWUSR | stat.S_IROTH | stat.S_IRGRP)" + +backpath=$(get_backend_paths $fname) + +TEST $STUB_EXEC $fname $(dirname $backpath) + +rm -f $fname; + +##cleanups.. +rm -f $STUB_EXEC + +cleanup; |