summaryrefslogtreecommitdiffstats
path: root/tests/bitrot
diff options
context:
space:
mode:
Diffstat (limited to 'tests/bitrot')
-rw-r--r--tests/bitrot/br-stub.c47
-rw-r--r--tests/bitrot/bug-1221914.t48
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;