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 | 2 | ||||
| -rw-r--r-- | tests/bitrot/br-stub.c | 304 | ||||
| -rw-r--r-- | tests/bitrot/br-stub.t | 9 | ||||
| -rw-r--r-- | tests/bitrot/bug-1207627-bitrot-scrub-status.t | 20 | ||||
| -rw-r--r-- | tests/bitrot/bug-1221914.t | 3 | ||||
| -rw-r--r-- | tests/bitrot/bug-1244613.t | 10 | ||||
| -rw-r--r-- | tests/bitrot/bug-1294786.t | 22 | ||||
| -rw-r--r-- | tests/bitrot/bug-1373520.t | 71 | ||||
| -rw-r--r-- | tests/bitrot/bug-1700078.t | 87 |
10 files changed, 434 insertions, 167 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 0390df5e4a0..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 @@ -79,3 +80,4 @@ TEST $CLI volume bitrot $V0 scrub pause TEST kill_brick $V0 $H0 $B0/${V0}2 cleanup; +#G_TESTDEF_TEST_STATUS_NETBSD7=KNOWN_ISSUE,BUG=1332473 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 eb0c55caa36..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 @@ -17,6 +19,7 @@ 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 +TEST $CLI volume set $V0 nfs.disable false ## Turn off write-behind (write-behind clubs writes together) TEST $CLI volume set $V0 performance.write-behind off @@ -26,6 +29,12 @@ TEST $CLI volume set $V0 performance.write-behind off TEST $CLI volume start $V0; EXPECT 'Started' volinfo_field $V0 'Status'; +## enable bitrot +TEST $CLI volume bitrot $V0 enable; + +## Wait for gluster nfs to come up +EXPECT_WITHIN $NFS_EXPORT_TIMEOUT "1" is_nfs_export_available + ## Mount the volume TEST $GFS --volfile-server=$H0 --volfile-id=$V0 $M0; TEST mount_nfs $H0:/$V0 $N0 nolock; diff --git a/tests/bitrot/bug-1207627-bitrot-scrub-status.t b/tests/bitrot/bug-1207627-bitrot-scrub-status.t index bca3919e2ac..a361986fdaf 100644 --- a/tests/bitrot/bug-1207627-bitrot-scrub-status.t +++ b/tests/bitrot/bug-1207627-bitrot-scrub-status.t @@ -12,7 +12,7 @@ TEST glusterd; TEST pidof glusterd; ## Lets create and start the volume -TEST $CLI volume create $V0 $H0:$B0/${V0}{1..2} +TEST $CLI volume create $V0 $H0:$B0/${V0}1 TEST $CLI volume start $V0 ## Enable bitrot for volume $V0 @@ -26,11 +26,27 @@ TEST $CLI volume bitrot $V0 scrub-frequency hourly ## Setting scrubber throttle value lazy TEST $CLI volume bitrot $V0 scrub-throttle lazy - EXPECT_WITHIN $PROCESS_UP_TIMEOUT 'Active' scrub_status $V0 'State of scrub' EXPECT_WITHIN $PROCESS_UP_TIMEOUT 'lazy' scrub_status $V0 'Scrub impact' EXPECT_WITHIN $PROCESS_UP_TIMEOUT 'hourly' scrub_status $V0 'Scrub frequency' 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 $GFS --volfile-id=$V0 --volfile-server=$H0 $M0 + +#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" + +##Corrupt the file +TEST `echo "corrupt" >> /$B0/${V0}1/FILE1` + +## Ondemand scrub +TEST $CLI volume bitrot $V0 scrub ondemand +EXPECT_WITHIN $PROCESS_UP_TIMEOUT 'trusted.bit-rot.bad-file' check_for_xattr 'trusted.bit-rot.bad-file' "/$B0/${V0}1/FILE1" + cleanup; diff --git a/tests/bitrot/bug-1221914.t b/tests/bitrot/bug-1221914.t index 85715e5a83c..7f6c10c50df 100644 --- a/tests/bitrot/bug-1221914.t +++ b/tests/bitrot/bug-1221914.t @@ -25,6 +25,9 @@ TEST $CLI volume set $V0 performance.write-behind off TEST $CLI volume start $V0; EXPECT 'Started' volinfo_field $V0 'Status'; +## Enable bitrot +TEST $CLI volume bitrot $V0 enable; + ## Mount the volume TEST $GFS --volfile-server=$H0 --volfile-id=$V0 $M0; diff --git a/tests/bitrot/bug-1244613.t b/tests/bitrot/bug-1244613.t index 000a1d358e9..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 @@ -14,7 +16,7 @@ TEST $CLI volume info; TEST $CLI volume create $V0 $H0:$B0/brick1; EXPECT 'Created' volinfo_field $V0 'Status'; - +TEST $CLI volume set $V0 nfs.disable false # The test makes use of inode-lru-limit to hit a scenario, where we # find an inode whose ancestry is not there. Following is the @@ -40,6 +42,12 @@ TEST $CLI volume set $V0 performance.nfs.write-behind off TEST $CLI volume start $V0; EXPECT 'Started' volinfo_field $V0 'Status'; +## Enable bitrot +TEST $CLI volume bitrot $V0 enable; + +## Wait for gluster nfs to come up +EXPECT_WITHIN $NFS_EXPORT_TIMEOUT "1" is_nfs_export_available + TEST mount_nfs $H0:/$V0 $N0; deep=/0/1/2/3/4/5/6/7/8/9 TEST mkdir -p $N0/$deep diff --git a/tests/bitrot/bug-1294786.t b/tests/bitrot/bug-1294786.t index 4911c1dd6c2..5b4b6ddb4d3 100644 --- a/tests/bitrot/bug-1294786.t +++ b/tests/bitrot/bug-1294786.t @@ -16,10 +16,6 @@ function get_node_uuid { getfattr -n trusted.glusterfs.node-uuid --only-values $M0/FILE1 2>/dev/null } -function get_quarantine_count { - ls -l "$B1/.glusterfs/quanrantine" | wc -l -} - cleanup; TEST launch_cluster 2 @@ -60,17 +56,17 @@ echo "Corrupted data" >> $B1/FILE2 #Manually set bad-file xattr since we can't wait for an hour for scrubber. TEST setfattr -n trusted.bit-rot.bad-file -v 0x3100 $B1/FILE1 TEST setfattr -n trusted.bit-rot.bad-file -v 0x3100 $B1/FILE2 -TEST touch "$B1/.glusterfs/quanrantine/$gfid1" -TEST chmod 000 "$B1/.glusterfs/quanrantine/$gfid1" -TEST touch "$B1/.glusterfs/quanrantine/$gfid2" -TEST chmod 000 "$B1/.glusterfs/quanrantine/$gfid2" -EXPECT "4" get_quarantine_count; +TEST touch "$B1/.glusterfs/quarantine/$gfid1" +TEST chmod 000 "$B1/.glusterfs/quarantine/$gfid1" +TEST touch "$B1/.glusterfs/quarantine/$gfid2" +TEST chmod 000 "$B1/.glusterfs/quarantine/$gfid2" +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 @@ -84,7 +80,7 @@ EXPECT "$uuid2" get_node_uuid; #BUG 1308961 #Remove bad files from mount, it should be removed from quarantine directory. TEST rm -f $M0/FILE1 -TEST ! stat "$B1/.glusterfs/quanrantine/$gfid1" +TEST ! stat "$B1/.glusterfs/quarantine/$gfid1" #BUG 1308961 #Set network.inode-lru-limit to 5 and exceed the limit by creating 10 other files. @@ -94,6 +90,6 @@ for i in {1..10} do echo "1234" > $M0/file_$i done -TEST stat "$B1/.glusterfs/quanrantine/$gfid2" +TEST stat "$B1/.glusterfs/quarantine/$gfid2" cleanup; diff --git a/tests/bitrot/bug-1373520.t b/tests/bitrot/bug-1373520.t new file mode 100644 index 00000000000..6af5124e86e --- /dev/null +++ b/tests/bitrot/bug-1373520.t @@ -0,0 +1,71 @@ +#!/bin/bash + +. $(dirname $0)/../include.rc +. $(dirname $0)/../volume.rc + +cleanup; + +TEST glusterd +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 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 --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 +TEST $CLI volume bitrot $V0 enable +EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" get_bitd_count + +#Create sample file +TEST `echo "1234" > $M0/FILE1` +#Create hardlink +TEST `ln $M0/FILE1 $M0/HL_FILE1` + +#Corrupt file from back-end +TEST stat $B0/${V0}5/FILE1 +SIZE=$(stat -c %s $B0/${V0}5/FILE1) +echo "Corrupted data" >> $B0/${V0}5/FILE1 +gfid1=$(getfattr -n glusterfs.gfid.string --only-values $M0/FILE1) + +#Manually set bad-file xattr +TEST setfattr -n trusted.bit-rot.bad-file -v 0x3100 $B0/${V0}5/FILE1 +TEST touch "$B0/${V0}5/.glusterfs/quarantine/$gfid1" +TEST chmod 000 "$B0/${V0}5/.glusterfs/quarantine/$gfid1" +EXPECT "3" get_quarantine_count "$B0/${V0}5"; + +TEST $CLI volume stop $V0 +TEST $CLI volume start $V0 +EXPECT_WITHIN $CHILD_UP_TIMEOUT "6" ec_child_up_count $V0 0 +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 $M1/FILE1 +EXPECT_WITHIN $HEAL_TIMEOUT "$SIZE" path_size $B0/${V0}5/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; |
