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;  | 
