diff options
| -rw-r--r-- | tests/bitrot/br-stub.c | 147 | ||||
| -rw-r--r-- | tests/bitrot/br-stub.t | 44 | ||||
| -rw-r--r-- | xlators/features/bit-rot/src/stub/bit-rot-common.h | 17 | ||||
| -rw-r--r-- | xlators/features/bit-rot/src/stub/bit-rot-object-version.h | 30 | 
4 files changed, 222 insertions, 16 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; diff --git a/xlators/features/bit-rot/src/stub/bit-rot-common.h b/xlators/features/bit-rot/src/stub/bit-rot-common.h index ae1f45f6d1d..fdf23142768 100644 --- a/xlators/features/bit-rot/src/stub/bit-rot-common.h +++ b/xlators/features/bit-rot/src/stub/bit-rot-common.h @@ -17,22 +17,7 @@  #endif  #include "glusterfs.h" - -/** - * on-disk formats for ongoing version and object signature. - */ -typedef struct br_version { -        unsigned long ongoingversion; -        uint32_t timebuf[2]; -} br_version_t; - -typedef struct br_signature { -        int8_t signaturetype; - -        unsigned long signedversion; - -        char signature[0]; -} br_signature_t; +#include "bit-rot-object-version.h"  #define BR_VXATTR_VERSION   (1 << 0)  #define BR_VXATTR_SIGNATURE (1 << 1) diff --git a/xlators/features/bit-rot/src/stub/bit-rot-object-version.h b/xlators/features/bit-rot/src/stub/bit-rot-object-version.h new file mode 100644 index 00000000000..a158adf8153 --- /dev/null +++ b/xlators/features/bit-rot/src/stub/bit-rot-object-version.h @@ -0,0 +1,30 @@ +/* +   Copyright (c) 2015 Red Hat, Inc. <http://www.redhat.com> +   This file is part of GlusterFS. + +   This file is licensed to you under your choice of the GNU Lesser +   General Public License, version 3 or any later version (LGPLv3 or +   later), or the GNU General Public License, version 2 (GPLv2), in all +   cases as published by the Free Software Foundation. +*/ + +#ifndef __BIT_ROT_OBJECT_VERSION_H +#define __BIT_ROT_OBJECT_VERSION_H + +/** + * on-disk formats for ongoing version and object signature. + */ +typedef struct br_version { +        unsigned long ongoingversion; +        uint32_t timebuf[2]; +} br_version_t; + +typedef struct br_signature { +        int8_t signaturetype; + +        unsigned long signedversion; + +        char signature[0]; +} br_signature_t; + +#endif  | 
