diff options
Diffstat (limited to 'tests/bitrot')
| -rw-r--r-- | tests/bitrot/br-signer-threads-config-1797869.t | 73 | ||||
| -rw-r--r-- | tests/bitrot/br-state-check.t | 1 | ||||
| -rw-r--r-- | tests/bitrot/br-stub.c | 304 | ||||
| -rw-r--r-- | tests/bitrot/br-stub.t | 2 | ||||
| -rw-r--r-- | tests/bitrot/bug-1244613.t | 2 | ||||
| -rw-r--r-- | tests/bitrot/bug-1294786.t | 4 | ||||
| -rw-r--r-- | tests/bitrot/bug-1373520.t | 21 | ||||
| -rw-r--r-- | tests/bitrot/bug-1700078.t | 87 |
8 files changed, 337 insertions, 157 deletions
diff --git a/tests/bitrot/br-signer-threads-config-1797869.t b/tests/bitrot/br-signer-threads-config-1797869.t new file mode 100644 index 00000000000..657ef3eedaf --- /dev/null +++ b/tests/bitrot/br-signer-threads-config-1797869.t @@ -0,0 +1,73 @@ +#!/bin/bash + +. $(dirname $0)/../include.rc +. $(dirname $0)/../volume.rc +. $(dirname $0)/../cluster.rc + +function get_bitd_count_1 { + ps auxww | grep glusterfs | grep bitd.pid | grep -v grep | grep $H1 | wc -l +} + +function get_bitd_count_2 { + ps auxww | grep glusterfs | grep bitd.pid | grep -v grep | grep $H2 | wc -l +} + +function get_bitd_pid_1 { + ps auxww | grep glusterfs | grep bitd.pid | grep -v grep | grep $H1 | awk '{print $2}' +} + +function get_bitd_pid_2 { + ps auxww | grep glusterfs | grep bitd.pid | grep -v grep | grep $H2 | awk '{print $2}' +} + +function get_signer_th_count_1 { + ps -eL | grep $(get_bitd_pid_1) | grep glfs_brpobj | wc -l +} + +function get_signer_th_count_2 { + ps -eL | grep $(get_bitd_pid_2) | grep glfs_brpobj | wc -l +} + +cleanup; + +TEST launch_cluster 2 + +TEST $CLI_1 peer probe $H2; +EXPECT_WITHIN $PROBE_TIMEOUT 1 peer_count; + +TEST $CLI_1 volume create $V0 $H1:$B1 +TEST $CLI_1 volume create $V1 $H2:$B2 +EXPECT 'Created' volinfo_field_1 $V0 'Status'; +EXPECT 'Created' volinfo_field_1 $V1 'Status'; + +TEST $CLI_1 volume start $V0 +TEST $CLI_1 volume start $V1 +EXPECT 'Started' volinfo_field_1 $V0 'Status'; +EXPECT 'Started' volinfo_field_1 $V1 'Status'; + +#Enable bitrot +TEST $CLI_1 volume bitrot $V0 enable +TEST $CLI_1 volume bitrot $V1 enable +EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" get_bitd_count_1 +EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" get_bitd_count_2 + +EXPECT_WITHIN $PROCESS_UP_TIMEOUT "4" get_signer_th_count_1 +EXPECT_WITHIN $PROCESS_UP_TIMEOUT "4" get_signer_th_count_2 + +old_bitd_pid_1=$(get_bitd_pid_1) +old_bitd_pid_2=$(get_bitd_pid_2) +TEST $CLI_1 volume bitrot $V0 signer-threads 1 +EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" get_signer_th_count_1 +EXPECT_NOT "$old_bitd_pid_1" get_bitd_pid_1; +EXPECT_WITHIN $PROCESS_UP_TIMEOUT "4" get_signer_th_count_2 +EXPECT "$old_bitd_pid_2" get_bitd_pid_2; + +old_bitd_pid_1=$(get_bitd_pid_1) +old_bitd_pid_2=$(get_bitd_pid_2) +TEST $CLI_1 volume bitrot $V1 signer-threads 2 +EXPECT_WITHIN $PROCESS_UP_TIMEOUT "2" get_signer_th_count_2 +EXPECT_NOT "$old_bitd_pid_2" get_bitd_pid_2; +EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" get_signer_th_count_1 +EXPECT "$old_bitd_pid_1" get_bitd_pid_1; + +cleanup; diff --git a/tests/bitrot/br-state-check.t b/tests/bitrot/br-state-check.t index e165462cfcd..2142275699e 100644 --- a/tests/bitrot/br-state-check.t +++ b/tests/bitrot/br-state-check.t @@ -5,6 +5,7 @@ . $(dirname $0)/../nfs.rc cleanup; +SCRIPT_TIMEOUT=350 TEST glusterd TEST pidof glusterd diff --git a/tests/bitrot/br-stub.c b/tests/bitrot/br-stub.c index 5b862832e77..1111f710f59 100644 --- a/tests/bitrot/br-stub.c +++ b/tests/bitrot/br-stub.c @@ -15,179 +15,181 @@ /* NOTE: no size discovery */ int -brstub_validate_version (char *bpath, unsigned long version) +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) { - match = -1; - goto err; - } - - ret = getxattr (bpath, "trusted.bit-rot.version", xv, xsize); - if (ret < 0) { - if (errno == ENODATA) - match = -2; - goto err; - } - - if (xv->ongoingversion != version) { - match = -3; - fprintf (stderr, "ongoingversion: %lu\n", xv->ongoingversion); - } - free (xv); - - err: - return match; + 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) { + match = -1; + goto err; + } + + ret = getxattr(bpath, "trusted.bit-rot.version", xv, xsize); + if (ret < 0) { + if (errno == ENODATA) + match = -2; + goto err; + } + + if (xv->ongoingversion != version) { + match = -3; + fprintf(stderr, "ongoingversion: %lu\n", xv->ongoingversion); + } + free(xv); + +err: + return match; } int -brstub_write_validation (char *filp, char *bpath, unsigned long startversion) +brstub_write_validation(char *filp, char *bpath, unsigned long startversion) { - int fd1 = 0; - int fd2 = 0; - int ret = 0; - char *string = "string\n"; - - /* read only check */ - fd1 = open (filp, O_RDONLY); - if (fd1 < 0) - goto err; - close (fd1); - - ret = brstub_validate_version (bpath, startversion); - if (ret != -2) - goto err; - - /* single open (write/) check */ - fd1 = open (filp, O_RDWR); - if (fd1 < 0) - goto err; - - ret = write (fd1, string, strlen (string)); - if (ret <= 0) - goto err; - /** - * Fsync is done so that the write call has properly reached the - * disk. For fuse mounts write-behind xlator would have held the - * writes with itself and for nfs, client would have held the - * write in its cache. So write fop would not have triggered the - * versioning as it would have not reached the bit-rot-stub. - */ - fsync (fd1); - ret = brstub_validate_version (bpath, startversion); - 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) - 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) - goto err; - fd2 = open (filp, O_WRONLY); - if (fd1 < 0) - goto err; - - ret = write (fd1, string, strlen (string)); - if (ret <= 0) - goto err; - - ret = write (fd2, string, strlen (string)); - if (ret <= 0) - goto err; - - /* probably do a syncfs() */ - fsync (fd1); - fsync (fd2); - - close (fd1); - close (fd2); - - /** - * incremented once per write()/write().../close()/close() sequence - */ - ret = brstub_validate_version (bpath, startversion); - if (ret != 0) - goto err; - - return 0; - - err: - return -1; + int fd1 = 0; + int fd2 = 0; + int ret = 0; + char *string = "string\n"; + + /* read only check */ + fd1 = open(filp, O_RDONLY); + if (fd1 < 0) + goto err; + close(fd1); + + ret = brstub_validate_version(bpath, startversion); + if (ret != -2) + goto err; + + /* single open (write/) check */ + fd1 = open(filp, O_RDWR); + if (fd1 < 0) + goto err; + + ret = write(fd1, string, strlen(string)); + if (ret <= 0) + goto err; + /** + * Fsync is done so that the write call has properly reached the + * disk. For fuse mounts write-behind xlator would have held the + * writes with itself and for nfs, client would have held the + * write in its cache. So write fop would not have triggered the + * versioning as it would have not reached the bit-rot-stub. + */ + fsync(fd1); + ret = brstub_validate_version(bpath, startversion); + 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) + 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) + goto err; + fd2 = open(filp, O_WRONLY); + if (fd1 < 0) + goto err; + + ret = write(fd1, string, strlen(string)); + if (ret <= 0) + goto err; + + ret = write(fd2, string, strlen(string)); + if (ret <= 0) + goto err; + + /* probably do a syncfs() */ + fsync(fd1); + fsync(fd2); + + close(fd1); + close(fd2); + + /** + * incremented once per write()/write().../close()/close() sequence + */ + 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) +brstub_new_object_validate(char *filp, char *brick) { - int ret = 0; - char *fname = NULL; - char bpath[PATH_MAX] = {0,}; + int ret = 0; + char *fname = NULL; + char bpath[PATH_MAX] = { + 0, + }; - fname = basename (filp); - if (!fname) - goto err; + fname = basename(filp); + if (!fname) + goto err; - (void) snprintf (bpath, PATH_MAX, "%s/%s", brick, fname); + (void)snprintf(bpath, PATH_MAX, "%s/%s", brick, fname); - printf ("Validating initial version..\n"); - ret = brstub_validate_version (bpath, 2); - if (ret != -2) /* version _should_ be missing */ - goto err; + printf("Validating initial version..\n"); + 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, 2); - if (ret < 0) - goto err; + printf("Validating version on modifications..\n"); + ret = brstub_write_validation(filp, bpath, 2); + if (ret < 0) + goto err; - return 0; + return 0; - err: - return -1; +err: + return -1; } int -main (int argc, char **argv) +main(int argc, char **argv) { - int ret = 0; - char *filp = NULL; - char *brick = NULL; + int ret = 0; + char *filp = NULL; + char *brick = NULL; - if (argc != 3) { - printf ("Usage: %s <path> <brick>\n", argv[0]); - goto err; - } + if (argc != 3) { + printf("Usage: %s <path> <brick>\n", argv[0]); + goto err; + } - filp = argv[1]; - brick = argv[2]; + 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; + printf("Validating object version [%s]\n", filp); + ret = brstub_new_object_validate(filp, brick); + if (ret < 0) + goto err; - return 0; + return 0; - err: - return -1; +err: + return -1; } diff --git a/tests/bitrot/br-stub.t b/tests/bitrot/br-stub.t index 5013398482a..cc0319afac9 100644 --- a/tests/bitrot/br-stub.t +++ b/tests/bitrot/br-stub.t @@ -4,6 +4,8 @@ . $(dirname $0)/../volume.rc . $(dirname $0)/../nfs.rc +#G_TESTDEF_TEST_STATUS_CENTOS6=NFS_TEST + STUB_SOURCE=$(dirname $0)/br-stub.c STUB_EXEC=$(dirname $0)/br-stub diff --git a/tests/bitrot/bug-1244613.t b/tests/bitrot/bug-1244613.t index 5674e6f4ef5..57b86a94ac0 100644 --- a/tests/bitrot/bug-1244613.t +++ b/tests/bitrot/bug-1244613.t @@ -5,6 +5,8 @@ . $(dirname $0)/../nfs.rc . $(dirname $0)/../fileio.rc +#G_TESTDEF_TEST_STATUS_CENTOS6=NFS_TEST + cleanup; TESTS_EXPECTED_IN_LOOP=16 diff --git a/tests/bitrot/bug-1294786.t b/tests/bitrot/bug-1294786.t index b177574f756..5b4b6ddb4d3 100644 --- a/tests/bitrot/bug-1294786.t +++ b/tests/bitrot/bug-1294786.t @@ -65,8 +65,8 @@ EXPECT "4" get_quarantine_count "$B1"; TEST $CLI_1 volume stop $V0 TEST $CLI_1 volume start $V0 EXPECT 'Started' volinfo_field_1 $V0 'Status'; -EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status_1 $V0 $H1 $B1 -EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status_1 $V0 $H2 $B2 +EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" cluster_brick_up_status 1 $V0 $H1 $B1 +EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" cluster_brick_up_status 1 $V0 $H2 $B2 EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status $V0 0 EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status $V0 1 EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" get_bitd_count_1 diff --git a/tests/bitrot/bug-1373520.t b/tests/bitrot/bug-1373520.t index 225d3b1a9bc..6af5124e86e 100644 --- a/tests/bitrot/bug-1373520.t +++ b/tests/bitrot/bug-1373520.t @@ -11,13 +11,20 @@ TEST pidof glusterd #Create a disperse volume TEST $CLI volume create $V0 disperse 6 redundancy 2 $H0:$B0/${V0}{0..5} TEST $CLI volume start $V0 +EXPECT_WITHIN $PROCESS_UP_TIMEOUT "6" online_brick_count EXPECT_WITHIN $PROCESS_UP_TIMEOUT 'Started' volinfo_field $V0 'Status' -#Disable md-cache +#Disable self heal daemon as it races in this test with lookup on volume +#stop and start. +$CLI volume set $V0 self-heal-daemon off + +#Disable few perf xlators to get the first lookup on the brick TEST $CLI volume set $V0 performance.stat-prefetch off +TEST $CLI volume set $V0 performance.force-readdirp off +TEST $CLI volume set $V0 dht.force-readdirp off #Mount the volume -TEST $GFS -s $H0 --volfile-id $V0 $M0 +TEST $GFS -s $H0 --use-readdirp=no --attribute-timeout=0 --entry-timeout=0 --volfile-id $V0 $M0 EXPECT_WITHIN $CHILD_UP_TIMEOUT "6" ec_child_up_count $V0 0 #Enable bitrot @@ -49,10 +56,16 @@ EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" get_bitd_count #Delete file and all links from backend TEST rm -rf $(find $B0/${V0}5 -inum $(stat -c %i $B0/${V0}5/FILE1)) +#New mount for recovery +TEST $GFS -s $H0 --use-readdirp=no --attribute-timeout=0 --entry-timeout=0 --volfile-id $V0 $M1 + +$CLI volume set $V0 self-heal-daemon on +TEST $CLI volume heal $V0 + #Access files -TEST cat $M0/FILE1 +TEST cat $M1/FILE1 EXPECT_WITHIN $HEAL_TIMEOUT "$SIZE" path_size $B0/${V0}5/FILE1 -TEST cat $M0/HL_FILE1 +TEST cat $M1/HL_FILE1 EXPECT_WITHIN $HEAL_TIMEOUT "$SIZE" path_size $B0/${V0}5/HL_FILE1 cleanup; diff --git a/tests/bitrot/bug-1700078.t b/tests/bitrot/bug-1700078.t new file mode 100644 index 00000000000..f27374211fe --- /dev/null +++ b/tests/bitrot/bug-1700078.t @@ -0,0 +1,87 @@ +#!/bin/bash + +. $(dirname $0)/../include.rc +. $(dirname $0)/../volume.rc + +cleanup; + +## Start glusterd +TEST glusterd; +TEST pidof glusterd; + +## Lets create and start the volume +TEST $CLI volume create $V0 $H0:$B0/${V0}1 +TEST $CLI volume start $V0 + +## Enable bitrot for volume $V0 +TEST $CLI volume bitrot $V0 enable + +## Turn off quick-read so that it wont cache the contents +# of the file in lookup. For corrupted files, it might +# end up in reads being served from the cache instead of +# an error. +TEST $CLI volume set $V0 performance.quick-read off + +EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" get_bitd_count + +EXPECT_WITHIN $PROCESS_UP_TIMEOUT 'Active' scrub_status $V0 'State of scrub' +EXPECT_WITHIN $PROCESS_UP_TIMEOUT '/var/log/glusterfs/bitd.log' scrub_status $V0 'Bitrot error log location' +EXPECT_WITHIN $PROCESS_UP_TIMEOUT '/var/log/glusterfs/scrub.log' scrub_status $V0 'Scrubber error log location' + +## Set expiry-timeout to 1 sec +TEST $CLI volume set $V0 features.expiry-time 1 + +##Mount $V0 +TEST glusterfs --volfile-id=$V0 --volfile-server=$H0 $M0 --attribute-timeout=0 --entry-timeout=0 + +## Turn off quick-read xlator so that, the contents are not served from the +# quick-read cache. +TEST $CLI volume set $V0 performance.quick-read off + +#Create sample file +TEST `echo "1234" > $M0/FILE1` +EXPECT_WITHIN $PROCESS_UP_TIMEOUT 'trusted.bit-rot.signature' check_for_xattr 'trusted.bit-rot.signature' "/$B0/${V0}1/FILE1" + +##disable bitrot +TEST $CLI volume bitrot $V0 disable + +## modify the file +TEST `echo "write" >> $M0/FILE1` + +# unmount and remount when the file has to be accessed. +# This is to ensure that, when the remount happens, +# and the file is read, its contents are served from the +# brick instead of cache. +EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0 + +##enable bitrot +TEST $CLI volume bitrot $V0 enable + +# expiry time is set to 1 second. Hence sleep for 2 seconds for the +# oneshot crawler to finish its crawling and sign the file properly. +sleep 2 + +EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" get_bitd_count + +EXPECT_WITHIN $PROCESS_UP_TIMEOUT 'Active' scrub_status $V0 'State of scrub' +EXPECT_WITHIN $PROCESS_UP_TIMEOUT '/var/log/glusterfs/bitd.log' scrub_status $V0 'Bitrot error log location' +EXPECT_WITHIN $PROCESS_UP_TIMEOUT '/var/log/glusterfs/scrub.log' scrub_status $V0 'Scrubber error log location' + +## Ondemand scrub +TEST $CLI volume bitrot $V0 scrub ondemand + +# the scrub ondemand CLI command, just ensures that +# the scrubber has received the ondemand scrub directive +# and started. sleep for 2 seconds for scrubber to finish +# crawling and marking file(s) as bad (if if finds that +# corruption has happened) which are filesystem operations. +sleep 2 + +TEST ! getfattr -n 'trusted.bit-rot.bad-file' $B0/${V0}1/FILE1 + +##Mount $V0 +TEST glusterfs --volfile-id=$V0 --volfile-server=$H0 $M0 --attribute-timeout=0 --entry-timeout=0 + +TEST cat $M0/FILE1 + +cleanup; |
