diff options
Diffstat (limited to 'tests')
-rw-r--r-- | tests/bitrot/br-stub.c | 147 | ||||
-rw-r--r-- | tests/bitrot/br-stub.t | 44 |
2 files changed, 191 insertions, 0 deletions
diff --git a/tests/bitrot/br-stub.c b/tests/bitrot/br-stub.c new file mode 100644 index 00000000000..81481f86905 --- /dev/null +++ b/tests/bitrot/br-stub.c @@ -0,0 +1,147 @@ +#define _GNU_SOURCE + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <limits.h> +#include <unistd.h> +#include <fcntl.h> +#include <stdint.h> +#include <sys/types.h> +#include <sys/xattr.h> + +#include "bit-rot-object-version.h" + +/* NOTE: no size discovery */ +int +brstub_validate_version (char *bpath, unsigned long version) +{ + int ret = 0; + int match = 0; + size_t xsize = 0; + br_version_t *xv = NULL; + + xsize = sizeof (br_version_t); + + xv = calloc (1, xsize); + if (!xv) + goto err; + + ret = getxattr (bpath, "trusted.glusterfs.bit-rot.version", xv, xsize); + if (ret < 0) + goto err; + + if (xv->ongoingversion != version) + match = -1; + free (xv); + + return match; + + err: + return -1; +} + +int +brstub_open_validation (char *filp, char *bpath, unsigned long startversion) +{ + int fd1 = 0; + int fd2 = 0; + int ret = 0; + + /* read only check */ + fd1 = open (filp, O_RDONLY); + if (fd1 < 0) + goto err; + close (fd1); + + ret = brstub_validate_version (bpath, startversion); + if (ret < 0) + goto err; + + /* single open (write/) check */ + fd1 = open (filp, O_RDWR); + if (fd1 < 0) + goto err; + close (fd1); + + startversion++; + ret = brstub_validate_version (bpath, startversion); + + /* multi open (write/) check */ + fd1 = open (filp, O_RDWR); + if (fd1 < 0) + goto err; + fd2 = open (filp, O_WRONLY); + if (fd1 < 0) + goto err; + close (fd1); + close (fd2); + + /** + * incremented once per open()/open().../close()/close() sequence + */ + startversion++; + ret = brstub_validate_version (bpath, startversion); + if (ret < 0) + goto err; + + return 0; + + err: + return -1; +} + +int +brstub_new_object_validate (char *filp, char *brick) +{ + int ret = 0; + char *fname = NULL; + char bpath[PATH_MAX] = {0,}; + + fname = basename (filp); + if (!fname) + goto err; + + (void) snprintf (bpath, PATH_MAX, "%s/%s", brick, fname); + + printf ("Validating initial version..\n"); + ret = brstub_validate_version (bpath, 1); + if (ret < 0) + goto err; + + printf ("Validating version on modifications..\n"); + ret = brstub_open_validation (filp, bpath, 1); + if (ret < 0) + goto err; + + return 0; + + err: + return -1; +} + +int +main (int argc, char **argv) +{ + int ret = 0; + char *filp = NULL; + char *brick = NULL; + + if (argc != 3) { + printf ("Usage: %s <path> <brick>\n", argv[0]); + goto err; + } + + filp = argv[1]; + brick = argv[2]; + + printf ("Validating object version [%s]\n", filp); + ret = brstub_new_object_validate (filp, brick); + if (ret < 0) + goto err; + + return 0; + + err: + return -1; +} diff --git a/tests/bitrot/br-stub.t b/tests/bitrot/br-stub.t new file mode 100644 index 00000000000..11d02418785 --- /dev/null +++ b/tests/bitrot/br-stub.t @@ -0,0 +1,44 @@ +#!/bin/bash + +. $(dirname $0)/../include.rc +. $(dirname $0)/../volume.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 open-behind (stub does not work with anonfd yet..) +TEST $CLI volume set $V0 performance.open-behind off +EXPECT 'off' volinfo_field $V0 'performance.open-behind' + +## 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" +touch $fname +backpath=$(get_backend_paths $fname) +TEST $STUB_EXEC $fname $(dirname $backpath) + +## cleanups.. +rm -f $STUB_EXEC + +cleanup; |