diff options
Diffstat (limited to 'tests/bugs')
253 files changed, 7763 insertions, 3760 deletions
diff --git a/tests/bugs/access-control/bug-1051896.c b/tests/bugs/access-control/bug-1051896.c index 27aa1559453..31799d97a71 100644 --- a/tests/bugs/access-control/bug-1051896.c +++ b/tests/bugs/access-control/bug-1051896.c @@ -13,85 +13,82 @@ #include <utime.h> #include <sys/acl.h> -int do_setfacl(const char *path, const char *options, const char *textacl) +int +do_setfacl(const char *path, const char *options, const char *textacl) { - int r; - int type; - acl_t acl; - int dob; - int dok; - int dom; - struct stat st; - char textmode[30]; + int r; + int type; + acl_t acl; + int dob; + int dok; + int dom; + struct stat st; + char textmode[30]; - r = 0; - dob = strchr(options, 'b') != (char *)NULL; - dok = strchr(options, 'k') != (char *)NULL; - dom = strchr(options, 'm') != (char *)NULL; - if ((dom && !textacl) - || (!dom && (textacl || (!dok && !dob) || - strchr(options, 'd')))) { - errno = EBADRQC; /* "bad request" */ - r = -1; - } else { - if (dob || dok) { - r = acl_delete_def_file(path); - } - if (dob && !r) { - if (!stat(path, &st)) { - sprintf(textmode, - "u::%c%c%c,g::%c%c%c,o::%c%c%c", - (st.st_mode & 0400 ? 'r' : '-'), - (st.st_mode & 0200 ? 'w' : '-'), - (st.st_mode & 0100 ? 'x' : '-'), - (st.st_mode & 0040 ? 'r' : '-'), - (st.st_mode & 0020 ? 'w' : '-'), - (st.st_mode & 0010 ? 'x' : '-'), - (st.st_mode & 004 ? 'r' : '-'), - (st.st_mode & 002 ? 'w' : '-'), - (st.st_mode & 001 ? 'x' : '-')); - acl = acl_from_text(textmode); - if (acl) { - r = acl_set_file(path, - ACL_TYPE_ACCESS, acl); - acl_free(acl); - } else - r = -1; - } else - r = -1; - } - if (!r && dom) { - if (strchr(options, 'd')) - type = ACL_TYPE_DEFAULT; - else - type = ACL_TYPE_ACCESS; - acl = acl_from_text(textacl); - if (acl) { - r = acl_set_file(path, type, acl); - acl_free(acl); - } else - r = -1; - } - } - if (r) - r = -errno; - return r; + r = 0; + dob = strchr(options, 'b') != (char *)NULL; + dok = strchr(options, 'k') != (char *)NULL; + dom = strchr(options, 'm') != (char *)NULL; + if ((dom && !textacl) || + (!dom && (textacl || (!dok && !dob) || strchr(options, 'd')))) { + errno = EBADRQC; /* "bad request" */ + r = -1; + } else { + if (dob || dok) { + r = acl_delete_def_file(path); + } + if (dob && !r) { + if (!stat(path, &st)) { + sprintf(textmode, "u::%c%c%c,g::%c%c%c,o::%c%c%c", + (st.st_mode & 0400 ? 'r' : '-'), + (st.st_mode & 0200 ? 'w' : '-'), + (st.st_mode & 0100 ? 'x' : '-'), + (st.st_mode & 0040 ? 'r' : '-'), + (st.st_mode & 0020 ? 'w' : '-'), + (st.st_mode & 0010 ? 'x' : '-'), + (st.st_mode & 004 ? 'r' : '-'), + (st.st_mode & 002 ? 'w' : '-'), + (st.st_mode & 001 ? 'x' : '-')); + acl = acl_from_text(textmode); + if (acl) { + r = acl_set_file(path, ACL_TYPE_ACCESS, acl); + acl_free(acl); + } else + r = -1; + } else + r = -1; + } + if (!r && dom) { + if (strchr(options, 'd')) + type = ACL_TYPE_DEFAULT; + else + type = ACL_TYPE_ACCESS; + acl = acl_from_text(textacl); + if (acl) { + r = acl_set_file(path, type, acl); + acl_free(acl); + } else + r = -1; + } + } + if (r) + r = -errno; + return r; } - -int main(int argc, char *argv[]) +int +main(int argc, char *argv[]) { - int rc = 0; + int rc = 0; - if (argc != 4) { - fprintf(stderr, - "usage: ./setfacl_test <path> <options> <textacl>\n"); - return 0; - } - rc = do_setfacl(argv[1], argv[2], argv[3]); - if (rc != 0) { - fprintf(stderr, "do_setfacl failed: %s\n", strerror(errno)); - return rc; - } - return 0; + if (argc != 4) { + fprintf(stderr, "usage: ./setfacl_test <path> <options> <textacl>\n"); + return 0; + } + rc = do_setfacl(argv[1], argv[2], argv[3]); + if (rc != 0) { + fprintf(stderr, "do_setfacl failed: %s\n", strerror(errno)); + return rc; + } + return 0; } diff --git a/tests/bugs/access-control/bug-1387241.c b/tests/bugs/access-control/bug-1387241.c index 04e0d6ea11f..e2e843a2fda 100644 --- a/tests/bugs/access-control/bug-1387241.c +++ b/tests/bugs/access-control/bug-1387241.c @@ -3,15 +3,16 @@ #include <unistd.h> #include <fcntl.h> -int main(int argc, char *argv[]) +int +main(int argc, char *argv[]) { - int ret = EXIT_FAILURE; - int fd = open(argv[1], O_RDONLY|O_TRUNC); + int ret = EXIT_FAILURE; + int fd = open(argv[1], O_RDONLY | O_TRUNC); - if (fd) { - ret = EXIT_SUCCESS; - close(fd); - } + if (fd) { + ret = EXIT_SUCCESS; + close(fd); + } - return ret; + return ret; } diff --git a/tests/bugs/access-control/bug-958691.t b/tests/bugs/access-control/bug-958691.t index 6c45b47b166..8b70607bdbb 100644 --- a/tests/bugs/access-control/bug-958691.t +++ b/tests/bugs/access-control/bug-958691.t @@ -3,6 +3,8 @@ . $(dirname $0)/../../volume.rc . $(dirname $0)/../../nfs.rc +#G_TESTDEF_TEST_STATUS_CENTOS6=NFS_TEST + cleanup; TEST glusterd diff --git a/tests/bugs/bitrot/bug-1227996.t b/tests/bugs/bitrot/bug-1227996.t index 47ebc4235cf..121c7b5f279 100644 --- a/tests/bugs/bitrot/bug-1227996.t +++ b/tests/bugs/bitrot/bug-1227996.t @@ -17,7 +17,6 @@ TEST pidof glusterd; ## Lets create and start the volume TEST $CLI volume create $V0 $H0:$B0/${V0}0 $H0:$B0/${V0}1 TEST $CLI volume start $V0 - ## Enable bitrot on volume $V0 TEST $CLI volume bitrot $V0 enable diff --git a/tests/bugs/bitrot/bug-1245981.t b/tests/bugs/bitrot/bug-1245981.t index 2bed4d980fa..f3955256b01 100644 --- a/tests/bugs/bitrot/bug-1245981.t +++ b/tests/bugs/bitrot/bug-1245981.t @@ -47,9 +47,9 @@ touch $M0/5 sleep `expr $SLEEP_TIME \* 2` backpath=$(get_backend_paths $fname) -TEST getfattr -m . -n trusted.bit-rot.signature $backpath +EXPECT_WITHIN $PROCESS_UP_TIMEOUT 'trusted.bit-rot.signature' check_for_xattr 'trusted.bit-rot.signature' $backpath backpath=$(get_backend_paths $M0/new_file) -TEST getfattr -m . -n trusted.bit-rot.signature $backpath +EXPECT_WITHIN $PROCESS_UP_TIMEOUT 'trusted.bit-rot.signature' check_for_xattr 'trusted.bit-rot.signature' $backpath cleanup; diff --git a/tests/bugs/bug-1064147.t b/tests/bugs/bug-1064147.t new file mode 100755 index 00000000000..27ffde4eb44 --- /dev/null +++ b/tests/bugs/bug-1064147.t @@ -0,0 +1,72 @@ +#!/bin/bash + +. $(dirname $0)/../include.rc +. $(dirname $0)/../volume.rc + +# Initialize +#------------------------------------------------------------ +cleanup; + +# Start glusterd +TEST glusterd; +TEST pidof glusterd; +TEST $CLI volume info; + +# Create a volume +TEST $CLI volume create $V0 $H0:$B0/${V0}{1,2} + +# Verify volume creation +EXPECT "$V0" volinfo_field $V0 'Volume Name'; +EXPECT 'Created' volinfo_field $V0 'Status'; + +# Start volume and verify successful start +TEST $CLI volume start $V0; +EXPECT 'Started' volinfo_field $V0 'Status'; +TEST glusterfs --volfile-id=$V0 --volfile-server=$H0 --entry-timeout=0 $M0; +#------------------------------------------------------------ + +# Test case 1 - Subvolume down + Healing +#------------------------------------------------------------ +# Kill 2nd brick process +TEST kill_brick $V0 $H0 $B0/${V0}2 +EXPECT_WITHIN ${PROCESS_UP_TIMEOUT} "1" online_brick_count + +# Change root permissions +TEST chmod 444 $M0 + +# Store permission for comparision +TEST permission_new=`stat -c "%A" $M0` + +# Bring up the killed brick process +TEST $CLI volume start $V0 force + +# Perform lookup +sleep 5 +TEST ls $M0 + +# Check brick permissions +TEST brick_perm=`stat -c "%A" $B0/${V0}2` +TEST [ ${brick_perm} = ${permission_new} ] +#------------------------------------------------------------ + +# Test case 2 - Add-brick + Healing +#------------------------------------------------------------ +# Change root permissions +TEST chmod 777 $M0 + +# Store permission for comparision +TEST permission_new_2=`stat -c "%A" $M0` + +# Add a 3rd brick +TEST $CLI volume add-brick $V0 $H0:$B0/${V0}3 + +# Perform lookup +sleep 5 +TEST ls $M0 + +# Check permissions on the new brick +TEST brick_perm2=`stat -c "%A" $B0/${V0}3` + +TEST [ ${brick_perm2} = ${permission_new_2} ] + +cleanup; diff --git a/tests/bugs/bug-1138841.t b/tests/bugs/bug-1138841.t new file mode 100644 index 00000000000..abec5e89d56 --- /dev/null +++ b/tests/bugs/bug-1138841.t @@ -0,0 +1,25 @@ +#!/bin/bash +. $(dirname $0)/../include.rc +. $(dirname $0)/../volume.rc +. $(dirname $0)/../dht.rc +cleanup; + +TEST glusterd +TEST pidof glusterd + +## Create a volume and set auth.allow using cidr format ip + +TEST $CLI volume create $V0 $H0:$B0/${V0}{0,1} +TEST $CLI volume set $V0 auth.allow 127.0.0.1/20 +TEST $CLI volume start $V0 + + +## mount the volume and create a file on the mount point + +TEST $GFS --volfile-server=$H0 --volfile-id=$V0 $M0 +TEST touch $M0/tmp1 + +## Stop the volume and do the cleanup + +TEST $CLI volume stop $V0 +cleanup diff --git a/tests/bugs/bug-1258069.t b/tests/bugs/bug-1258069.t index 8df4a8a9e1b..b87ecbf2fe8 100755 --- a/tests/bugs/bug-1258069.t +++ b/tests/bugs/bug-1258069.t @@ -4,6 +4,8 @@ . $(dirname $0)/../volume.rc . $(dirname $0)/../nfs.rc +#G_TESTDEF_TEST_STATUS_CENTOS6=NFS_TEST + cleanup TEST glusterd diff --git a/tests/bugs/bug-1368312.t b/tests/bugs/bug-1368312.t index 61e56060e81..c60d562bbd7 100644 --- a/tests/bugs/bug-1368312.t +++ b/tests/bugs/bug-1368312.t @@ -82,3 +82,5 @@ EXPECT 0 compare_get_split_brain_status ./tmp1 patchy-client-5 cd - cleanup +#G_TESTDEF_TEST_STATUS_NETBSD7=BAD_TEST,BUG=000000 +#G_TESTDEF_TEST_STATUS_CENTOS6=BAD_TEST,BUG=000000 diff --git a/tests/bugs/bug-1371806.t b/tests/bugs/bug-1371806.t index 7dc1613a4f2..08180525650 100644 --- a/tests/bugs/bug-1371806.t +++ b/tests/bugs/bug-1371806.t @@ -28,6 +28,7 @@ TEST glusterd TEST pidof glusterd TEST $CLI volume create $V0 $H0:$B0/${V0}{0,1,2,3,4,5} TEST $CLI volume start $V0 +EXPECT_WITHIN ${PROCESS_UP_TIMEOUT} "6" online_brick_count TEST glusterfs --volfile-id=$V0 --volfile-server=$H0 --entry-timeout=0 $M0; diff --git a/tests/bugs/bug-1371806_acl.t b/tests/bugs/bug-1371806_acl.t index aa41e04b96f..c39165628cc 100644 --- a/tests/bugs/bug-1371806_acl.t +++ b/tests/bugs/bug-1371806_acl.t @@ -39,6 +39,7 @@ TEST pidof glusterd TEST $CLI volume create $V0 $H0:$B0/${V0}{0,1,2,3,4,5} TEST $CLI volume set $V0 diagnostics.client-log-level DEBUG TEST $CLI volume start $V0 +EXPECT_WITHIN ${PROCESS_UP_TIMEOUT} "6" online_brick_count TEST glusterfs --volfile-id=$V0 --acl --volfile-server=$H0 --entry-timeout=0 $M0; @@ -77,6 +78,10 @@ cd $M0 ## was up at the time of updated xattrs TEST stat ./tmp{1..10} +# Make sure to send a write and read on the file inside mount +echo "helloworld" > ./tmp1/file +TEST cat ./tmp1/file + ## Compare succ value with updated acl attributes count=`getfacl -p $B0/${V0}5/tmp{1..10} | grep -c "user:tmpuser:rw-"` EXPECT "$succ" echo $count @@ -87,4 +92,5 @@ EXPECT "$succ1" echo $count cd - userdel --force tmpuser + cleanup diff --git a/tests/bugs/bug-1584517.t b/tests/bugs/bug-1584517.t new file mode 100644 index 00000000000..7f48015a034 --- /dev/null +++ b/tests/bugs/bug-1584517.t @@ -0,0 +1,70 @@ +#!/bin/bash +. $(dirname $0)/../include.rc +. $(dirname $0)/../volume.rc +. $(dirname $0)/../dht.rc +cleanup; +#This test case verifies attributes (uid/gid/perm) for the +#directory are healed after stop/start brick. To verify the same +#test case change attributes of the directory after down a DHT subvolume +#and one AFR children. After start the volume with force and run lookup +#operation attributes should be healed on started bricks at the backend. + + +TEST glusterd +TEST pidof glusterd +TEST $CLI volume create $V0 replica 3 $H0:$B0/${V0}{0,1,2,3,4,5} +TEST $CLI volume start $V0 +TEST useradd dev -M +TEST groupadd QA + +TEST glusterfs --volfile-id=$V0 --volfile-server=$H0 $M0; + +TEST mkdir $M0/dironedown + +TEST kill_brick $V0 $H0 $B0/${V0}2 +EXPECT_WITHIN ${PROCESS_UP_TIMEOUT} "5" online_brick_count + +TEST kill_brick $V0 $H0 $B0/${V0}3 +EXPECT_WITHIN ${PROCESS_UP_TIMEOUT} "4" online_brick_count + +TEST kill_brick $V0 $H0 $B0/${V0}4 +EXPECT_WITHIN ${PROCESS_UP_TIMEOUT} "3" online_brick_count + +TEST kill_brick $V0 $H0 $B0/${V0}5 +EXPECT_WITHIN ${PROCESS_UP_TIMEOUT} "2" online_brick_count + +TEST chown dev $M0/dironedown +TEST chgrp QA $M0/dironedown +TEST chmod 777 $M0/dironedown + +#store the permissions for comparision +permission_onedown=`ls -l $M0 | grep dironedown | awk '{print $1}'` + +TEST $CLI volume start $V0 force +EXPECT_WITHIN ${PROCESS_UP_TIMEOUT} "6" online_brick_count + +TEST glusterfs --volfile-id=$V0 --volfile-server=$H0 $M0; + +#Run lookup two times to hit revalidate code path in dht +# to heal user attr + +TEST ls $M0/dironedown + +#check attributes those were created post brick going down +TEST brick_perm=`ls -l $B0/${V0}3 | grep dironedown | awk '{print $1}'` +TEST echo $brick_perm +TEST [ ${brick_perm} = ${permission_onedown} ] +uid=`ls -l $B0/${V0}3 | grep dironedown | awk '{print $3}'` +TEST echo $uid +TEST [ $uid = dev ] +gid=`ls -l $B0/${V0}3 | grep dironedown | awk '{print $4}'` +TEST echo $gid +TEST [ $gid = QA ] + +TEST umount $M0 +userdel --force dev +groupdel QA + +cleanup +exit + diff --git a/tests/bugs/bug-1620580.t b/tests/bugs/bug-1620580.t new file mode 100644 index 00000000000..0c74d4a6089 --- /dev/null +++ b/tests/bugs/bug-1620580.t @@ -0,0 +1,67 @@ +#!/bin/bash + +. $(dirname $0)/../include.rc +. $(dirname $0)/../volume.rc + +cleanup; + +## Start glusterd +TEST glusterd; +TEST pidof glusterd; +TEST $CLI volume info; + +## Lets create volume +TEST $CLI volume create $V0 $H0:$B0/${V0}{1,2}; + +## Verify volume is created +EXPECT "$V0" volinfo_field $V0 'Volume Name'; +EXPECT 'Created' volinfo_field $V0 'Status'; +## Start volume and verify +TEST $CLI volume start $V0; +EXPECT 'Started' volinfo_field $V0 'Status'; +TEST glusterfs -s $H0 --volfile-id=$V0 $M0 + +#do some operation on mount, so that kill_brick is guaranteed to be +#done _after_ first lookup on root + +TEST ls $M0 +TEST touch $M0/file + +TEST $CLI volume stop $V0 +TEST $CLI volume delete $V0 + +# Case of Same volume name, but different bricks +TEST $CLI volume create $V0 replica 2 $H0:$B0/${V0}{3,4}; +TEST $CLI volume start $V0; + +# Give time for 'reconnect' to happen +sleep 4 + +TEST ! ls $M0 +TEST ! touch $M0/file1 + +# Case of Same brick, but different volume (ie, recreated). +TEST $CLI volume create $V1 $H0:$B0/${V0}{1,2}; +TEST $CLI volume start $V1; + +# Give time for 'reconnect' to happen +sleep 4 +TEST ! ls $M0 +TEST ! touch $M0/file2 + +TEST $CLI volume stop $V0 +TEST $CLI volume delete $V0 +TEST $CLI volume stop $V1 +TEST $CLI volume delete $V1 + +# Case of Same brick, but different volume (but same volume name) +TEST $CLI volume create $V0 $H0:$B0/${V0}{1,2} +TEST $CLI volume start $V0; + +# Give time for 'reconnect' to happen +sleep 4 +TEST ! ls $M0 +TEST ! touch $M0/file3 + + +cleanup diff --git a/tests/bugs/bug-1694920.t b/tests/bugs/bug-1694920.t new file mode 100644 index 00000000000..5bf93c92f94 --- /dev/null +++ b/tests/bugs/bug-1694920.t @@ -0,0 +1,63 @@ +#!/bin/bash + +SCRIPT_TIMEOUT=300 + +. $(dirname $0)/../include.rc +. $(dirname $0)/../volume.rc +. $(dirname $0)/../fileio.rc +cleanup; + +TEST glusterd; +TEST pidof glusterd + +TEST $CLI volume create $V0 $H0:$B0/${V0}; +TEST $CLI volume set $V0 performance.quick-read off +TEST $CLI volume set $V0 performance.io-cache off +TEST $CLI volume set $V0 performance.write-behind off +TEST $CLI volume set $V0 performance.open-behind off +TEST $CLI volume set $V0 performance.stat-prefetch off +TEST $CLI volume set $V0 performance.read-ahead off +TEST $CLI volume start $V0 +TEST $GFS -s $H0 --volfile-id=$V0 $M0; + +TEST touch $M0/a + +#When all bricks are up, lock and unlock should succeed +TEST fd1=`fd_available` +TEST fd_open $fd1 'w' $M0/a +TEST flock -x $fd1 +TEST fd_close $fd1 + +#When all bricks are down, lock/unlock should fail +TEST fd1=`fd_available` +TEST fd_open $fd1 'w' $M0/a +TEST $CLI volume stop $V0 +TEST ! flock -x $fd1 +TEST $CLI volume start $V0 +EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" client_connected_status_meta $M0 $V0-client-0 +TEST fd_close $fd1 + +#When a brick goes down and comes back up operations on fd which had locks on it should succeed by default +TEST fd1=`fd_available` +TEST fd_open $fd1 'w' $M0/a +TEST flock -x $fd1 +TEST $CLI volume stop $V0 +sleep 2 +TEST $CLI volume start $V0 +EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" client_connected_status_meta $M0 $V0-client-0 +TEST fd_write $fd1 "data" +TEST fd_close $fd1 + +#When a brick goes down and comes back up operations on fd which had locks on it should fail when client.strict-locks is on +TEST $CLI volume set $V0 client.strict-locks on +TEST fd1=`fd_available` +TEST fd_open $fd1 'w' $M0/a +TEST flock -x $fd1 +TEST $CLI volume stop $V0 +sleep 2 +TEST $CLI volume start $V0 +EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" client_connected_status_meta $M0 $V0-client-0 +TEST ! fd_write $fd1 "data" +TEST fd_close $fd1 + +cleanup diff --git a/tests/bugs/bug-1702299.t b/tests/bugs/bug-1702299.t new file mode 100644 index 00000000000..1cff2ed5d3d --- /dev/null +++ b/tests/bugs/bug-1702299.t @@ -0,0 +1,67 @@ +#!/bin/bash +. $(dirname $0)/../include.rc +. $(dirname $0)/../volume.rc +. $(dirname $0)/../dht.rc +cleanup; + +function get_getfattr { + local path=$1 + echo `getfattr -n user.foo $path` | cut -f2 -d"=" | sed -e 's/^"//' -e 's/"$//' +} + +function set_fattr { + for i in `seq 1 10` + do + setfattr -n user.foo -v "newabc" ./tmp${i} + if [ "$?" = "0" ] + then + succ=$((succ+1)) + else + fail=$((fail+1)) + fi + done +} + + + +TEST glusterd +TEST pidof glusterd +TEST $CLI volume create $V0 $H0:$B0/${V0}{0,1,2,3} +TEST $CLI volume start $V0 + +TEST glusterfs --volfile-id=$V0 --volfile-server=$H0 --entry-timeout=0 --attribute-timeout=0 $M0; + +cd $M0 +TEST mkdir tmp{1..10} + +succ=fail=0 +## set user.foo xattr with value newabc after kill one brick +set_fattr +count=10 +EXPECT "$succ" echo $count +count=0 +EXPECT "$fail" echo $count + +cd - + +# Add-brick +TEST $CLI volume add-brick $V0 $H0:$B0/${V0}{4,5} + +cd $M0 +## At this point dht code will heal xattr on down brick only for those dirs +## hashed subvol was up at the time of update xattr +TEST stat ./tmp{1..10} + + +## Count the user.foo xattr value with newabc on brick and compare with succ value +count=`getfattr -n user.foo $B0/${V0}4/tmp{1..10} | grep "user.foo" | grep -iw "newabc" | wc -l` +EXPECT "$succ" echo $count + +## Count the user.foo xattr value with newabc on brick and compare with succ value +count=`getfattr -n user.foo $B0/${V0}5/tmp{1..10} | grep "user.foo" | grep -iw "newabc" | wc -l` +EXPECT "$succ" echo $count + + +cd - +TEST umount $M0 +cleanup diff --git a/tests/bugs/cli/bug-1169302.c b/tests/bugs/cli/bug-1169302.c index aa9f950abf2..7c6b5fbf856 100644 --- a/tests/bugs/cli/bug-1169302.c +++ b/tests/bugs/cli/bug-1169302.c @@ -7,72 +7,73 @@ int keep_running = 1; -void stop_running(int sig) +void +stop_running(int sig) { - if (sig == SIGTERM) - keep_running = 0; + if (sig == SIGTERM) + keep_running = 0; } int -main (int argc, char *argv[]) +main(int argc, char *argv[]) { - glfs_t *fs = NULL; - int ret = 0; - glfs_fd_t *fd = NULL; - char *filename = NULL; - char *logfile = NULL; - char *host = NULL; - - if (argc != 5) { - return -1; - } - - host = argv[2]; - logfile = argv[3]; - filename = argv[4]; - - /* setup signal handler for exiting */ - signal (SIGTERM, stop_running); - - fs = glfs_new (argv[1]); - if (!fs) { - return -1; - } - - ret = glfs_set_volfile_server (fs, "tcp", host, 24007); - if (ret < 0) { - return -1; - } - - ret = glfs_set_logging (fs, logfile, 7); - if (ret < 0) { - return -1; - } - - ret = glfs_init (fs); - if (ret < 0) { - return -1; - } - - fd = glfs_creat (fs, filename, O_RDWR, 0644); - if (!fd) { - return -1; - } - - /* sleep until SIGTERM has been received */ - while (keep_running) { - sleep (1); - } - - ret = glfs_close (fd); - if (ret < 0) { - return -1; - } - - ret = glfs_fini (fs); - if (ret < 0) { - return -1; - } - - return 0; + glfs_t *fs = NULL; + int ret = 0; + glfs_fd_t *fd = NULL; + char *filename = NULL; + char *logfile = NULL; + char *host = NULL; + + if (argc != 5) { + return -1; + } + + host = argv[2]; + logfile = argv[3]; + filename = argv[4]; + + /* setup signal handler for exiting */ + signal(SIGTERM, stop_running); + + fs = glfs_new(argv[1]); + if (!fs) { + return -1; + } + + ret = glfs_set_volfile_server(fs, "tcp", host, 24007); + if (ret < 0) { + return -1; + } + + ret = glfs_set_logging(fs, logfile, 7); + if (ret < 0) { + return -1; + } + + ret = glfs_init(fs); + if (ret < 0) { + return -1; + } + + fd = glfs_creat(fs, filename, O_RDWR, 0644); + if (!fd) { + return -1; + } + + /* sleep until SIGTERM has been received */ + while (keep_running) { + sleep(1); + } + + ret = glfs_close(fd); + if (ret < 0) { + return -1; + } + + ret = glfs_fini(fs); + if (ret < 0) { + return -1; + } + + return 0; } diff --git a/tests/bugs/cli/bug-1169302.t b/tests/bugs/cli/bug-1169302.t index 0bdaf56307e..19660e033a8 100755 --- a/tests/bugs/cli/bug-1169302.t +++ b/tests/bugs/cli/bug-1169302.t @@ -20,6 +20,9 @@ TEST $CLI_1 volume create $V0 $H1:$B1/$V0 $H2:$B2/$V0 $H3:$B3/$V0 TEST $CLI_1 volume start $V0 # test CLI parameter acceptance +TEST $CLI_1 volume statedump $V0 +TEST $CLI_2 volume statedump $V0 +TEST $CLI_3 volume statedump $V0 TEST ! $CLI_1 volume statedump $V0 client $H2:0 TEST ! $CLI_2 volume statedump $V0 client $H2:-1 TEST $CLI_3 volume statedump $V0 client $H2:765 diff --git a/tests/bugs/cli/bug-1320388.t b/tests/bugs/cli/bug-1320388.t index f5ffcbe082a..e719fc59033 100755 --- a/tests/bugs/cli/bug-1320388.t +++ b/tests/bugs/cli/bug-1320388.t @@ -21,7 +21,7 @@ cleanup; rm -f $SSL_BASE/glusterfs.* touch "$GLUSTERD_WORKDIR"/secure-access -TEST openssl genrsa -out $SSL_KEY 1024 +TEST openssl genrsa -out $SSL_KEY 2048 TEST openssl req -new -x509 -key $SSL_KEY -subj /CN=Anyone -out $SSL_CERT ln $SSL_CERT $SSL_CA diff --git a/tests/bugs/cli/bug-1353156-get-state-cli-validations.t b/tests/bugs/cli/bug-1353156-get-state-cli-validations.t index c9c06cc6567..a4556c9c997 100644 --- a/tests/bugs/cli/bug-1353156-get-state-cli-validations.t +++ b/tests/bugs/cli/bug-1353156-get-state-cli-validations.t @@ -43,7 +43,6 @@ push_trapfunc rm -rf $ODIR TEST $CLI volume create $V0 disperse $H0:$B0/b1 $H0:$B0/b2 $H0:$B0/b3 TEST $CLI volume start $V0 -TEST $CLI volume tier $V0 attach replica 2 $H0:$B1/b4 $H0:$B1/b5 TEST setup_lvm 1 TEST $CLI volume create $V1 $H0:$L1; diff --git a/tests/bugs/cli/bug-1378842-volume-get-all.t b/tests/bugs/cli/bug-1378842-volume-get-all.t index c798ce5ceff..be41f25b000 100644 --- a/tests/bugs/cli/bug-1378842-volume-get-all.t +++ b/tests/bugs/cli/bug-1378842-volume-get-all.t @@ -12,9 +12,6 @@ TEST $CLI volume set all server-quorum-ratio 80 # Execute volume get without having an explicit option, this should fail TEST ! $CLI volume get all -# Also volume get on an option not applicable for all volumes should fail -TEST ! $CLI volume get all cluster.tier-mode - # Execute volume get with an explicit global option TEST $CLI volume get all server-quorum-ratio EXPECT '80' volume_get_field all 'cluster.server-quorum-ratio' diff --git a/tests/bugs/cli/bug-770655.t b/tests/bugs/cli/bug-770655.t deleted file mode 100755 index 4e0b20d62da..00000000000 --- a/tests/bugs/cli/bug-770655.t +++ /dev/null @@ -1,168 +0,0 @@ -#!/bin/bash - -. $(dirname $0)/../../include.rc -. $(dirname $0)/../../volume.rc - -cleanup; - -## Start and create a distribute-replicate volume -TEST glusterd; -TEST pidof glusterd; -TEST $CLI volume create $V0 replica 2 $H0:$B0/${V0}{1,2,3,4,5,6,7,8}; - -## Verify volume is created -EXPECT "$V0" volinfo_field $V0 'Volume Name'; -EXPECT 'Created' volinfo_field $V0 'Status'; -EXPECT 'Distributed-Replicate' volinfo_field $V0 'Type'; - -## Start volume and verify -TEST $CLI volume start $V0; -EXPECT 'Started' volinfo_field $V0 'Status'; - -## Setting stripe-block-size as 10MB -TEST ! $CLI volume set $V0 stripe-block-size 10MB -EXPECT '' volinfo_field $V0 'cluster.stripe-block-size'; - -## Finish up -TEST $CLI volume stop $V0; -EXPECT 'Stopped' volinfo_field $V0 'Status'; - -TEST $CLI volume delete $V0; -TEST ! $CLI volume info $V0; - -cleanup; - -## Start and create a replicate volume -TEST glusterd; -TEST pidof glusterd; -TEST $CLI volume create $V0 replica 8 $H0:$B0/${V0}{1,2,3,4,5,6,7,8}; - -## Verify volume is created -EXPECT "$V0" volinfo_field $V0 'Volume Name'; -EXPECT 'Created' volinfo_field $V0 'Status'; -EXPECT 'Replicate' volinfo_field $V0 'Type'; - -## Start volume and verify -TEST $CLI volume start $V0; -EXPECT 'Started' volinfo_field $V0 'Status'; - -## Setting stripe-block-size as 10MB -TEST ! $CLI volume set $V0 stripe-block-size 10MB -EXPECT '' volinfo_field $V0 'cluster.stripe-block-size'; - -## Finish up -TEST $CLI volume stop $V0; -EXPECT 'Stopped' volinfo_field $V0 'Status'; - -TEST $CLI volume delete $V0; -TEST ! $CLI volume info $V0; - -cleanup; - -## Start and create a distribute volume -TEST glusterd; -TEST pidof glusterd; -TEST $CLI volume create $V0 $H0:$B0/${V0}{1,2,3,4,5,6,7,8}; - -## Verify volume is created -EXPECT "$V0" volinfo_field $V0 'Volume Name'; -EXPECT 'Created' volinfo_field $V0 'Status'; -EXPECT 'Distribute' volinfo_field $V0 'Type'; - -## Start volume and verify -TEST $CLI volume start $V0; -EXPECT 'Started' volinfo_field $V0 'Status'; - -## Setting stripe-block-size as 10MB -TEST ! $CLI volume set $V0 stripe-block-size 10MB -EXPECT '' volinfo_field $V0 'cluster.stripe-block-size'; - -## Finish up -TEST $CLI volume stop $V0; -EXPECT 'Stopped' volinfo_field $V0 'Status'; - -TEST $CLI volume delete $V0; -TEST ! $CLI volume info $V0; - -cleanup; - -## Start and create a stripe volume -TEST glusterd; -TEST pidof glusterd; -TEST $CLI volume create $V0 stripe 8 $H0:$B0/${V0}{1,2,3,4,5,6,7,8}; - -## Verify volume is created -EXPECT "$V0" volinfo_field $V0 'Volume Name'; -EXPECT 'Created' volinfo_field $V0 'Status'; -EXPECT 'Stripe' volinfo_field $V0 'Type'; - -## Start volume and verify -TEST $CLI volume start $V0; -EXPECT 'Started' volinfo_field $V0 'Status'; - -## Setting stripe-block-size as 10MB -TEST $CLI volume set $V0 stripe-block-size 10MB -EXPECT '10MB' volinfo_field $V0 'cluster.stripe-block-size'; - -## Finish up -TEST $CLI volume stop $V0; -EXPECT 'Stopped' volinfo_field $V0 'Status'; - -TEST $CLI volume delete $V0; -TEST ! $CLI volume info $V0; - -cleanup; - -## Start and create a distributed stripe volume -TEST glusterd; -TEST pidof glusterd; -TEST $CLI volume create $V0 stripe 4 $H0:$B0/${V0}{1,2,3,4,5,6,7,8}; - -## Verify volume is created -EXPECT "$V0" volinfo_field $V0 'Volume Name'; -EXPECT 'Created' volinfo_field $V0 'Status'; -EXPECT 'Distributed-Stripe' volinfo_field $V0 'Type'; - -## Start volume and verify -TEST $CLI volume start $V0; -EXPECT 'Started' volinfo_field $V0 'Status'; - -## Setting stripe-block-size as 10MB -TEST $CLI volume set $V0 stripe-block-size 10MB -EXPECT '10MB' volinfo_field $V0 'cluster.stripe-block-size'; - -## Finish up -TEST $CLI volume stop $V0; -EXPECT 'Stopped' volinfo_field $V0 'Status'; - -TEST $CLI volume delete $V0; -TEST ! $CLI volume info $V0; - -cleanup; - -## Start and create a distributed stripe replicate volume -TEST glusterd; -TEST pidof glusterd; -TEST $CLI volume create $V0 stripe 2 replica 2 $H0:$B0/${V0}{1,2,3,4,5,6,7,8}; - -## Verify volume is created -EXPECT "$V0" volinfo_field $V0 'Volume Name'; -EXPECT 'Created' volinfo_field $V0 'Status'; -EXPECT 'Distributed-Striped-Replicate' volinfo_field $V0 'Type'; - -## Start volume and verify -TEST $CLI volume start $V0; -EXPECT 'Started' volinfo_field $V0 'Status'; - -## Setting stripe-block-size as 10MB -TEST $CLI volume set $V0 stripe-block-size 10MB -EXPECT '10MB' volinfo_field $V0 'cluster.stripe-block-size'; - -## Finish up -TEST $CLI volume stop $V0; -EXPECT 'Stopped' volinfo_field $V0 'Status'; - -TEST $CLI volume delete $V0; -TEST ! $CLI volume info $V0; - -cleanup; diff --git a/tests/bugs/cli/bug-822830.t b/tests/bugs/cli/bug-822830.t index b66aa4f8981..a9904854110 100755 --- a/tests/bugs/cli/bug-822830.t +++ b/tests/bugs/cli/bug-822830.t @@ -8,7 +8,7 @@ cleanup; ## Start and create a volume TEST glusterd; TEST pidof glusterd; -TEST $CLI volume create $V0 replica 2 stripe 2 $H0:$B0/${V0}{1,2,3,4,5,6,7,8}; +TEST $CLI volume create $V0 replica 3 $H0:$B0/${V0}{1,2,3,4,5,6}; ## Verify volume is is created EXPECT "$V0" volinfo_field $V0 'Volume Name'; diff --git a/tests/bugs/cli/bug-983317-volume-get.t b/tests/bugs/cli/bug-983317-volume-get.t index 8f09d588565..c793bbc9f0c 100644 --- a/tests/bugs/cli/bug-983317-volume-get.t +++ b/tests/bugs/cli/bug-983317-volume-get.t @@ -7,7 +7,8 @@ cleanup; TEST glusterd TEST pidof glusterd -TEST $CLI volume create $V0 $H0:$B0/$V0 +TEST $CLI volume create $V0 $H0:$B0/${V0}{1,2}; +EXPECT 'Created' volinfo_field $V0 'Status'; # Set a volume option TEST $CLI volume set $V0 open-behind on @@ -32,3 +33,13 @@ EXPECT '80' volume_get_field $V0 'server-quorum-ratio' # Check user.* options can also be retrived using volume get EXPECT 'dummy' volume_get_field $V0 'user.metadata' + +TEST $CLI volume set all brick-multiplex enable +EXPECT 'enable' volume_get_field $V0 'brick-multiplex' + +TEST $CLI volume set all brick-multiplex disable +EXPECT 'disable' volume_get_field $V0 'brick-multiplex' + +#setting an cluster level option for single volume should fail +TEST ! $CLI volume set $V0 brick-multiplex enable + diff --git a/tests/bugs/core/brick-mux-fd-cleanup.t b/tests/bugs/core/brick-mux-fd-cleanup.t new file mode 100644 index 00000000000..de11c177b8a --- /dev/null +++ b/tests/bugs/core/brick-mux-fd-cleanup.t @@ -0,0 +1,78 @@ +#!/bin/bash + +. $(dirname $0)/../../include.rc +. $(dirname $0)/../../volume.rc + +#This .t tests that the fds from client are closed on brick when gluster volume +#stop is executed in brick-mux setup. + +cleanup; +TEST glusterd +TEST pidof glusterd + +function keep_fd_open { +#This function has to be run as background job because opening the fd in +#foreground and running commands is leading to flush calls on these fds +#which is making it very difficult to create the race where fds will be left +#open even after the brick dies. + exec 5>$M1/a + exec 6>$M1/b + while [ -f $M0/a ]; do sleep 1; done +} + +function count_open_files { + local brick_pid="$1" + local pattern="$2" + ls -l /proc/$brick_pid/fd | grep -i "$pattern" | wc -l +} + +TEST $CLI volume set all cluster.brick-multiplex on +TEST $CLI volume create $V0 replica 2 $H0:$B0/${V0}{0,1} +TEST $CLI volume create $V1 replica 2 $H0:$B0/${V1}{2,3} +#Have same configuration on both bricks so that they are multiplexed +#Delay flush fop for a second +TEST $CLI volume heal $V0 disable +TEST $CLI volume heal $V1 disable +TEST $CLI volume set $V0 delay-gen posix +TEST $CLI volume set $V0 delay-gen.enable flush +TEST $CLI volume set $V0 delay-gen.delay-percentage 100 +TEST $CLI volume set $V0 delay-gen.delay-duration 1000000 +TEST $CLI volume set $V1 delay-gen posix +TEST $CLI volume set $V1 delay-gen.enable flush +TEST $CLI volume set $V1 delay-gen.delay-percentage 100 +TEST $CLI volume set $V1 delay-gen.delay-duration 1000000 + +TEST $CLI volume start $V0 +TEST $CLI volume start $V1 + +TEST $GFS -s $H0 --volfile-id=$V0 --direct-io-mode=enable $M0 +TEST $GFS -s $H0 --volfile-id=$V1 --direct-io-mode=enable $M1 + +TEST touch $M0/a +keep_fd_open & +TEST $CLI volume profile $V1 start +brick_pid=$(get_brick_pid $V1 $H0 $B0/${V1}2) +TEST count_open_files $brick_pid "$B0/${V1}2/a" +TEST count_open_files $brick_pid "$B0/${V1}2/b" +TEST count_open_files $brick_pid "$B0/${V1}3/a" +TEST count_open_files $brick_pid "$B0/${V1}3/b" + +#If any other flush fops are introduced into the system other than the one at +#cleanup it interferes with the race, so test for it +EXPECT "^0$" echo "$($CLI volume profile $V1 info incremental | grep -i flush | wc -l)" +#Stop the volume +TEST $CLI volume stop $V1 + +#Wait for cleanup resources or volume V1 +EXPECT_WITHIN $GRAPH_SWITCH_TIMEOUT "^0$" count_open_files $brick_pid "$B0/${V1}2/a" +EXPECT_WITHIN $GRAPH_SWITCH_TIMEOUT "^0$" count_open_files $brick_pid "$B0/${V1}2/b" +EXPECT_WITHIN $GRAPH_SWITCH_TIMEOUT "^0$" count_open_files $brick_pid "$B0/${V1}3/a" +EXPECT_WITHIN $GRAPH_SWITCH_TIMEOUT "^0$" count_open_files $brick_pid "$B0/${V1}3/b" + +TEST rm -f $M0/a #Exit keep_fd_open() +wait + +EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0 +EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M1 + +cleanup diff --git a/tests/bugs/core/bug-1402841.t-mt-dir-scan-race.t b/tests/bugs/core/bug-1402841.t-mt-dir-scan-race.t index 6351ba22511..a1b9a851bf7 100755 --- a/tests/bugs/core/bug-1402841.t-mt-dir-scan-race.t +++ b/tests/bugs/core/bug-1402841.t-mt-dir-scan-race.t @@ -3,6 +3,8 @@ . $(dirname $0)/../../volume.rc cleanup; +FILE_COUNT=500 + TEST glusterd TEST pidof glusterd TEST $CLI volume create $V0 replica 2 $H0:$B0/${V0}{0,1} @@ -11,15 +13,14 @@ TEST $CLI volume set $V0 cluster.shd-wait-qlength 100 TEST $CLI volume start $V0 TEST glusterfs --volfile-id=$V0 --volfile-server=$H0 $M0; -touch $M0/file{1..200} - +for i in `seq 1 $FILE_COUNT`; do touch $M0/file$i; done TEST kill_brick $V0 $H0 $B0/${V0}1 -for i in {1..200}; do echo hello>$M0/file$i; done +for i in `seq 1 $FILE_COUNT`; do echo hello>$M0/file$i; chmod -x $M0/file$i; done TEST $CLI volume start $V0 force EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status $V0 $H0 $B0/${V0}1 EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 1 -EXPECT "200" get_pending_heal_count $V0 +EXPECT "$FILE_COUNT" get_pending_heal_count $V0 TEST $CLI volume set $V0 self-heal-daemon on EXPECT_WITHIN $PROCESS_UP_TIMEOUT "Y" glustershd_up_status diff --git a/tests/bugs/core/bug-1432542-mpx-restart-crash.t b/tests/bugs/core/bug-1432542-mpx-restart-crash.t index 7f61c950fb7..2793d7008e1 100644 --- a/tests/bugs/core/bug-1432542-mpx-restart-crash.t +++ b/tests/bugs/core/bug-1432542-mpx-restart-crash.t @@ -1,12 +1,14 @@ #!/bin/bash -SCRIPT_TIMEOUT=400 +SCRIPT_TIMEOUT=800 . $(dirname $0)/../../include.rc . $(dirname $0)/../../volume.rc . $(dirname $0)/../../traps.rc -NUM_VOLS=20 +cleanup; + +NUM_VOLS=15 MOUNT_BASE=$(dirname $M0) # GlusterD reports that bricks are started when in fact their attach requests @@ -40,7 +42,7 @@ create_volume () { local vol_name=$(printf "%s-vol%02d" $V0 $1) local brick_base=$(get_brick_base $1) - local cmd="$CLI volume create $vol_name replica 2" + local cmd="$CLI volume create $vol_name replica 3" local b for b in $(seq 0 5); do local this_brick=${brick_base}/brick$b @@ -50,7 +52,7 @@ create_volume () { TEST $cmd TEST $CLI volume start $vol_name # check for 6 bricks and 1 shd daemon to be up and running - EXPECT_WITHIN $PROCESS_UP_TIMEOUT 7 count_up_bricks $vol_name + EXPECT_WITHIN 120 7 count_up_bricks $vol_name local mount_point=$(get_mount_point $1) mkdir -p $mount_point TEST $GFS -s $H0 --volfile-id=$vol_name $mount_point @@ -77,12 +79,27 @@ TEST $CLI volume set all cluster.brick-multiplex on # Our infrastructure can't handle an arithmetic expression here. The formula # is (NUM_VOLS-1)*5 because it sees each TEST/EXPECT once but needs the other # NUM_VOLS-1 and there are 5 such statements in each iteration. -TESTS_EXPECTED_IN_LOOP=95 +TESTS_EXPECTED_IN_LOOP=84 for i in $(seq 1 $NUM_VOLS); do + starttime="$(date +%s)"; + create_volume $i TEST dd if=/dev/zero of=$(get_mount_point $i)/a_file bs=4k count=1 + # Unmounting to reduce memory footprint on regression hosts + mnt_point=$(get_mount_point $i) + EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $mnt_point + endtime=$(expr $(date +%s) - $starttime) + + echo "Memory Used after $i volumes : $(pmap -x $(pgrep glusterfsd) | grep total)" + echo "Thread Count after $i volumes: $(ps -T -p $(pgrep glusterfsd) | wc -l)" + echo "Time taken : ${endtime} seconds" done +echo "==========" +echo "List of all the threads in the Brick process" +ps -T -p $(pgrep glusterfsd) +echo "==========" + # Kill glusterd, and wait a bit for all traces to disappear. TEST killall -9 glusterd sleep 5 diff --git a/tests/bugs/core/bug-1650403.t b/tests/bugs/core/bug-1650403.t new file mode 100644 index 00000000000..43d09bc8bd9 --- /dev/null +++ b/tests/bugs/core/bug-1650403.t @@ -0,0 +1,113 @@ +#!/bin/bash + +SCRIPT_TIMEOUT=500 + +. $(dirname $0)/../../include.rc +. $(dirname $0)/../../volume.rc +. $(dirname $0)/../../traps.rc + +cleanup; + +NUM_VOLS=5 +MOUNT_BASE=$(dirname $M0) + +# GlusterD reports that bricks are started when in fact their attach requests +# might still need to be retried. That's a bit of a hack, but there's no +# feasible way to wait at that point (in attach_brick) and the rest of the +# code is unprepared to deal with transient errors so the whole "brick start" +# would fail. Meanwhile, glusterfsd can only handle attach requests at a +# rather slow rate. After GlusterD tries to start a couple of hundred bricks, +# glusterfsd can fall behind and we start getting mount failures. Arguably, +# those are spurious because we will eventually catch up. We're just not +# ready *yet*. More to the point, even if the errors aren't spurious that's +# not what we're testing right now. Therefore, we give glusterfsd a bit more +# breathing room for this test than we would otherwise. +MOUNT_TIMEOUT=15 + +get_brick_base () { + printf "%s/vol%02d" $B0 $1 +} + +get_mount_point () { + printf "%s/vol%02d" $MOUNT_BASE $1 +} + +function count_up_bricks { + vol=$1; + $CLI --xml volume status $vol | grep '<status>1' | wc -l +} + +create_volume () { + + local vol_name=$(printf "%s-vol%02d" $V0 $1) + + local brick_base=$(get_brick_base $1) + local cmd="$CLI volume create $vol_name replica 3" + local b + for b in $(seq 0 5); do + local this_brick=${brick_base}/brick$b + mkdir -p $this_brick + cmd="$cmd $H0:$this_brick" + done + TEST $cmd + TEST $CLI volume start $vol_name + # check for 6 bricks and 1 shd daemon to be up and running + EXPECT_WITHIN 120 7 count_up_bricks $vol_name + local mount_point=$(get_mount_point $1) + mkdir -p $mount_point + TEST $GFS -s $H0 --volfile-id=$vol_name $mount_point +} + +cleanup_func () { + local v + for v in $(seq 1 $NUM_VOLS); do + local mount_point=$(get_mount_point $v) + force_umount $mount_point + rm -rf $mount_point + local vol_name=$(printf "%s-vol%02d" $V0 $v) + $CLI volume stop $vol_name + $CLI volume delete $vol_name + rm -rf $(get_brick_base $1) & + done &> /dev/null + wait +} +push_trapfunc cleanup_func + +TEST glusterd +TEST $CLI volume set all cluster.brick-multiplex on + +# Our infrastructure can't handle an arithmetic expression here. The formula +# is (NUM_VOLS-1)*5 because it sees each TEST/EXPECT once but needs the other +# NUM_VOLS-1 and there are 5 such statements in each iteration. +TESTS_EXPECTED_IN_LOOP=24 +for i in $(seq 1 $NUM_VOLS); do + create_volume $i + TEST dd if=/dev/zero of=$(get_mount_point $i)/a_file bs=4k count=1 + # Unmounting to reduce memory footprint on regression hosts + mnt_point=$(get_mount_point $i) + EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $mnt_point +done + +glustershd_pid=`ps auxwww | grep glustershd | grep -v grep | awk -F " " '{print $2}'` +TEST [ $glustershd_pid != 0 ] +start=`pmap -x $glustershd_pid | grep total | awk -F " " '{print $4}'` +echo "Memory consumption for glustershd process" +for i in $(seq 1 50); do + pmap -x $glustershd_pid | grep total + for j in $(seq 1 $NUM_VOLS); do + vol_name=$(printf "%s-vol%02d" $V0 $j) + gluster v set $vol_name cluster.self-heal-daemon off > /dev/null + gluster v set $vol_name cluster.self-heal-daemon on > /dev/null + done +done + +end=`pmap -x $glustershd_pid | grep total | awk -F " " '{print $4}'` +diff=$((end-start)) + +# If memory consumption is more than 10M it means some leak in reconfigure +# code path + +TEST [ $diff -lt 10000 ] + +trap - EXIT +cleanup diff --git a/tests/bugs/core/bug-1699025-brick-mux-detach-brick-fd-issue.t b/tests/bugs/core/bug-1699025-brick-mux-detach-brick-fd-issue.t new file mode 100644 index 00000000000..1acbaa8dc0b --- /dev/null +++ b/tests/bugs/core/bug-1699025-brick-mux-detach-brick-fd-issue.t @@ -0,0 +1,33 @@ +#!/bin/bash + +. $(dirname $0)/../../include.rc +. $(dirname $0)/../../volume.rc +. $(dirname $0)/../../cluster.rc + +function count_brick_processes { + pgrep glusterfsd | wc -l +} + +cleanup + +#bug-1444596 - validating brick mux + +TEST glusterd +TEST $CLI volume create $V0 $H0:$B0/brick{0,1} +TEST $CLI volume create $V1 $H0:$B0/brick{2,3} + +TEST $CLI volume set all cluster.brick-multiplex on + +TEST $CLI volume start $V0 +TEST $CLI volume start $V1 +EXPECT_WITHIN $PROCESS_UP_TIMEOUT 4 online_brick_count +EXPECT 1 count_brick_processes + +TEST $CLI volume stop $V1 +# At the time initialize brick daemon it always keeps open +# standard fd's (0, 1 , 2) so after stop 1 volume fd's should +# be open +nofds=$(ls -lrth /proc/`pgrep glusterfsd`/fd | grep dev/null | wc -l) +TEST [ $((nofds)) -eq 3 ] + +cleanup diff --git a/tests/bugs/core/bug-834465.c b/tests/bugs/core/bug-834465.c index 61d3deac077..33dd270b112 100644 --- a/tests/bugs/core/bug-834465.c +++ b/tests/bugs/core/bug-834465.c @@ -7,55 +7,54 @@ #include <fcntl.h> int -main (int argc, char *argv[]) +main(int argc, char *argv[]) { - int fd = -1; - char *filename = NULL; - struct flock lock = {0, }; - int i = 0; - int ret = -1; - - if (argc != 2) { - fprintf (stderr, "Usage: %s <filename> ", argv[0]); - goto out; + int fd = -1; + char *filename = NULL; + struct flock lock = { + 0, + }; + int i = 0; + int ret = -1; + + if (argc != 2) { + fprintf(stderr, "Usage: %s <filename> ", argv[0]); + goto out; + } + + filename = argv[1]; + + fd = open(filename, O_RDWR | O_CREAT, 0); + if (fd < 0) { + fprintf(stderr, "open (%s) failed (%s)\n", filename, strerror(errno)); + goto out; + } + + lock.l_type = F_WRLCK; + lock.l_whence = SEEK_SET; + lock.l_start = 1; + lock.l_len = 1; + + while (i < 100) { + lock.l_type = F_WRLCK; + ret = fcntl(fd, F_SETLK, &lock); + if (ret < 0) { + fprintf(stderr, "fcntl setlk failed (%s)\n", strerror(errno)); + goto out; } - filename = argv[1]; - - fd = open (filename, O_RDWR | O_CREAT, 0); - if (fd < 0) { - fprintf (stderr, "open (%s) failed (%s)\n", filename, - strerror (errno)); - goto out; + lock.l_type = F_UNLCK; + ret = fcntl(fd, F_SETLK, &lock); + if (ret < 0) { + fprintf(stderr, "fcntl setlk failed (%s)\n", strerror(errno)); + goto out; } - lock.l_type = F_WRLCK; - lock.l_whence = SEEK_SET; - lock.l_start = 1; - lock.l_len = 1; - - while (i < 100) { - lock.l_type = F_WRLCK; - ret = fcntl (fd, F_SETLK, &lock); - if (ret < 0) { - fprintf (stderr, "fcntl setlk failed (%s)\n", - strerror (errno)); - goto out; - } - - lock.l_type = F_UNLCK; - ret = fcntl (fd, F_SETLK, &lock); - if (ret < 0) { - fprintf (stderr, "fcntl setlk failed (%s)\n", - strerror (errno)); - goto out; - } - - i++; - } + i++; + } - ret = 0; + ret = 0; out: - return ret; + return ret; } diff --git a/tests/bugs/core/bug-927616.t b/tests/bugs/core/bug-927616.t index 6bb64743183..18257131ac7 100755 --- a/tests/bugs/core/bug-927616.t +++ b/tests/bugs/core/bug-927616.t @@ -3,6 +3,8 @@ . $(dirname $0)/../../include.rc . $(dirname $0)/../../nfs.rc +#G_TESTDEF_TEST_STATUS_CENTOS6=NFS_TEST + cleanup; TEST glusterd diff --git a/tests/bugs/core/io-stats-1322825.t b/tests/bugs/core/io-stats-1322825.t index d232ecb2420..53f2d040daa 100755 --- a/tests/bugs/core/io-stats-1322825.t +++ b/tests/bugs/core/io-stats-1322825.t @@ -23,7 +23,7 @@ TEST $CLI volume profile $V0 start TEST mkdir $M0/dir1 # Generate the stat dump across the io-stat instances -TEST setfattr -n trusted.io-stats-dump -v /tmp/io-stats-1322825 $M0 +TEST setfattr -n trusted.io-stats-dump -v io-stats-1322825 $M0 # Check if $M0 is clean w.r.t xattr information # TODO: if there are better ways to check we really get no attr error, please @@ -42,12 +42,12 @@ ret=$(echo $?) EXPECT 0 echo $ret # Check if we have 5 io-stat files in /tmp -EXPECT 5 ls -1 /tmp/io-stats-1322825* +EXPECT 5 ls -1 /var/run/gluster/io-stats-1322825* # Cleanup the 5 generated files -rm -f /tmp/io-stats-1322825* +rm -f /var/run/gluster/io-stats-1322825* # Rinse and repeat above for a directory -TEST setfattr -n trusted.io-stats-dump -v /tmp/io-stats-1322825 $M0/dir1 +TEST setfattr -n trusted.io-stats-dump -v io-stats-1322825 $M0/dir1 getfattr -n trusted.io-stats-dump $B0/${V0}1/dir1 2>&1 | grep -qi "no such attribute" ret=$(echo $?) EXPECT 0 echo $ret @@ -61,7 +61,7 @@ getfattr -n trusted.io-stats-dump $B0/${V0}4/dir1 2>&1 | grep -qi "no such attri ret=$(echo $?) EXPECT 0 echo $ret -EXPECT 5 ls -1 /tmp/io-stats-1322825* -rm -f /tmp/io-stats-1322825* +EXPECT 5 ls -1 /var/run/gluster/io-stats-1322825* +rm -f /var/run/gluster/io-stats-1322825* cleanup; diff --git a/tests/bugs/core/multiplex-limit-issue-151.t b/tests/bugs/core/multiplex-limit-issue-151.t deleted file mode 100644 index c5bbbdad852..00000000000 --- a/tests/bugs/core/multiplex-limit-issue-151.t +++ /dev/null @@ -1,57 +0,0 @@ -#!/bin/bash - -. $(dirname $0)/../../include.rc -. $(dirname $0)/../../traps.rc -. $(dirname $0)/../../volume.rc - -function count_up_bricks { - $CLI --xml volume status all | grep '<status>1' | wc -l -} - -function count_brick_processes { - pgrep glusterfsd | wc -l -} - -function count_brick_pids { - $CLI --xml volume status all | sed -n '/.*<pid>\([^<]*\).*/s//\1/p' \ - | grep -v "N/A" | sort | uniq | wc -l -} - -cleanup; - -TEST glusterd - -TEST $CLI volume set all cluster.brick-multiplex on -TEST ! $CLI volume set all cluster.max-bricks-per-process -1 -TEST ! $CLI volume set all cluster.max-bricks-per-process foobar -TEST $CLI volume set all cluster.max-bricks-per-process 3 - -push_trapfunc "$CLI volume set all cluster.brick-multiplex off" -push_trapfunc "cleanup" - -TEST $CLI volume create $V0 $H0:$B0/brick{0..5} -TEST $CLI volume start $V0 - -EXPECT 2 count_brick_processes -EXPECT 2 count_brick_pids -EXPECT_WITHIN $PROCESS_UP_TIMEOUT 6 count_up_bricks - -pkill gluster -TEST glusterd - -EXPECT_WITHIN $PROCESS_UP_TIMEOUT 2 count_brick_processes -EXPECT_WITHIN $PROCESS_UP_TIMEOUT 2 count_brick_pids -EXPECT_WITHIN $PROCESS_UP_TIMEOUT 6 count_up_bricks - -TEST $CLI volume add-brick $V0 $H0:$B0/brick6 - -EXPECT_WITHIN $PROCESS_UP_TIMEOUT 3 count_brick_processes -EXPECT_WITHIN $PROCESS_UP_TIMEOUT 3 count_brick_pids -EXPECT_WITHIN $PROCESS_UP_TIMEOUT 7 count_up_bricks - -TEST $CLI volume remove-brick $V0 $H0:$B0/brick3 start -TEST $CLI volume remove-brick $V0 $H0:$B0/brick3 force - -EXPECT_WITHIN $PROCESS_UP_TIMEOUT 3 count_brick_processes -EXPECT_WITHIN $PROCESS_UP_TIMEOUT 3 count_brick_pids -EXPECT_WITHIN $PROCESS_UP_TIMEOUT 6 count_up_bricks diff --git a/tests/bugs/ctime/issue-832.t b/tests/bugs/ctime/issue-832.t new file mode 100755 index 00000000000..740f731ab73 --- /dev/null +++ b/tests/bugs/ctime/issue-832.t @@ -0,0 +1,32 @@ +#!/bin/bash + +. $(dirname $0)/../../include.rc +. $(dirname $0)/../../volume.rc +. $(dirname $0)/../../traps.rc + +#Trigger trusted.glusterfs.mdata setting codepath and see things work as expected +cleanup + +TEST_USER=test-ctime-user +TEST_UID=27341 + +TEST useradd -o -M -u ${TEST_UID} ${TEST_USER} +push_trapfunc "userdel --force ${TEST_USER}" + +TEST glusterd +TEST pidof glusterd + +TEST $CLI volume create $V0 $H0:$B0/$V0 +TEST $CLI volume start $V0 + +$GFS --volfile-id=/$V0 --volfile-server=$H0 $M0; +echo abc > $M0/test +TEST chmod 755 $M0/ +TEST chmod 744 $M0/test +TEST setfattr -x trusted.glusterfs.mdata $B0/$V0/test +EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0 +$GFS --volfile-id=/$V0 --volfile-server=$H0 $M0; +su ${TEST_USER} -c "cat $M0/test" +TEST getfattr -n trusted.glusterfs.mdata $B0/$V0/test + +cleanup diff --git a/tests/bugs/distribute/bug-1117851.t b/tests/bugs/distribute/bug-1117851.t deleted file mode 100755 index 678103869cf..00000000000 --- a/tests/bugs/distribute/bug-1117851.t +++ /dev/null @@ -1,99 +0,0 @@ -#!/bin/bash - -. $(dirname $0)/../../include.rc -. $(dirname $0)/../../volume.rc - -create_files () { - for i in {1..1000}; do - orig=$(printf %s/abc%04d $1 $i) - real=$(printf %s/src%04d $1 $i) - # Make sure lots of these have linkfiles. - echo "This is file $i" > $orig - mv $orig $real - done - sync -} - -move_files_inner () { - sfile=$M0/status_$(basename $1) - for i in {1..1000}; do - src=$(printf %s/src%04d $1 $i) - dst=$(printf %s/dst%04d $1 $i) - mv $src $dst 2> /dev/null - done - echo "done" > $sfile -} - -move_files () { - #Create the status file here to prevent spurious failures - #caused by the file not being created in time by the - #background process - sfile=$M0/status_$(basename $1) - echo "running" > $sfile - move_files_inner $* & -} - -check_files () { - errors=0 - for i in {1..1000}; do - if [ ! -f $(printf %s/dst%04d $1 $i) ]; then - if [ -f $(printf %s/src%04d $1 $i) ]; then - echo "file $i didnt get moved" > /dev/stderr - else - echo "file $i is MISSING" > /dev/stderr - errors=$((errors+1)) - fi - fi - done - if [ $((errors)) != 0 ]; then - : ls -l $1 > /dev/stderr - fi - return $errors -} - -cleanup; - -TEST glusterd -TEST pidof glusterd -TEST $CLI volume info; - -TEST $CLI volume create $V0 replica 2 $H0:$B0/${V0}{1,2,3,4,5,6}; - -EXPECT "$V0" volinfo_field $V0 'Volume Name'; -EXPECT 'Created' volinfo_field $V0 'Status'; -EXPECT '6' brick_count $V0 - -TEST $CLI volume start $V0; -EXPECT 'Started' volinfo_field $V0 'Status'; - -## Mount FUSE with caching disabled (read-write) -TEST glusterfs --entry-timeout=0 --attribute-timeout=0 -s $H0 --volfile-id $V0 $M0; - -TEST create_files $M0 - -## Mount FUSE with caching disabled (read-write) again -TEST glusterfs --entry-timeout=0 --attribute-timeout=0 -s $H0 --volfile-id $V0 $M1; - -TEST move_files $M0 -TEST move_files $M1 - -# It's regrettable that renaming 1000 files might take more than 30 seconds, -# but on our test systems sometimes it does, so double the time from what we'd -# use otherwise. There still seem to be some spurious failures, 1 in 20 when -# this does not complete, added an additional 60 seconds to take false reports -# out of the system, during test runs, especially on slower test systems. -EXPECT_WITHIN 120 "done" cat $M0/status_0 -EXPECT_WITHIN 120 "done" cat $M1/status_1 - -EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0 -EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M1 -TEST glusterfs --entry-timeout=0 --attribute-timeout=0 -s $H0 --volfile-id $V0 $M0; -TEST check_files $M0 - -TEST $CLI volume stop $V0; -EXPECT 'Stopped' volinfo_field $V0 'Status'; - -TEST $CLI volume delete $V0; -TEST ! $CLI volume info $V0; - -cleanup; diff --git a/tests/bugs/distribute/bug-1122443.t b/tests/bugs/distribute/bug-1122443.t deleted file mode 100644 index 906be7072bd..00000000000 --- a/tests/bugs/distribute/bug-1122443.t +++ /dev/null @@ -1,60 +0,0 @@ -#!/bin/bash - -. $(dirname $0)/../../include.rc -. $(dirname $0)/../../volume.rc -. $(dirname $0)/../../dht.rc - -make_files() { - mkdir $1 && \ - ln -s ../ $1/symlink && \ - mknod $1/special_b b 1 2 && \ - mknod $1/special_c c 3 4 && \ - mknod $1/special_u u 5 6 && \ - mknod $1/special_p p && \ - touch -h --date=@1 $1/symlink && \ - touch -h --date=@2 $1/special_b && - touch -h --date=@3 $1/special_c && - touch -h --date=@4 $1/special_u && - touch -h --date=@5 $1/special_p -} - -bug_1113050_workaround() { - # Test if graph change has settled (bug-1113050?) - test=$(stat -c "%n:%Y" $1 2>&1 | tr '\n' ',') - if [ $? -eq 0 ] ; then - echo RECONNECTED - else - echo WAITING - fi - return 0 -} - -cleanup - -TEST glusterd -TEST pidof glusterd - -TEST $CLI volume create $V0 $H0:$B0/${V0}0 -TEST $CLI volume start $V0 - -# Mount FUSE and create symlink -TEST glusterfs -s $H0 --volfile-id $V0 $M0 -TEST make_files $M0/subdir - -# Get mtime before migration -BEFORE="$(stat -c %n:%Y $M0/subdir/* | tr '\n' ',')" - -# Migrate brick -TEST $CLI volume add-brick $V0 $H0:$B0/${V0}1 -TEST $CLI volume remove-brick $V0 $H0:$B0/${V0}0 start -EXPECT_WITHIN $REBALANCE_TIMEOUT "completed" remove_brick_status_completed_field "$V0 $H0:$B0/${V0}0" -TEST $CLI volume remove-brick $V0 $H0:$B0/${V0}0 commit - -# Get mtime after migration -EXPECT_WITHIN 5 RECONNECTED bug_1113050_workaround $M0/subdir/* -AFTER="$(stat -c %n:%Y $M0/subdir/* | tr '\n' ',')" - -# Check if mtime is unchanged -TEST [ "$AFTER" == "$BEFORE" ] - -cleanup diff --git a/tests/bugs/distribute/bug-1125824.t b/tests/bugs/distribute/bug-1125824.t index 3bafbf31fe5..7e401092273 100755 --- a/tests/bugs/distribute/bug-1125824.t +++ b/tests/bugs/distribute/bug-1125824.t @@ -4,6 +4,8 @@ . $(dirname $0)/../../volume.rc . $(dirname $0)/../../nfs.rc +#G_TESTDEF_TEST_STATUS_CENTOS6=NFS_TEST + create_files () { for i in {1..10}; do orig=$(printf %s/file%04d $1 $i) diff --git a/tests/bugs/distribute/bug-1161156.t b/tests/bugs/distribute/bug-1161156.t index fed90e7f478..2b9e15407ca 100755 --- a/tests/bugs/distribute/bug-1161156.t +++ b/tests/bugs/distribute/bug-1161156.t @@ -4,6 +4,8 @@ . $(dirname $0)/../../volume.rc . $(dirname $0)/../../nfs.rc +#G_TESTDEF_TEST_STATUS_CENTOS6=NFS_TEST + cleanup; QDD=$(dirname $0)/quota diff --git a/tests/bugs/distribute/bug-1161311.t b/tests/bugs/distribute/bug-1161311.t index d88642edc32..62796068928 100755 --- a/tests/bugs/distribute/bug-1161311.t +++ b/tests/bugs/distribute/bug-1161311.t @@ -1,5 +1,7 @@ #!/bin/bash +SCRIPT_TIMEOUT=350 + # This tests for hard link preservation for files that are linked, when the # file is undergoing migration @@ -74,14 +76,12 @@ TEST glusterfs -s $H0 --volfile-id $V0 $M0; TEST mkdir $M0/dir1 TEST mkdir -p $M0/dir2/dir3 -# Create a large file (6.4 GB), so that rebalance takes time -# Reading from /dev/urandom is slow, so we'll cat it together -dd if=/dev/urandom of=/tmp/FILE2 bs=64k count=10240 -for i in {1..10}; do - cat /tmp/FILE2 >> $M0/dir1/FILE2 -done - -#dd if=/dev/urandom of=$M0/dir1/FILE2 bs=64k count=10240 +# Create a large file (8 GB), so that rebalance takes time +# Since we really don't care about the contents of the file, we use fallocate +# to generate the file much faster. We could also use truncate, which is even +# faster, but rebalance could take advantage of an sparse file and migrate it +# in an optimized way, but we don't want a fast migration. +TEST fallocate -l 8G $M0/dir1/FILE2 # Rename the file to create a linkto, for rebalance to # act on the file @@ -89,6 +89,8 @@ done ## into separate bricks when brick count is 3 TEST mv $M0/dir1/FILE2 $M0/dir1/FILE1 +brick_loc=$(get_backend_paths $M0/dir1/FILE1) + # unmount and remount the volume EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0 TEST glusterfs -s $H0 --volfile-id $V0 $M0; @@ -98,7 +100,7 @@ TEST $CLI volume rebalance $V0 start force # Wait for FILE to get the sticky bit on, so that file is under # active rebalance, before creating the links -TEST checksticky $B0/${V0}3/dir1/FILE1 +TEST checksticky $brick_loc # Create the links ## FILE3 FILE5 FILE7 have hashes, c8c91469 566d26ce 22ce7eba @@ -119,7 +121,7 @@ cd / # Ideally for this test to have done its job, the file should still be # under migration, so check the sticky bit again -TEST checksticky $B0/${V0}3/dir1/FILE1 +TEST checksticky $brick_loc # Wait for rebalance to complete EXPECT_WITHIN $REBALANCE_TIMEOUT "completed" rebalance_status_field $V0 @@ -152,6 +154,11 @@ TEST ln ./dir1/FILE7 ./FILE7 cd / linkcountsrc=$(stat -c %h $M0/dir1/FILE1) TEST [[ $linkcountsrc == 14 ]] + + +# Stop the volume +TEST $CLI volume stop $V0; + UMOUNT_LOOP ${B0}/${V0}{1..3} rm -f ${B0}/brick{1..3} cleanup; diff --git a/tests/bugs/distribute/bug-1190734.t b/tests/bugs/distribute/bug-1190734.t index d48d74d2c35..9256088f7a0 100644 --- a/tests/bugs/distribute/bug-1190734.t +++ b/tests/bugs/distribute/bug-1190734.t @@ -4,6 +4,8 @@ . $(dirname $0)/../../volume.rc . $(dirname $0)/../../nfs.rc +#G_TESTDEF_TEST_STATUS_CENTOS6=NFS_TEST + BRICK_COUNT=3 FILE_COUNT=100 FILE_COUNT_TIME=5 diff --git a/tests/bugs/distribute/bug-1193636.c b/tests/bugs/distribute/bug-1193636.c index eae90783f8e..ea3f79a4e06 100644 --- a/tests/bugs/distribute/bug-1193636.c +++ b/tests/bugs/distribute/bug-1193636.c @@ -1,70 +1,68 @@ #include <stdio.h> #include <stdlib.h> #include <sys/types.h> -#include <attr/xattr.h> +#include <sys/xattr.h> #include <fcntl.h> #include <string.h> +#define MY_XATTR_NAME "user.ftest" +#define MY_XATTR_VAL "ftestval" -#define MY_XATTR_NAME "user.ftest" -#define MY_XATTR_VAL "ftestval" - - -void usage (void) +void +usage(void) { - printf ("Usage : bug-1193636 <filename> <xattr_name> <op>\n"); - printf (" op : 0 - set, 1 - remove\n"); + printf("Usage : bug-1193636 <filename> <xattr_name> <op>\n"); + printf(" op : 0 - set, 1 - remove\n"); } - -int main (int argc, char **argv) +int +main(int argc, char **argv) { - int fd; - int err = 0; - char *xattr_name = NULL; - int op = 0; - - if (argc != 4) { - usage (); - exit (1); - } - - op = atoi (argv[3]); - - if ((op != 0) && (op != 1)) { - printf ("Invalid operation specified.\n"); - usage (); - exit (1); + int fd; + int err = 0; + char *xattr_name = NULL; + int op = 0; + + if (argc != 4) { + usage(); + exit(1); + } + + op = atoi(argv[3]); + + if ((op != 0) && (op != 1)) { + printf("Invalid operation specified.\n"); + usage(); + exit(1); + } + + xattr_name = argv[2]; + + fd = open(argv[1], O_RDWR); + if (fd == -1) { + printf("Failed to open file %s\n", argv[1]); + exit(1); + } + + if (!op) { + err = fsetxattr(fd, xattr_name, MY_XATTR_VAL, strlen(MY_XATTR_VAL) + 1, + XATTR_CREATE); + + if (err) { + printf("Failed to set xattr %s: %m\n", xattr_name); + exit(1); } - xattr_name = argv[2]; + } else { + err = fremovexattr(fd, xattr_name); - fd = open(argv[1], O_RDWR); - if (fd == -1) { - printf ("Failed to open file %s\n", argv[1]); - exit (1); + if (err) { + printf("Failed to remove xattr %s: %m\n", xattr_name); + exit(1); } + } - if (!op) { - err = fsetxattr (fd, xattr_name, MY_XATTR_VAL, - strlen (MY_XATTR_VAL) + 1, XATTR_CREATE); + close(fd); - if (err) { - printf ("Failed to set xattr %s: %m\n", xattr_name); - exit (1); - } - - } else { - err = fremovexattr (fd, xattr_name); - - if (err) { - printf ("Failed to remove xattr %s: %m\n", xattr_name); - exit (1); - } - } - - close (fd); - - return 0; + return 0; } - diff --git a/tests/bugs/distribute/bug-1193636.t b/tests/bugs/distribute/bug-1193636.t index ccde02edc70..b377910336e 100644 --- a/tests/bugs/distribute/bug-1193636.t +++ b/tests/bugs/distribute/bug-1193636.t @@ -41,11 +41,13 @@ dd if=/dev/zero of=$M0/dir1/FILE2 bs=64k count=10240 # act on the file TEST mv $M0/dir1/FILE2 $M0/dir1/FILE1 +brick_loc=$(get_backend_paths $M0/dir1/FILE1) + build_tester $(dirname $0)/bug-1193636.c TEST $CLI volume rebalance $V0 start force -TEST checksticky $B0/${V0}3/dir1/FILE1 +TEST checksticky $brick_loc TEST setfattr -n "user.test1" -v "test1" $M0/dir1/FILE1 TEST setfattr -n "user.test2" -v "test1" $M0/dir1/FILE1 diff --git a/tests/bugs/distribute/bug-1368012.t b/tests/bugs/distribute/bug-1368012.t index f89314b1f2e..0b626353aab 100644 --- a/tests/bugs/distribute/bug-1368012.t +++ b/tests/bugs/distribute/bug-1368012.t @@ -15,13 +15,14 @@ TEST pidof glusterd; TEST $CLI volume info; ## Lets create volume -TEST $CLI volume create $V0 $H0:/${V0}{1,2}; +TEST $CLI volume create $V0 $H0:$B0/${V0}{1,2}; ## Verify volume is created EXPECT "$V0" volinfo_field $V0 'Volume Name'; EXPECT 'Created' volinfo_field $V0 'Status'; ## Start volume and verify TEST $CLI volume start $V0; +EXPECT_WITHIN $PROCESS_UP_TIMEOUT "2" online_brick_count TEST $CLI volume set $V0 performance.stat-prefetch off EXPECT 'Started' volinfo_field $V0 'Status'; TEST glusterfs -s $H0 --volfile-id=$V0 $M0 @@ -35,16 +36,16 @@ TEST chmod 444 $M0 TEST permission_root=`stat -c "%A" $M0` TEST echo $permission_root #Add-brick -TEST $CLI volume add-brick $V0 $H0:/${V0}3 +TEST $CLI volume add-brick $V0 $H0:$B0/${V0}3 +EXPECT_WITHIN $PROCESS_UP_TIMEOUT "3" online_brick_count #Allow one lookup to happen -TEST pushd $M0 -TEST ls +TEST ls $M0 #Generate another lookup echo 3 > /proc/sys/vm/drop_caches -TEST ls +TEST ls $M0 #check root permission EXPECT_WITHIN "5" $permission_root get_permission $M0 #check permission on the new-brick -EXPECT $permission_root get_permission /${V0}3 +EXPECT $permission_root get_permission $B0/${V0}3 cleanup diff --git a/tests/bugs/distribute/bug-1600379.t b/tests/bugs/distribute/bug-1600379.t new file mode 100644 index 00000000000..8d2f6154100 --- /dev/null +++ b/tests/bugs/distribute/bug-1600379.t @@ -0,0 +1,54 @@ +#!/bin/bash + +. $(dirname $0)/../../include.rc +. $(dirname $0)/../../volume.rc + +# Initialize +#------------------------------------------------------------ +cleanup; + +# Start glusterd +TEST glusterd; +TEST pidof glusterd; +TEST $CLI volume info; + +# Create a volume +TEST $CLI volume create $V0 $H0:$B0/${V0}{1,2} + +# Verify volume creation +EXPECT "$V0" volinfo_field $V0 'Volume Name'; +EXPECT 'Created' volinfo_field $V0 'Status'; + +# Start volume and verify successful start +TEST $CLI volume start $V0; +EXPECT 'Started' volinfo_field $V0 'Status'; +TEST glusterfs --volfile-id=$V0 --volfile-server=$H0 --entry-timeout=0 $M0; +#------------------------------------------------------------ + +# Test case - Remove xattr from killed brick on lookup +#------------------------------------------------------------ +# Create a dir and set custom xattr +TEST mkdir $M0/testdir +TEST setfattr -n user.attr -v val $M0/testdir +xattr_val=`getfattr -d $B0/${V0}2/testdir | awk '{print $1}'`; +TEST ${xattr_val}='user.attr="val"'; + +# Kill 2nd brick process +TEST kill_brick $V0 $H0 $B0/${V0}2 +EXPECT_WITHIN ${PROCESS_UP_TIMEOUT} "1" online_brick_count + +# Remove custom xattr +TEST setfattr -x user.attr $M0/testdir + +# Bring up the killed brick process +TEST $CLI volume start $V0 force + +# Perform lookup +sleep 5 +TEST ls $M0/testdir + +# Check brick xattrs +xattr_val_2=`getfattr -d $B0/${V0}2/testdir`; +TEST [ ${xattr_val_2} = ''] ; + +cleanup; diff --git a/tests/bugs/distribute/bug-1667804.t b/tests/bugs/distribute/bug-1667804.t new file mode 100644 index 00000000000..3f7c43111d7 --- /dev/null +++ b/tests/bugs/distribute/bug-1667804.t @@ -0,0 +1,63 @@ +#!/bin/bash + +. $(dirname $0)/../../include.rc +. $(dirname $0)/../../volume.rc +. $(dirname $0)/../../dht.rc + +function confirm_all_linkto_files () +{ + inpath=$1 + for infile in $inpath/* + do + echo $infile + ret1=$(is_dht_linkfile $infile) + if [ "$ret1" -eq 0 ]; then + echo "$infile is not a linkto file" + echo 0 + return + fi + done + echo 1 +} + +cleanup; + +#Basic checks +TEST glusterd +TEST pidof glusterd +TEST $CLI volume info + +#Create a distributed volume +TEST $CLI volume create $V0 $H0:$B0/${V0}{1..2}; +TEST $CLI volume start $V0 + +# Mount FUSE +TEST glusterfs -s $H0 --volfile-id $V0 $M0 + +#Create files and rename them in order to create linkto files +TEST mkdir -p $M0/dir0/dir1 +TEST touch $M0/dir0/dir1/file-{1..50} + +for i in {1..50}; do + mv $M0/dir0/dir1/file-$i $M0/dir0/dir1/nfile-$i; +done + +#Remove the second brick to force the creation of linkto files +#on the removed brick + +TEST $CLI volume remove-brick $V0 $H0:$B0/${V0}2 start +EXPECT_WITHIN $REBALANCE_TIMEOUT "completed" remove_brick_status_completed_field "$V0 $H0:$B0/${V0}2" +TEST $CLI volume remove-brick $V0 $H0:$B0/${V0}2 stop + +EXPECT "1" confirm_all_linkto_files $B0/${V0}2/dir0/dir1 + +#Modify the xattrs of the linkto files on the removed brick to point to itself. + +target=$(cat $M0/.meta/graphs/active/$V0-dht/subvolumes/1/name) + +setfattr -n trusted.glusterfs.dht.linkto -v "$target\0" $B0/${V0}2/dir0/dir1/nfile* + + +TEST rm -rf $M0/dir0 + +cleanup; diff --git a/tests/bugs/distribute/bug-1786679.t b/tests/bugs/distribute/bug-1786679.t new file mode 100755 index 00000000000..219ce51c8a9 --- /dev/null +++ b/tests/bugs/distribute/bug-1786679.t @@ -0,0 +1,69 @@ +#!/bin/bash + +SCRIPT_TIMEOUT=250 + +. $(dirname $0)/../../include.rc +. $(dirname $0)/../../volume.rc +. $(dirname $0)/../../dht.rc + + +# create 2 subvols +# create a dir +# create a file +# change layout +# remove the file +# execute create from a different mount +# Without the patch, the file will be present on both of the bricks + +cleanup + +function get_layout () { + +layout=`getfattr -n trusted.glusterfs.dht -e hex $1 2>&1 | grep dht | gawk -F"=" '{print $2}'` + +echo $layout + +} + +function set_layout() +{ + setfattr -n "trusted.glusterfs.dht" -v $1 $2 +} + +TEST glusterd +TEST pidof glusterd + +BRICK1=$B0/${V0}-0 +BRICK2=$B0/${V0}-1 + +TEST $CLI volume create $V0 $H0:$BRICK1 $H0:$BRICK2 +TEST $CLI volume start $V0 + +# Mount FUSE and create symlink +TEST glusterfs -s $H0 --volfile-id $V0 $M0 +TEST mkdir $M0/dir +TEST touch $M0/dir/file +TEST ! stat "$BRICK1/dir/file" +TEST stat "$BRICK2/dir/file" + +layout1="$(get_layout "$BRICK1/dir")" +layout2="$(get_layout "$BRICK2/dir")" + +TEST set_layout $layout1 "$BRICK2/dir" +TEST set_layout $layout2 "$BRICK1/dir" + +TEST rm $M0/dir/file -f +TEST gluster v set $V0 client-log-level DEBUG + +#Without the patch in place, this client will create the file in $BRICK2 +#which will lead to two files being on both the bricks when a new client +#create the file with the same name +TEST touch $M0/dir/file + +TEST glusterfs -s $H0 --volfile-id $V0 $M1 +TEST touch $M1/dir/file + +TEST stat "$BRICK1/dir/file" +TEST ! stat "$BRICK2/dir/file" + +cleanup diff --git a/tests/bugs/distribute/bug-853258.t b/tests/bugs/distribute/bug-853258.t index e39f507baf9..6817d9e2cd3 100755 --- a/tests/bugs/distribute/bug-853258.t +++ b/tests/bugs/distribute/bug-853258.t @@ -31,6 +31,7 @@ done # Expand the volume and force assignment of new ranges. TEST $CLI volume add-brick $V0 $H0:$B0/${V0}3 +EXPECT_WITHIN $PROCESS_UP_TIMEOUT "4" online_brick_count # Force assignment of initial ranges. TEST $CLI volume rebalance $V0 fix-layout start EXPECT_WITHIN $REBALANCE_TIMEOUT "fix-layout completed" fix-layout_status_field $V0 diff --git a/tests/bugs/distribute/bug-860663.c b/tests/bugs/distribute/bug-860663.c index bee4e7d40b1..ca0c31ffe8f 100644 --- a/tests/bugs/distribute/bug-860663.c +++ b/tests/bugs/distribute/bug-860663.c @@ -6,38 +6,36 @@ #include <err.h> #include <sys/param.h> -int -main(argc, argv) - int argc; - char **argv; +int main(argc, argv) int argc; +char **argv; { - char *basepath; - char path[MAXPATHLEN + 1]; - unsigned int count; - int i, fd; + char *basepath; + char path[MAXPATHLEN + 1]; + unsigned int count; + int i, fd; - if (argc != 3) - errx(1, "usage: %s path count", argv[0]); + if (argc != 3) + errx(1, "usage: %s path count", argv[0]); - basepath = argv[1]; - count = atoi(argv[2]); + basepath = argv[1]; + count = atoi(argv[2]); - if (count > 999999) - errx(1, "count too big"); + if (count > 999999) + errx(1, "count too big"); - if (strlen(basepath) > MAXPATHLEN - 6) - errx(1, "path too long"); + if (strlen(basepath) > MAXPATHLEN - 6) + errx(1, "path too long"); - for (i = 0; i < count; i++) { - (void)sprintf(path, "%s%06d", basepath, i); + for (i = 0; i < count; i++) { + (void)sprintf(path, "%s%06d", basepath, i); - fd = open(path, O_CREAT|O_RDWR, 0644); - if (fd == -1) - err(1, "create %s failed", path); + fd = open(path, O_CREAT | O_RDWR, 0644); + if (fd == -1) + err(1, "create %s failed", path); - if (close(fd) != 0) - warn("close %s failed", path); - } + if (close(fd) != 0) + warn("close %s failed", path); + } - return 0; + return 0; } diff --git a/tests/bugs/distribute/issue-1327.t b/tests/bugs/distribute/issue-1327.t new file mode 100755 index 00000000000..acd8c8c6614 --- /dev/null +++ b/tests/bugs/distribute/issue-1327.t @@ -0,0 +1,33 @@ +#!/bin/bash + +SCRIPT_TIMEOUT=250 + +. $(dirname $0)/../../include.rc +. $(dirname $0)/../../volume.rc +. $(dirname $0)/../../dht.rc + +cleanup + +TEST glusterd +TEST pidof glusterd + +BRICK1=$B0/${V0}-0 +BRICK2=$B0/${V0}-1 + +TEST $CLI volume create $V0 $H0:$BRICK1 $H0:$BRICK2 +TEST $CLI volume start $V0 + +TEST glusterfs -s $H0 --volfile-id $V0 $M0 +TEST mkdir $M0/dir + +#remove dir from one of the brick +TEST rmdir $BRICK2/dir + +#safe cache timeout for lookup to be triggered +sleep 2 + +TEST ls $M0/dir + +TEST stat $BRICK2/dir + +cleanup diff --git a/tests/bugs/distribute/overlap.py b/tests/bugs/distribute/overlap.py index 726389a78d6..2813979787b 100755 --- a/tests/bugs/distribute/overlap.py +++ b/tests/bugs/distribute/overlap.py @@ -1,4 +1,3 @@ -#!/usr/bin/python2 from __future__ import print_function import sys @@ -18,7 +17,7 @@ def calculate_one (ov, nv): def calculate_all (values): total = 0 - nv_index = len(values) / 2 + nv_index = len(values) // 2 for old_val in values[:nv_index]: new_val = values[nv_index] nv_index += 1 diff --git a/tests/bugs/ec/bug-1161886.c b/tests/bugs/ec/bug-1161886.c index e8093e48a7a..1f12650ea6d 100644 --- a/tests/bugs/ec/bug-1161886.c +++ b/tests/bugs/ec/bug-1161886.c @@ -4,50 +4,50 @@ #include <glusterfs/api/glfs-handles.h> int -main (int argc, char *argv[]) +main(int argc, char *argv[]) { - glfs_t *fs = NULL; - glfs_fd_t *fd = NULL; - int ret = 1; - - if (argc != 4) { - fprintf (stderr, "Syntax: %s <host> <volname> <file>\n", argv[0]); - return 1; - } - - fs = glfs_new (argv[2]); - if (!fs) { - fprintf (stderr, "glfs_new: returned NULL\n"); - return 1; - } - - ret = glfs_set_volfile_server (fs, "tcp", argv[1], 24007); - if (ret != 0) { - fprintf (stderr, "glfs_set_volfile_server: retuned %d\n", ret); - goto out; - } - ret = glfs_set_logging (fs, "/dev/null", 7); - if (ret != 0) { - fprintf (stderr, "glfs_set_logging: returned %d\n", ret); - goto out; - } - ret = glfs_init (fs); - if (ret != 0) { - fprintf (stderr, "glfs_init: returned %d\n", ret); - goto out; - } - - fd = glfs_open (fs, argv[3], O_RDWR | O_TRUNC); - if (fd == NULL) { - fprintf (stderr, "glfs_open: returned NULL\n"); - goto out; - } - glfs_close(fd); - - ret = 0; + glfs_t *fs = NULL; + glfs_fd_t *fd = NULL; + int ret = 1; + + if (argc != 4) { + fprintf(stderr, "Syntax: %s <host> <volname> <file>\n", argv[0]); + return 1; + } + + fs = glfs_new(argv[2]); + if (!fs) { + fprintf(stderr, "glfs_new: returned NULL\n"); + return 1; + } + + ret = glfs_set_volfile_server(fs, "tcp", argv[1], 24007); + if (ret != 0) { + fprintf(stderr, "glfs_set_volfile_server: returned %d\n", ret); + goto out; + } + ret = glfs_set_logging(fs, "/dev/null", 7); + if (ret != 0) { + fprintf(stderr, "glfs_set_logging: returned %d\n", ret); + goto out; + } + ret = glfs_init(fs); + if (ret != 0) { + fprintf(stderr, "glfs_init: returned %d\n", ret); + goto out; + } + + fd = glfs_open(fs, argv[3], O_RDWR | O_TRUNC); + if (fd == NULL) { + fprintf(stderr, "glfs_open: returned NULL\n"); + goto out; + } + glfs_close(fd); + + ret = 0; out: - glfs_fini (fs); + glfs_fini(fs); - return ret; + return ret; } diff --git a/tests/bugs/ec/bug-1187474.t b/tests/bugs/ec/bug-1187474.t index fb4b2082f8f..e6344c26e73 100644 --- a/tests/bugs/ec/bug-1187474.t +++ b/tests/bugs/ec/bug-1187474.t @@ -4,6 +4,8 @@ . $(dirname $0)/../../volume.rc . $(dirname $0)/../../nfs.rc +#G_TESTDEF_TEST_STATUS_CENTOS6=NFS_TEST + function check_dir() { local count diff --git a/tests/bugs/ec/bug-1236065.t b/tests/bugs/ec/bug-1236065.t index 9395aa33e8c..9181e73ec19 100644 --- a/tests/bugs/ec/bug-1236065.t +++ b/tests/bugs/ec/bug-1236065.t @@ -2,6 +2,7 @@ . $(dirname $0)/../../include.rc . $(dirname $0)/../../volume.rc +SCRIPT_TIMEOUT=400 cleanup @@ -84,7 +85,6 @@ TEST pidof glusterd EXPECT "$V0" volinfo_field $V0 'Volume Name' EXPECT 'Started' volinfo_field $V0 'Status' EXPECT '7' online_brick_count - ## cleanup cd EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0 diff --git a/tests/bugs/ec/bug-1699866-check-reopen-fd.t b/tests/bugs/ec/bug-1699866-check-reopen-fd.t new file mode 100644 index 00000000000..4386d010318 --- /dev/null +++ b/tests/bugs/ec/bug-1699866-check-reopen-fd.t @@ -0,0 +1,34 @@ +#!/bin/bash + +. $(dirname $0)/../../include.rc +. $(dirname $0)/../../volume.rc +. $(dirname $0)/../../fileio.rc + +cleanup + +TEST glusterd +TEST pidof glusterd +TEST $CLI volume create $V0 disperse 6 redundancy 2 $H0:$B0/${V0}{0..5} +TEST $CLI volume heal $V0 disable +TEST $CLI volume set $V0 disperse.background-heals 0 +TEST $CLI volume set $V0 write-behind off +TEST $CLI volume set $V0 open-behind off +TEST $CLI volume start $V0 +TEST glusterfs --entry-timeout=0 --attribute-timeout=0 -s $H0 --volfile-id $V0 $M0 +EXPECT_WITHIN $CHILD_UP_TIMEOUT "6" ec_child_up_count $V0 0 + +TEST mkdir -p $M0/dir + +fd="$(fd_available)" + +TEST kill_brick $V0 $H0 $B0/${V0}0 +EXPECT_WITHIN $CHILD_UP_TIMEOUT "5" ec_child_up_count $V0 0 + +TEST fd_open ${fd} rw $M0/dir/test +TEST fd_write ${fd} "test1" +TEST $CLI volume replace-brick ${V0} $H0:$B0/${V0}0 $H0:$B0/${V0}0_1 commit force +EXPECT_WITHIN $CHILD_UP_TIMEOUT "6" ec_child_up_count $V0 0 +TEST fd_write ${fd} "test2" +TEST fd_close ${fd} + +cleanup diff --git a/tests/bugs/ec/bug-1708156-honor-inodelk-contention-notify-on-partial-locks.t b/tests/bugs/ec/bug-1708156-honor-inodelk-contention-notify-on-partial-locks.t new file mode 100644 index 00000000000..67fdb184b46 --- /dev/null +++ b/tests/bugs/ec/bug-1708156-honor-inodelk-contention-notify-on-partial-locks.t @@ -0,0 +1,54 @@ +#!/bin/bash + +. $(dirname $0)/../../include.rc +. $(dirname $0)/../../volume.rc + +function do_ls() { + local dir="${1}" + local i + + for i in {1..50}; do + ls -l $M0/${dir} >/dev/null & + ls -l $M1/${dir} >/dev/null & + ls -l $M2/${dir} >/dev/null & + ls -l $M3/${dir} >/dev/null & + done + wait +} + +function measure_time() { + { + LC_ALL=C + time -p "${@}" + } 2>&1 | awk '/^real/ { print $2 * 1000 }' +} + +cleanup + +TEST glusterd +TEST pidof glusterd +TEST $CLI volume create $V0 disperse 6 redundancy 2 $H0:$B0/${V0}{0..5} + +TEST $CLI volume set $V0 disperse.eager-lock on +TEST $CLI volume set $V0 disperse.other-eager-lock on +TEST $CLI volume set $V0 features.locks-notify-contention on +TEST $CLI volume set $V0 disperse.eager-lock-timeout 10 +TEST $CLI volume set $V0 disperse.other-eager-lock-timeout 10 + +TEST $CLI volume start $V0 +TEST $GFS --volfile-id=/$V0 --volfile-server=$H0 $M0 +TEST $GFS --volfile-id=/$V0 --volfile-server=$H0 $M1 +TEST $GFS --volfile-id=/$V0 --volfile-server=$H0 $M2 +TEST $GFS --volfile-id=/$V0 --volfile-server=$H0 $M3 +EXPECT_WITHIN $CHILD_UP_TIMEOUT "6" ec_child_up_count $V0 0 $M0 +EXPECT_WITHIN $CHILD_UP_TIMEOUT "6" ec_child_up_count $V0 0 $M1 +EXPECT_WITHIN $CHILD_UP_TIMEOUT "6" ec_child_up_count $V0 0 $M2 +EXPECT_WITHIN $CHILD_UP_TIMEOUT "6" ec_child_up_count $V0 0 $M3 +TEST mkdir $M0/dir +TEST touch $M0/dir/file.{1..10} + +# Run multiple 'ls' concurrently from multiple clients so that they collide and +# cause partial locks. +TEST [[ $(measure_time do_ls dir) -lt 10000 ]] + +cleanup diff --git a/tests/bugs/error-gen/bug-767095.t b/tests/bugs/error-gen/bug-767095.t index 4649a783b23..6cc254f559d 100755 --- a/tests/bugs/error-gen/bug-767095.t +++ b/tests/bugs/error-gen/bug-767095.t @@ -9,7 +9,7 @@ TEST glusterd; TEST pidof glusterd; TEST $CLI volume info; -TEST $CLI volume create $V0 replica 2 stripe 2 $H0:$B0/${V0}{1,2,3,4,5,6,7,8}; +TEST $CLI volume create $V0 replica 3 $H0:$B0/${V0}{1,2,3,4,5,6}; function volinfo_field() { diff --git a/tests/bugs/fuse/bug-1126048.c b/tests/bugs/fuse/bug-1126048.c index 01c3484172d..19165ecf6f7 100644 --- a/tests/bugs/fuse/bug-1126048.c +++ b/tests/bugs/fuse/bug-1126048.c @@ -12,30 +12,32 @@ * fsync should fail without crashing the mount process. */ int -main (int argc, char **argv) +main(int argc, char **argv) { - int ret = 0; - int fd = 0; - char *cmd = argv[1]; - struct stat stbuf = {0, }; + int ret = 0; + int fd = 0; + char *cmd = argv[1]; + struct stat stbuf = { + 0, + }; - printf ("cmd is: %s\n", cmd); - fd = open("a.txt", O_CREAT|O_RDWR, 0644); - if (fd < 0) - printf ("open failed: %s\n", strerror(errno)); + printf("cmd is: %s\n", cmd); + fd = open("a.txt", O_CREAT | O_RDWR, 0644); + if (fd < 0) + printf("open failed: %s\n", strerror(errno)); - ret = unlink("a.txt"); - if (ret < 0) - printf ("unlink failed: %s\n", strerror(errno)); - if (write (fd, "abc", 3) < 0) - printf ("Not able to print %s\n", strerror (errno)); - system(cmd); - sleep(1); /* No way to confirm graph switch so sleep 1 */ - ret = fstat (fd, &stbuf); - if (ret < 0) - printf ("fstat failed %\n", strerror (errno)); - ret = fsync(fd); - if (ret < 0) - printf ("Not able to fsync %s\n", strerror (errno)); - return 0; + ret = unlink("a.txt"); + if (ret < 0) + printf("unlink failed: %s\n", strerror(errno)); + if (write(fd, "abc", 3) < 0) + printf("Not able to print %s\n", strerror(errno)); + system(cmd); + sleep(1); /* No way to confirm graph switch so sleep 1 */ + ret = fstat(fd, &stbuf); + if (ret < 0) + printf("fstat failed %\n", strerror(errno)); + ret = fsync(fd); + if (ret < 0) + printf("Not able to fsync %s\n", strerror(errno)); + return 0; } diff --git a/tests/bugs/fuse/bug-858215.t b/tests/bugs/fuse/bug-858215.t index 92389829077..95999f6ad24 100755 --- a/tests/bugs/fuse/bug-858215.t +++ b/tests/bugs/fuse/bug-858215.t @@ -10,7 +10,7 @@ TEST glusterd; TEST pidof glusterd; TEST $CLI volume info; -TEST $CLI volume create $V0 replica 2 stripe 2 $H0:$B0/${V0}{1,2,3,4,5,6,7,8}; +TEST $CLI volume create $V0 replica 3 $H0:$B0/${V0}{1,2,3,4,5,6}; TEST $CLI volume set $V0 nfs.disable off function volinfo_field() @@ -41,8 +41,8 @@ TEST stat $M0/newfile; TEST rm $M0/newfile; nfs_pid=$(cat $GLUSTERD_PIDFILEDIR/nfs/nfs.pid || echo -1); -glustershd_pid=$(cat $GLUSTERD_PIDFILEDIR/glustershd/glustershd.pid || echo -1); - +glustershd_pid=`ps auxwww | grep glustershd | grep -v grep | awk -F " " '{print $2}'` +TEST [ $glustershd_pid != 0 ]; pids=$(pidof glusterfs); for i in $pids do diff --git a/tests/bugs/fuse/bug-985074.t b/tests/bugs/fuse/bug-985074.t index d10fd9f8b41..ffa6df54144 100644 --- a/tests/bugs/fuse/bug-985074.t +++ b/tests/bugs/fuse/bug-985074.t @@ -30,7 +30,7 @@ TEST glusterd TEST $CLI volume create $V0 $H0:$B0/$V0 TEST $CLI volume start $V0 -TEST $CLI volume set $V0 md-cache-timeout 3 +TEST $CLI volume set $V0 performance.stat-prefetch off TEST glusterfs --volfile-id=$V0 --volfile-server=$H0 $M0 --entry-timeout=0 --attribute-timeout=0 TEST glusterfs --volfile-id=$V0 --volfile-server=$H0 $M1 --entry-timeout=0 --attribute-timeout=0 @@ -40,8 +40,7 @@ TEST ln $M0/file $M0/file.link TEST ls -ali $M0 $M1 TEST rm -f $M1/file.link TEST ls -ali $M0 $M1 -# expire the md-cache timeout -sleep 3 + TEST mv $M0/file $M0/file.link TEST stat $M0/file.link TEST ! stat $M0/file diff --git a/tests/bugs/fuse/many-groups-for-acl.t b/tests/bugs/fuse/many-groups-for-acl.t index d959f750ee0..a51b1bc7267 100755 --- a/tests/bugs/fuse/many-groups-for-acl.t +++ b/tests/bugs/fuse/many-groups-for-acl.t @@ -38,6 +38,13 @@ do done TEST useradd -o -M -u ${NEW_UID} -g ${NEW_GID} -G ${NEW_USER}-${NEW_GIDS} ${NEW_USER} +# Linux < 3.8 exports only first 32 gids of pid to userspace +kernel_exports_few_gids=0 +if [ "$OSTYPE" = Linux ] && \ + su -m ${NEW_USER} -c "grep ^Groups: /proc/self/status | wc -w | xargs -I@ expr @ - 1 '<' $LAST_GID - $NEW_GID + 1" > /dev/null; then + kernel_exports_few_gids=1 +fi + # preparation done, start the tests TEST glusterd @@ -48,6 +55,8 @@ TEST $CLI volume set $V0 nfs.disable off TEST $CLI volume set ${V0} server.manage-gids off TEST $CLI volume start ${V0} +# This is just a synchronization hack to make sure the bricks are +# up before going on. EXPECT_WITHIN ${NFS_EXPORT_TIMEOUT} "1" is_nfs_export_available # mount the volume with POSIX ACL support, without --resolve-gids @@ -69,8 +78,8 @@ TEST [ $? -eq 0 ] su -m ${NEW_USER} -c "touch ${M0}/first-32-gids-2/success > /dev/null" TEST [ $? -eq 0 ] -su -m ${NEW_USER} -c "touch ${M0}/gid-64/failure > /dev/null" -TEST [ $? -ne 0 ] +su -m ${NEW_USER} -c "touch ${M0}/gid-64/success--if-all-gids-exported > /dev/null" +TEST [ $? -eq $kernel_exports_few_gids ] su -m ${NEW_USER} -c "touch ${M0}/gid-120/failure > /dev/null" TEST [ $? -ne 0 ] diff --git a/tests/bugs/gfapi/bug-1093594.c b/tests/bugs/gfapi/bug-1093594.c index aff271e4caf..f7a06dd5ba8 100644 --- a/tests/bugs/gfapi/bug-1093594.c +++ b/tests/bugs/gfapi/bug-1093594.c @@ -5,7 +5,7 @@ #include <stdlib.h> #include <string.h> -#define WRITE_SIZE (128*1024) +#define WRITE_SIZE (128 * 1024) #define READ_WRITE_LOOP 100 #define FOP_LOOP_COUNT 20 #define TEST_CASE_LOOP 20 @@ -14,304 +14,298 @@ int gfapi = 1; static int extension = 1; static int -large_number_of_fops (glfs_t *fs) { - int ret = 0; - int i = 0; - glfs_fd_t *fd = NULL; - glfs_fd_t *fd1 = NULL; - char *dir1 = NULL, *dir2 = NULL, *filename1 = NULL, *filename2 = NULL; - char *buf = NULL; - struct stat sb = {0, }; - - for (i = 0 ; i < FOP_LOOP_COUNT ; i++) { - ret = asprintf (&dir1, "dir%d", extension); - if (ret < 0) { - fprintf (stderr, "cannot construct filename (%s)", - strerror (errno)); - return ret; - } - - extension++; - - ret = glfs_mkdir (fs, dir1, 0755); - if (ret < 0) { - fprintf (stderr, "mkdir(%s): %s\n", dir1, strerror (errno)); - return -1; - } - - fd = glfs_opendir (fs, dir1); - if (!fd) { - fprintf (stderr, "/: %s\n", strerror (errno)); - return -1; - } - - ret = glfs_fsetxattr (fd, "user.dirfattr", "fsetxattr", 8, 0); - if (ret < 0) { - fprintf (stderr, "fsetxattr(%s): %d (%s)\n", dir1, ret, - strerror (errno)); - return -1; - } - - ret = glfs_closedir (fd); - if (ret < 0) { - fprintf (stderr, "glfs_closedir failed with ret: %d (%s)\n", - ret, strerror (errno)); - return -1; - } - - ret = glfs_rmdir (fs, dir1); - if (ret < 0) { - fprintf (stderr, "glfs_unlink failed with ret: %d (%s)\n", - ret, strerror (errno)); - return -1; - } - - ret = asprintf (&filename1, "file%d", extension); - if (ret < 0) { - fprintf (stderr, "cannot construct filename (%s)", - strerror (errno)); - return ret; - } - - ret = asprintf (&filename2, "file-%d", extension); - if (ret < 0) { - fprintf (stderr, "cannot construct filename (%s)", - strerror (errno)); - return ret; - } - - extension++; - - fd = glfs_creat (fs, filename1, O_RDWR, 0644); - if (!fd) { - fprintf (stderr, "%s: (%p) %s\n", filename1, fd, - strerror (errno)); - return -1; - } - - ret = glfs_rename (fs, filename1, filename2); - if (ret < 0) { - fprintf (stderr, "glfs_rename failed with ret: %d (%s)\n", - ret, strerror (errno)); - return -1; - } - - ret = glfs_lstat (fs, filename2, &sb); - if (ret < 0) { - fprintf (stderr, "glfs_lstat failed with ret: %d (%s)\n", - ret, strerror (errno)); - return -1; - } - - ret = glfs_close (fd); - if (ret < 0) { - fprintf (stderr, "glfs_close failed with ret: %d (%s)\n", - ret, strerror (errno)); - return -1; - } - - ret = glfs_unlink (fs, filename2); - if (ret < 0) { - fprintf (stderr, "glfs_unlink failed with ret: %d (%s)\n", - ret, strerror (errno)); - return -1; - } +large_number_of_fops(glfs_t *fs) +{ + int ret = 0; + int i = 0; + glfs_fd_t *fd = NULL; + glfs_fd_t *fd1 = NULL; + char *dir1 = NULL, *dir2 = NULL, *filename1 = NULL, *filename2 = NULL; + char *buf = NULL; + struct stat sb = { + 0, + }; + + for (i = 0; i < FOP_LOOP_COUNT; i++) { + ret = asprintf(&dir1, "dir%d", extension); + if (ret < 0) { + fprintf(stderr, "cannot construct filename (%s)", strerror(errno)); + return ret; } -} -static int -large_read_write (glfs_t *fs) { + extension++; - int ret = 0; - int j = 0; - glfs_fd_t *fd = NULL; - glfs_fd_t *fd1 = NULL; - char *filename = NULL; - char *buf = NULL; + ret = glfs_mkdir(fs, dir1, 0755); + if (ret < 0) { + fprintf(stderr, "mkdir(%s): %s\n", dir1, strerror(errno)); + return -1; + } - ret = asprintf (&filename, "filerw%d", extension); + fd = glfs_opendir(fs, dir1); + if (!fd) { + fprintf(stderr, "/: %s\n", strerror(errno)); + return -1; + } + + ret = glfs_fsetxattr(fd, "user.dirfattr", "fsetxattr", 8, 0); if (ret < 0) { - fprintf (stderr, "cannot construct filename (%s)", - strerror (errno)); - return ret; + fprintf(stderr, "fsetxattr(%s): %d (%s)\n", dir1, ret, + strerror(errno)); + return -1; } - extension++; + ret = glfs_closedir(fd); + if (ret < 0) { + fprintf(stderr, "glfs_closedir failed with ret: %d (%s)\n", ret, + strerror(errno)); + return -1; + } - fd = glfs_creat (fs, filename, O_RDWR, 0644); - if (!fd) { - fprintf (stderr, "%s: (%p) %s\n", filename, fd, - strerror (errno)); - return -1; + ret = glfs_rmdir(fs, dir1); + if (ret < 0) { + fprintf(stderr, "glfs_unlink failed with ret: %d (%s)\n", ret, + strerror(errno)); + return -1; } - buf = (char *) malloc (WRITE_SIZE); - memset (buf, '-', WRITE_SIZE); + ret = asprintf(&filename1, "file%d", extension); + if (ret < 0) { + fprintf(stderr, "cannot construct filename (%s)", strerror(errno)); + return ret; + } - for (j = 0; j < READ_WRITE_LOOP; j++) { - ret = glfs_write (fd, buf, WRITE_SIZE, 0); - if (ret < 0) { - fprintf (stderr, "Write(%s): %d (%s)\n", filename, ret, - strerror (errno)); - return ret; - } + ret = asprintf(&filename2, "file-%d", extension); + if (ret < 0) { + fprintf(stderr, "cannot construct filename (%s)", strerror(errno)); + return ret; } - fd1 = glfs_open (fs, filename, O_RDWR); - if (fd1 < 0) { - fprintf (stderr, "Open(%s): %d (%s)\n", filename, ret, - strerror (errno)); - return -1; + extension++; + + fd = glfs_creat(fs, filename1, O_RDWR, 0644); + if (!fd) { + fprintf(stderr, "%s: (%p) %s\n", filename1, fd, strerror(errno)); + return -1; } - glfs_lseek (fd1, 0, SEEK_SET); - for (j = 0; j < READ_WRITE_LOOP; j++) { - ret = glfs_read (fd1, buf, WRITE_SIZE, 0); - if (ret < 0) { - fprintf (stderr, "Read(%s): %d (%s)\n", filename, ret, - strerror (errno)); - return ret; - } + ret = glfs_rename(fs, filename1, filename2); + if (ret < 0) { + fprintf(stderr, "glfs_rename failed with ret: %d (%s)\n", ret, + strerror(errno)); + return -1; } - for (j = 0; j < READ_WRITE_LOOP; j++) { - ret = glfs_write (fd1, buf, WRITE_SIZE, 0); - if (ret < 0) { - fprintf (stderr, "Write(%s): %d (%s)\n", filename, ret, - strerror (errno)); - return ret; - } + ret = glfs_lstat(fs, filename2, &sb); + if (ret < 0) { + fprintf(stderr, "glfs_lstat failed with ret: %d (%s)\n", ret, + strerror(errno)); + return -1; } - glfs_close (fd); - glfs_close (fd1); - ret = glfs_unlink (fs, filename); + ret = glfs_close(fd); if (ret < 0) { - fprintf (stderr, "glfs_unlink failed with ret: %d (%s)\n", - ret, strerror (errno)); - return -1; + fprintf(stderr, "glfs_close failed with ret: %d (%s)\n", ret, + strerror(errno)); + return -1; } - free (buf); - free (filename); + ret = glfs_unlink(fs, filename2); + if (ret < 0) { + fprintf(stderr, "glfs_unlink failed with ret: %d (%s)\n", ret, + strerror(errno)); + return -1; + } + } } static int -volfile_change (const char *volname) { - int ret = 0; - char *cmd = NULL, *cmd1 = NULL; +large_read_write(glfs_t *fs) +{ + int ret = 0; + int j = 0; + glfs_fd_t *fd = NULL; + glfs_fd_t *fd1 = NULL; + char *filename = NULL; + char *buf = NULL; + + ret = asprintf(&filename, "filerw%d", extension); + if (ret < 0) { + fprintf(stderr, "cannot construct filename (%s)", strerror(errno)); + return ret; + } - ret = asprintf (&cmd, "gluster volume set %s stat-prefetch off", - volname); - if (ret < 0) { - fprintf (stderr, "cannot construct cli command string (%s)", - strerror (errno)); - return ret; - } + extension++; - ret = asprintf (&cmd1, "gluster volume set %s stat-prefetch on", - volname); + fd = glfs_creat(fs, filename, O_RDWR, 0644); + if (!fd) { + fprintf(stderr, "%s: (%p) %s\n", filename, fd, strerror(errno)); + return -1; + } + + buf = (char *)malloc(WRITE_SIZE); + memset(buf, '-', WRITE_SIZE); + + for (j = 0; j < READ_WRITE_LOOP; j++) { + ret = glfs_write(fd, buf, WRITE_SIZE, 0); if (ret < 0) { - fprintf (stderr, "cannot construct cli command string (%s)", - strerror (errno)); - return ret; + fprintf(stderr, "Write(%s): %d (%s)\n", filename, ret, + strerror(errno)); + return ret; } + } - ret = system (cmd); + fd1 = glfs_open(fs, filename, O_RDWR); + if (fd1 < 0) { + fprintf(stderr, "Open(%s): %d (%s)\n", filename, ret, strerror(errno)); + return -1; + } + + glfs_lseek(fd1, 0, SEEK_SET); + for (j = 0; j < READ_WRITE_LOOP; j++) { + ret = glfs_read(fd1, buf, WRITE_SIZE, 0); if (ret < 0) { - fprintf (stderr, "stat-prefetch off on (%s) failed", volname); - return ret; + fprintf(stderr, "Read(%s): %d (%s)\n", filename, ret, + strerror(errno)); + return ret; } + } - ret = system (cmd1); + for (j = 0; j < READ_WRITE_LOOP; j++) { + ret = glfs_write(fd1, buf, WRITE_SIZE, 0); if (ret < 0) { - fprintf (stderr, "stat-prefetch on on (%s) failed", volname); - return ret; + fprintf(stderr, "Write(%s): %d (%s)\n", filename, ret, + strerror(errno)); + return ret; } + } + + glfs_close(fd); + glfs_close(fd1); + ret = glfs_unlink(fs, filename); + if (ret < 0) { + fprintf(stderr, "glfs_unlink failed with ret: %d (%s)\n", ret, + strerror(errno)); + return -1; + } + + free(buf); + free(filename); +} - free (cmd); - free (cmd1); +static int +volfile_change(const char *volname) +{ + int ret = 0; + char *cmd = NULL, *cmd1 = NULL; + + ret = asprintf(&cmd, "gluster volume set %s stat-prefetch off", volname); + if (ret < 0) { + fprintf(stderr, "cannot construct cli command string (%s)", + strerror(errno)); return ret; + } + + ret = asprintf(&cmd1, "gluster volume set %s stat-prefetch on", volname); + if (ret < 0) { + fprintf(stderr, "cannot construct cli command string (%s)", + strerror(errno)); + return ret; + } + + ret = system(cmd); + if (ret < 0) { + fprintf(stderr, "stat-prefetch off on (%s) failed", volname); + return ret; + } + + ret = system(cmd1); + if (ret < 0) { + fprintf(stderr, "stat-prefetch on on (%s) failed", volname); + return ret; + } + + free(cmd); + free(cmd1); + return ret; } int -main (int argc, char *argv[]) +main(int argc, char *argv[]) { - glfs_t *fs = NULL; - int ret = 0; - int i = 0; - glfs_fd_t *fd = NULL; - glfs_fd_t *fd1 = NULL; - char *topdir = "topdir", *filename = "file1"; - char *buf = NULL; - char *logfile = NULL; - char *hostname = NULL; - - if (argc != 4) { - fprintf (stderr, - "Expect following args %s <hostname> <Vol> <log file>\n" - , argv[0]); - return -1; + glfs_t *fs = NULL; + int ret = 0; + int i = 0; + glfs_fd_t *fd = NULL; + glfs_fd_t *fd1 = NULL; + char *topdir = "topdir", *filename = "file1"; + char *buf = NULL; + char *logfile = NULL; + char *hostname = NULL; + + if (argc != 4) { + fprintf(stderr, + "Expect following args %s <hostname> <Vol> <log file>\n", + argv[0]); + return -1; + } + + hostname = argv[1]; + logfile = argv[3]; + + for (i = 0; i < TEST_CASE_LOOP; i++) { + fs = glfs_new(argv[2]); + if (!fs) { + fprintf(stderr, "glfs_new: returned NULL (%s)\n", strerror(errno)); + return -1; } - hostname = argv[1]; - logfile = argv[3]; - - for (i = 0; i < TEST_CASE_LOOP; i++) { - fs = glfs_new (argv[2]); - if (!fs) { - fprintf (stderr, "glfs_new: returned NULL (%s)\n", - strerror (errno)); - return -1; - } - - ret = glfs_set_volfile_server (fs, "tcp", hostname, 24007); - if (ret < 0) { - fprintf (stderr, "glfs_set_volfile_server failed ret:%d (%s)\n", - ret, strerror (errno)); - return -1; - } - - ret = glfs_set_logging (fs, logfile, 7); - if (ret < 0) { - fprintf (stderr, "glfs_set_logging failed with ret: %d (%s)\n", - ret, strerror (errno)); - return -1; - } - - ret = glfs_init (fs); - if (ret < 0) { - fprintf (stderr, "glfs_init failed with ret: %d (%s)\n", - ret, strerror (errno)); - return -1; - } - - ret = large_number_of_fops (fs); - if (ret < 0) - return -1; - - ret = large_read_write (fs); - if (ret < 0) - return -1; - - ret = volfile_change (argv[2]); - if (ret < 0) - return -1; - - ret = large_number_of_fops (fs); - if (ret < 0) - return -1; - - ret = large_read_write (fs); - if (ret < 0) - return -1; - - ret = glfs_fini (fs); - if (ret < 0) { - fprintf (stderr, "glfs_fini failed with ret: %d (%s)\n", - ret, strerror (errno)); - return -1; - } + ret = glfs_set_volfile_server(fs, "tcp", hostname, 24007); + if (ret < 0) { + fprintf(stderr, "glfs_set_volfile_server failed ret:%d (%s)\n", ret, + strerror(errno)); + return -1; + } + + ret = glfs_set_logging(fs, logfile, 7); + if (ret < 0) { + fprintf(stderr, "glfs_set_logging failed with ret: %d (%s)\n", ret, + strerror(errno)); + return -1; + } + + ret = glfs_init(fs); + if (ret < 0) { + fprintf(stderr, "glfs_init failed with ret: %d (%s)\n", ret, + strerror(errno)); + return -1; + } + + ret = large_number_of_fops(fs); + if (ret < 0) + return -1; + + ret = large_read_write(fs); + if (ret < 0) + return -1; + + ret = volfile_change(argv[2]); + if (ret < 0) + return -1; + + ret = large_number_of_fops(fs); + if (ret < 0) + return -1; + + ret = large_read_write(fs); + if (ret < 0) + return -1; + + ret = glfs_fini(fs); + if (ret < 0) { + fprintf(stderr, "glfs_fini failed with ret: %d (%s)\n", ret, + strerror(errno)); + return -1; } - return 0; + } + return 0; } diff --git a/tests/bugs/gfapi/bug-1319374.c b/tests/bugs/gfapi/bug-1319374.c index bf2da998d6e..ea0dfb6b0f2 100644 --- a/tests/bugs/gfapi/bug-1319374.c +++ b/tests/bugs/gfapi/bug-1319374.c @@ -3,128 +3,129 @@ #include <errno.h> #include <stdio.h> #include <stdlib.h> +#include <string.h> #define NO_INIT 1 glfs_t * setup_new_client(char *hostname, char *volname, char *log_file, int flag) { - int ret = 0; - glfs_t *fs = NULL; - - fs = glfs_new (volname); - if (!fs) { - fprintf (stderr, "\nglfs_new: returned NULL (%s)\n", - strerror (errno)); - goto error; - } - - ret = glfs_set_volfile_server (fs, "tcp", hostname, 24007); - if (ret < 0) { - fprintf (stderr, "\nglfs_set_volfile_server failed ret:%d (%s)\n", - ret, strerror (errno)); - goto error; - } - - ret = glfs_set_logging (fs, log_file, 7); - if (ret < 0) { - fprintf (stderr, "\nglfs_set_logging failed with ret: %d (%s)\n", - ret, strerror (errno)); - goto error; - } - - if (flag == NO_INIT) - goto out; - - ret = glfs_init (fs); - if (ret < 0) { - fprintf (stderr, "\nglfs_init failed with ret: %d (%s)\n", - ret, strerror (errno)); - goto error; - } + int ret = 0; + glfs_t *fs = NULL; + + fs = glfs_new(volname); + if (!fs) { + fprintf(stderr, "\nglfs_new: returned NULL (%s)\n", strerror(errno)); + goto error; + } + + ret = glfs_set_volfile_server(fs, "tcp", hostname, 24007); + if (ret < 0) { + fprintf(stderr, "\nglfs_set_volfile_server failed ret:%d (%s)\n", ret, + strerror(errno)); + goto error; + } + + ret = glfs_set_logging(fs, log_file, 7); + if (ret < 0) { + fprintf(stderr, "\nglfs_set_logging failed with ret: %d (%s)\n", ret, + strerror(errno)); + goto error; + } + + if (flag == NO_INIT) + goto out; + + ret = glfs_init(fs); + if (ret < 0) { + fprintf(stderr, "\nglfs_init failed with ret: %d (%s)\n", ret, + strerror(errno)); + goto error; + } out: - return fs; + return fs; error: - return NULL; + return NULL; } int -main (int argc, char *argv[]) +main(int argc, char *argv[]) { - int ret = 0; - glfs_t *fs1 = NULL; - glfs_t *fs2 = NULL; - glfs_t *fs3 = NULL; - char *volname = NULL; - char *log_file = NULL; - char *hostname = NULL; - - if (argc != 4) { - fprintf (stderr, - "Expect following args %s <hostname> <Vol> <log file location>\n" - , argv[0]); - return -1; - } - - hostname = argv[1]; - volname = argv[2]; - log_file = argv[3]; - - fs1 = setup_new_client (hostname, volname, log_file, NO_INIT); - if (!fs1) { - fprintf (stderr, "\nsetup_new_client: returned NULL (%s)\n", - strerror (errno)); - goto error; - } - - fs2 = setup_new_client (hostname, volname, log_file, 0); - if (!fs2) { - fprintf (stderr, "\nsetup_new_client: returned NULL (%s)\n", - strerror (errno)); - goto error; - } - - fs3 = setup_new_client (hostname, volname, log_file, 0); - if (!fs3) { - fprintf (stderr, "\nsetup_new_client: returned NULL (%s)\n", - strerror (errno)); - goto error; - } - - ret = glfs_fini (fs3); - if (ret < 0) { - fprintf (stderr, "glfs_fini failed with ret: %d (%s)\n", - ret, strerror (errno)); - goto error; - } - - /* The crash is seen in gf_log_flush_timeout_cbk(), and this gets - * triggered when 30s timer expires, hence the sleep of 31s - */ - sleep (31); - ret = glfs_fini (fs2); - if (ret < 0) { - fprintf (stderr, "glfs_fini failed with ret: %d (%s)\n", - ret, strerror (errno)); - goto error; - } - - ret = glfs_init (fs1); - if (ret < 0) { - fprintf (stderr, "\nglfs_init failed with ret: %d (%s)\n", - ret, strerror (errno)); - goto error; - } - - ret = glfs_fini (fs1); - if (ret < 0) { - fprintf (stderr, "glfs_fini failed with ret: %d (%s)\n", - ret, strerror (errno)); - goto error; - } - - return 0; -error: + int ret = 0; + glfs_t *fs1 = NULL; + glfs_t *fs2 = NULL; + glfs_t *fs3 = NULL; + char *volname = NULL; + char *log_file = NULL; + char *hostname = NULL; + + if (argc != 4) { + fprintf( + stderr, + "Expect following args %s <hostname> <Vol> <log file location>\n", + argv[0]); return -1; + } + + hostname = argv[1]; + volname = argv[2]; + log_file = argv[3]; + + fs1 = setup_new_client(hostname, volname, log_file, NO_INIT); + if (!fs1) { + fprintf(stderr, "\nsetup_new_client: returned NULL (%s)\n", + strerror(errno)); + goto error; + } + + fs2 = setup_new_client(hostname, volname, log_file, 0); + if (!fs2) { + fprintf(stderr, "\nsetup_new_client: returned NULL (%s)\n", + strerror(errno)); + goto error; + } + + fs3 = setup_new_client(hostname, volname, log_file, 0); + if (!fs3) { + fprintf(stderr, "\nsetup_new_client: returned NULL (%s)\n", + strerror(errno)); + goto error; + } + + ret = glfs_fini(fs3); + if (ret < 0) { + fprintf(stderr, "glfs_fini failed with ret: %d (%s)\n", ret, + strerror(errno)); + goto error; + } + + /* The crash is seen in gf_log_flush_timeout_cbk(), and this gets + * triggered when 30s timer expires, hence the sleep of 31s + */ + sleep(31); + ret = glfs_fini(fs2); + if (ret < 0) { + fprintf(stderr, "glfs_fini failed with ret: %d (%s)\n", ret, + strerror(errno)); + goto error; + } + + ret = glfs_init(fs1); + if (ret < 0) { + fprintf(stderr, "\nglfs_init failed with ret: %d (%s)\n", ret, + strerror(errno)); + goto error; + } + + ret = glfs_fini(fs1); + if (ret < 0) { + fprintf(stderr, "glfs_fini failed with ret: %d (%s)\n", ret, + strerror(errno)); + goto error; + } + + return 0; +error: + return -1; } diff --git a/tests/bugs/gfapi/bug-1447266/1460514.c b/tests/bugs/gfapi/bug-1447266/1460514.c index f04d2d1463f..c721559a668 100644 --- a/tests/bugs/gfapi/bug-1447266/1460514.c +++ b/tests/bugs/gfapi/bug-1447266/1460514.c @@ -9,135 +9,142 @@ #include <glusterfs/api/glfs.h> #include <glusterfs/api/glfs-handles.h> -#define LOG_ERR(func, ret) do { \ - if (ret != 0) { \ - fprintf (stderr, "%s : returned error %d (%s)\n", \ - func, ret, strerror (errno)); \ - goto out; \ - } else { \ - fprintf (stderr, "%s : returned %d\n", func, ret); \ - } \ - } while (0) +#define LOG_ERR(func, ret) \ + do { \ + if (ret != 0) { \ + fprintf(stderr, "%s : returned error %d (%s)\n", func, ret, \ + strerror(errno)); \ + goto out; \ + } else { \ + fprintf(stderr, "%s : returned %d\n", func, ret); \ + } \ + } while (0) int -main (int argc, char *argv[]) +main(int argc, char *argv[]) { - int ret = 0; - glfs_t *fs = NULL; - struct glfs_object *root = NULL, *dir = NULL, *subdir = NULL; - struct stat sb = {0, }; - char *dirname = "dir"; - char *subdirname = "subdir"; - char *logfile = NULL; - char *volname = NULL; - char *hostname = NULL; - unsigned char subdir_handle[GFAPI_HANDLE_LENGTH] = {'\0'}; - - if (argc != 4) { - fprintf (stderr, "Invalid argument\n"); - exit(1); - } - - hostname = argv[1]; - volname = argv[2]; - logfile = argv[3]; - - fs = glfs_new (volname); - if (!fs) { - fprintf (stderr, "glfs_new: returned NULL\n"); - ret = -1; - goto out; - } - - ret = glfs_set_volfile_server (fs, "tcp", hostname, 24007); - LOG_ERR("glfs_set_volfile_server", ret); - - ret = glfs_set_logging (fs, logfile, 7); - LOG_ERR("glfs_set_logging", ret); - - ret = glfs_init (fs); - LOG_ERR("first attempt glfs_init", ret); - - root = glfs_h_lookupat (fs, NULL, "/", &sb, 0); - if (root == NULL) { - fprintf (stderr, "glfs_h_lookupat: error on lookup of / ,%s\n", - strerror (errno)); - goto out; - } - dir = glfs_h_mkdir (fs, root, dirname, 0644, &sb); - if (dir == NULL) { - fprintf (stderr, "glfs_h_mkdir: error on directory creation dir ,%s\n", - strerror (errno)); - goto out; - } - subdir = glfs_h_mkdir (fs, root, subdirname, 0644, &sb); - if (subdir == NULL) { - fprintf (stderr, "glfs_h_mkdir: error on directory creation subdir ,%s\n", - strerror (errno)); - goto out; - } - ret = glfs_h_extract_handle (subdir, subdir_handle, - GFAPI_HANDLE_LENGTH); - if (ret < 0) { - fprintf (stderr, "glfs_h_extract_handle: error extracting handle of %s: %s\n", - subdirname, strerror (errno)); - goto out; - } - - glfs_h_close (subdir); - subdir = NULL; - glfs_h_close (dir); - dir = NULL; - - if (fs) { - ret = glfs_fini(fs); - fprintf (stderr, "glfs_fini(fs) returned %d \n", ret); - } - - fs = NULL; - - fs = glfs_new (volname); - if (!fs) { - fprintf (stderr, "glfs_new: returned NULL\n"); - ret = -1; - goto out; - } - - ret = glfs_set_volfile_server (fs, "tcp", hostname, 24007); - LOG_ERR("glfs_set_volfile_server", ret); - - ret = glfs_set_logging (fs, logfile, 7); - LOG_ERR("glfs_set_logging", ret); - - ret = glfs_init (fs); - LOG_ERR("second attempt glfs_init", ret); - - subdir = glfs_h_create_from_handle (fs, subdir_handle, GFAPI_HANDLE_LENGTH, - &sb); - if (subdir == NULL) { - fprintf (stderr, "glfs_h_create_from_handle: error on create of %s: from (%p),%s\n", - subdirname, subdir_handle, strerror (errno)); - goto out; - } - dir = glfs_h_lookupat (fs, subdir, "..", &sb, 0); - if (dir == NULL) { - fprintf (stderr, "glfs_h_lookupat: error on directory lookup dir using .. ,%s\n", - strerror (errno)); - goto out; - } + int ret = 0; + glfs_t *fs = NULL; + struct glfs_object *root = NULL, *dir = NULL, *subdir = NULL; + struct stat sb = { + 0, + }; + char *dirname = "dir"; + char *subdirname = "subdir"; + char *logfile = NULL; + char *volname = NULL; + char *hostname = NULL; + unsigned char subdir_handle[GFAPI_HANDLE_LENGTH] = {'\0'}; + + if (argc != 4) { + fprintf(stderr, "Invalid argument\n"); + exit(1); + } + + hostname = argv[1]; + volname = argv[2]; + logfile = argv[3]; + + fs = glfs_new(volname); + if (!fs) { + fprintf(stderr, "glfs_new: returned NULL\n"); + ret = -1; + goto out; + } + + ret = glfs_set_volfile_server(fs, "tcp", hostname, 24007); + LOG_ERR("glfs_set_volfile_server", ret); + + ret = glfs_set_logging(fs, logfile, 7); + LOG_ERR("glfs_set_logging", ret); + + ret = glfs_init(fs); + LOG_ERR("first attempt glfs_init", ret); + + root = glfs_h_lookupat(fs, NULL, "/", &sb, 0); + if (root == NULL) { + fprintf(stderr, "glfs_h_lookupat: error on lookup of / ,%s\n", + strerror(errno)); + goto out; + } + dir = glfs_h_mkdir(fs, root, dirname, 0644, &sb); + if (dir == NULL) { + fprintf(stderr, "glfs_h_mkdir: error on directory creation dir ,%s\n", + strerror(errno)); + goto out; + } + subdir = glfs_h_mkdir(fs, root, subdirname, 0644, &sb); + if (subdir == NULL) { + fprintf(stderr, + "glfs_h_mkdir: error on directory creation subdir ,%s\n", + strerror(errno)); + goto out; + } + ret = glfs_h_extract_handle(subdir, subdir_handle, GFAPI_HANDLE_LENGTH); + if (ret < 0) { + fprintf(stderr, + "glfs_h_extract_handle: error extracting handle of %s: %s\n", + subdirname, strerror(errno)); + goto out; + } + + glfs_h_close(subdir); + subdir = NULL; + glfs_h_close(dir); + dir = NULL; + + if (fs) { + ret = glfs_fini(fs); + fprintf(stderr, "glfs_fini(fs) returned %d \n", ret); + } + + fs = NULL; + + fs = glfs_new(volname); + if (!fs) { + fprintf(stderr, "glfs_new: returned NULL\n"); + ret = -1; + goto out; + } + + ret = glfs_set_volfile_server(fs, "tcp", hostname, 24007); + LOG_ERR("glfs_set_volfile_server", ret); + + ret = glfs_set_logging(fs, logfile, 7); + LOG_ERR("glfs_set_logging", ret); + + ret = glfs_init(fs); + LOG_ERR("second attempt glfs_init", ret); + + subdir = glfs_h_create_from_handle(fs, subdir_handle, GFAPI_HANDLE_LENGTH, + &sb); + if (subdir == NULL) { + fprintf( + stderr, + "glfs_h_create_from_handle: error on create of %s: from (%p),%s\n", + subdirname, subdir_handle, strerror(errno)); + goto out; + } + dir = glfs_h_lookupat(fs, subdir, "..", &sb, 0); + if (dir == NULL) { + fprintf(stderr, + "glfs_h_lookupat: error on directory lookup dir using .. ,%s\n", + strerror(errno)); + goto out; + } out: - if (subdir) - glfs_h_close (subdir); - if (dir) - glfs_h_close (dir); - - if (fs) { - ret = glfs_fini(fs); - fprintf (stderr, "glfs_fini(fs) returned %d \n", ret); - } - - if (ret) - exit(1); - exit(0); + if (subdir) + glfs_h_close(subdir); + if (dir) + glfs_h_close(dir); + + if (fs) { + ret = glfs_fini(fs); + fprintf(stderr, "glfs_fini(fs) returned %d \n", ret); + } + + if (ret) + exit(1); + exit(0); } diff --git a/tests/bugs/gfapi/bug-1447266/bug-1447266.c b/tests/bugs/gfapi/bug-1447266/bug-1447266.c index e4b3c888a57..2b7e2d627fe 100644 --- a/tests/bugs/gfapi/bug-1447266/bug-1447266.c +++ b/tests/bugs/gfapi/bug-1447266/bug-1447266.c @@ -4,102 +4,104 @@ #include <string.h> #include <stdlib.h> #define TOTAL_ARGS 4 -int main(int argc, char *argv[]) +int +main(int argc, char *argv[]) { - char *cwd = (char *)malloc(PATH_MAX*sizeof(char *)); - char *resolved = NULL; - char *result = NULL; - char *buf = NULL; - struct stat st; - char *path = NULL; - int ret; - - if (argc != TOTAL_ARGS) { - printf ("Please give all required command line args.\n" - "Format : <volname> <server_ip> <path_name>\n"); - goto out; - } - - glfs_t *fs = glfs_new (argv[1]); - - if (fs == NULL) { - printf ("glfs_new: %s\n", strerror(errno)); - /* No need to fail the test for this error */ - ret = 0; - goto out; - } - - ret = glfs_set_volfile_server(fs, "tcp", argv[2], 24007); - if (ret) { - printf ("glfs_set_volfile_server: %s\n", strerror(errno)); - /* No need to fail the test for this error */ - ret = 0; - goto out; - } - - path = argv[3]; - - ret = glfs_set_logging(fs, "/tmp/gfapi.log", 7); - if (ret) { - printf ("glfs_set_logging: %s\n", strerror(errno)); - /* No need to fail the test for this error */ - ret = 0; - goto out; - } - - ret = glfs_init(fs); - if (ret) { - printf ("glfs_init: %s\n", strerror(errno)); - /* No need to fail the test for this error */ - ret = 0; - goto out; - } - - sleep(1); - - ret = glfs_chdir(fs, path); - if (ret) { - printf ("glfs_chdir: %s\n", strerror(errno)); - goto out; - } - - buf = glfs_getcwd(fs, cwd, PATH_MAX); - if (cwd == NULL) { - printf ("glfs_getcwd: %s\n", strerror(errno)); - goto out; - } - - printf ("\ncwd = %s\n\n", cwd); - - result = glfs_realpath(fs, path, resolved); - if (result == NULL) { - printf ("glfs_realpath: %s\n", strerror(errno)); - goto out; - } - - ret = glfs_stat(fs, path, &st); - if (ret) { - printf ("glfs_stat: %s\n", strerror(errno)); - goto out; - } - if (cwd) - free(cwd); - - result = glfs_realpath(fs, path, resolved); - if (result == NULL) { - printf ("glfs_realpath: %s\n", strerror(errno)); - goto out; - } - - ret = glfs_fini(fs); - if (ret) { - printf ("glfs_fini: %s\n", strerror(errno)); - /* No need to fail the test for this error */ - ret = 0; - goto out; - } - - printf ("\n"); + char *cwd = (char *)malloc(PATH_MAX * sizeof(char *)); + char *resolved = NULL; + char *result = NULL; + char *buf = NULL; + struct stat st; + char *path = NULL; + int ret; + + if (argc != TOTAL_ARGS) { + printf( + "Please give all required command line args.\n" + "Format : <volname> <server_ip> <path_name>\n"); + goto out; + } + + glfs_t *fs = glfs_new(argv[1]); + + if (fs == NULL) { + printf("glfs_new: %s\n", strerror(errno)); + /* No need to fail the test for this error */ + ret = 0; + goto out; + } + + ret = glfs_set_volfile_server(fs, "tcp", argv[2], 24007); + if (ret) { + printf("glfs_set_volfile_server: %s\n", strerror(errno)); + /* No need to fail the test for this error */ + ret = 0; + goto out; + } + + path = argv[3]; + + ret = glfs_set_logging(fs, "/tmp/gfapi.log", 7); + if (ret) { + printf("glfs_set_logging: %s\n", strerror(errno)); + /* No need to fail the test for this error */ + ret = 0; + goto out; + } + + ret = glfs_init(fs); + if (ret) { + printf("glfs_init: %s\n", strerror(errno)); + /* No need to fail the test for this error */ + ret = 0; + goto out; + } + + sleep(1); + + ret = glfs_chdir(fs, path); + if (ret) { + printf("glfs_chdir: %s\n", strerror(errno)); + goto out; + } + + buf = glfs_getcwd(fs, cwd, PATH_MAX); + if (cwd == NULL) { + printf("glfs_getcwd: %s\n", strerror(errno)); + goto out; + } + + printf("\ncwd = %s\n\n", cwd); + + result = glfs_realpath(fs, path, resolved); + if (result == NULL) { + printf("glfs_realpath: %s\n", strerror(errno)); + goto out; + } + + ret = glfs_stat(fs, path, &st); + if (ret) { + printf("glfs_stat: %s\n", strerror(errno)); + goto out; + } + if (cwd) + free(cwd); + + result = glfs_realpath(fs, path, resolved); + if (result == NULL) { + printf("glfs_realpath: %s\n", strerror(errno)); + goto out; + } + + ret = glfs_fini(fs); + if (ret) { + printf("glfs_fini: %s\n", strerror(errno)); + /* No need to fail the test for this error */ + ret = 0; + goto out; + } + + printf("\n"); out: - return ret; + return ret; } diff --git a/tests/bugs/gfapi/bug-1447266/bug-1447266.t b/tests/bugs/gfapi/bug-1447266/bug-1447266.t index 2bf72f8c6d7..45547f4f0e7 100644 --- a/tests/bugs/gfapi/bug-1447266/bug-1447266.t +++ b/tests/bugs/gfapi/bug-1447266/bug-1447266.t @@ -56,5 +56,5 @@ TEST ! $(dirname $0)/bug-1447266 $V0 $H0 "/.snaps/.././snap3" TEST $(dirname $0)/bug-1447266 $V0 $H0 "/.snaps/../." TEST $(dirname $0)/bug-1447266 $V0 $H0 "/.snaps/./snap1/./../snap1/dir/." -cleanup_tester $(dirname $0)/bug-1319374 +cleanup_tester $(dirname $0)/bug-1447266 cleanup; diff --git a/tests/bugs/gfapi/bug-1630804/gfapi-bz1630804.c b/tests/bugs/gfapi/bug-1630804/gfapi-bz1630804.c new file mode 100644 index 00000000000..d151784627c --- /dev/null +++ b/tests/bugs/gfapi/bug-1630804/gfapi-bz1630804.c @@ -0,0 +1,112 @@ +#include <inttypes.h> +#include <stdio.h> +#include <string.h> +#include <errno.h> +#include <stdlib.h> +#include <glusterfs/api/glfs.h> +#include <glusterfs/api/glfs-handles.h> + +#define VALIDATE_AND_GOTO_LABEL_ON_ERROR(func, ret, label) \ + do { \ + if (ret < 0) { \ + fprintf(stderr, "%s : returned error %d (%s)\n", func, ret, \ + strerror(errno)); \ + goto label; \ + } \ + } while (0) + +int +main(int argc, char *argv[]) +{ + int ret = -1; + int flags = O_WRONLY | O_CREAT | O_TRUNC; + int do_write = 0; + glfs_t *fs = NULL; + glfs_fd_t *fd1 = NULL; + glfs_fd_t *fd2 = NULL; + char *volname = NULL; + char *logfile = NULL; + const char *dirname = "/some_dir1"; + const char *filename = "/some_dir1/testfile"; + const char *short_filename = "testfile"; + struct stat sb; + char buf[512]; + struct dirent *entry = NULL; + + if (argc != 4) { + fprintf(stderr, "Invalid argument\n"); + fprintf(stderr, "Usage: %s <volname> <logfile> <do-write [0/1]\n", + argv[0]); + return 1; + } + + volname = argv[1]; + logfile = argv[2]; + do_write = atoi(argv[3]); + + fs = glfs_new(volname); + if (!fs) + VALIDATE_AND_GOTO_LABEL_ON_ERROR("glfs_new", ret, out); + + ret = glfs_set_volfile_server(fs, "tcp", "localhost", 24007); + VALIDATE_AND_GOTO_LABEL_ON_ERROR("glfs_set_volfile_server", ret, out); + + ret = glfs_set_logging(fs, logfile, 7); + VALIDATE_AND_GOTO_LABEL_ON_ERROR("glfs_set_logging", ret, out); + + ret = glfs_init(fs); + VALIDATE_AND_GOTO_LABEL_ON_ERROR("glfs_init", ret, out); + + ret = glfs_mkdir(fs, dirname, 0755); + if (ret && errno != EEXIST) + VALIDATE_AND_GOTO_LABEL_ON_ERROR("glfs_mkdir", ret, out); + + fd1 = glfs_creat(fs, filename, flags, 0644); + if (fd1 == NULL) { + ret = -1; + VALIDATE_AND_GOTO_LABEL_ON_ERROR("glfs_creat", ret, out); + } + + if (do_write) { + ret = glfs_write(fd1, "hello world", 11, flags); + VALIDATE_AND_GOTO_LABEL_ON_ERROR("glfs_write", ret, out); + } + + fd2 = glfs_opendir(fs, dirname); + if (fd2 == NULL) { + ret = -1; + VALIDATE_AND_GOTO_LABEL_ON_ERROR("glfs_opendir", ret, out); + } + + do { + ret = glfs_readdirplus_r(fd2, &sb, (struct dirent *)buf, &entry); + if (entry != NULL) { + if (!strcmp(entry->d_name, short_filename)) { + if (sb.st_mode == 0) { + fprintf( + stderr, + "Mode bits are incorrect: d_name - %s, st_mode - %jd\n", + entry->d_name, (intmax_t)sb.st_mode); + ret = -1; + goto out; + } + } + } + } while (entry != NULL); + +out: + if (fd1 != NULL) + glfs_close(fd1); + if (fd2 != NULL) + glfs_closedir(fd2); + + if (fs) { + /* + * If this fails (as it does on Special Snowflake NetBSD for no + * good reason), it shouldn't affect the result of the test. + */ + (void)glfs_fini(fs); + } + + return ret; +} diff --git a/tests/bugs/gfapi/bug-1630804/gfapi-bz1630804.t b/tests/bugs/gfapi/bug-1630804/gfapi-bz1630804.t new file mode 100644 index 00000000000..ac59aeeb47b --- /dev/null +++ b/tests/bugs/gfapi/bug-1630804/gfapi-bz1630804.t @@ -0,0 +1,25 @@ +#!/bin/bash + +. $(dirname $0)/../../../include.rc +. $(dirname $0)/../../../volume.rc + +cleanup; + +TEST glusterd + +TEST $CLI volume create $V0 ${H0}:$B0/brick1; +EXPECT 'Created' volinfo_field $V0 'Status'; + +TEST $CLI volume start $V0; +EXPECT 'Started' volinfo_field $V0 'Status'; + +logdir=`gluster --print-logdir` + +build_tester $(dirname $0)/gfapi-bz1630804.c -lgfapi + +TEST ./$(dirname $0)/gfapi-bz1630804 $V0 $logdir/gfapi-bz1630804.log 0 +TEST ./$(dirname $0)/gfapi-bz1630804 $V0 $logdir/gfapi-bz1630804.log 1 + +cleanup_tester $(dirname $0)/gfapi-trunc + +cleanup; diff --git a/tests/bugs/gfapi/glfs_vol_set_IO_ERR.c b/tests/bugs/gfapi/glfs_vol_set_IO_ERR.c index 68011171744..f38f01144d3 100644 --- a/tests/bugs/gfapi/glfs_vol_set_IO_ERR.c +++ b/tests/bugs/gfapi/glfs_vol_set_IO_ERR.c @@ -10,156 +10,154 @@ glfs_t * setup_new_client(char *hostname, char *volname, char *log_fileile) { - int ret = 0; - glfs_t *fs = NULL; - - fs = glfs_new (volname); - if (!fs) { - fprintf (stderr, "\nglfs_new: returned NULL (%s)\n", - strerror (errno)); - goto error; - } - - ret = glfs_set_volfile_server (fs, "tcp", hostname, 24007); - if (ret < 0) { - fprintf (stderr, "\nglfs_set_volfile_server failed ret:%d (%s)\n", - ret, strerror (errno)); - goto error; - } - - ret = glfs_set_logging (fs, log_fileile, 7); - if (ret < 0) { - fprintf (stderr, "\nglfs_set_logging failed with ret: %d (%s)\n", - ret, strerror (errno)); - goto error; - } - - ret = glfs_init (fs); - if (ret < 0) { - fprintf (stderr, "\nglfs_init failed with ret: %d (%s)\n", - ret, strerror (errno)); - goto error; - } - return fs; + int ret = 0; + glfs_t *fs = NULL; + + fs = glfs_new(volname); + if (!fs) { + fprintf(stderr, "\nglfs_new: returned NULL (%s)\n", strerror(errno)); + goto error; + } + + ret = glfs_set_volfile_server(fs, "tcp", hostname, 24007); + if (ret < 0) { + fprintf(stderr, "\nglfs_set_volfile_server failed ret:%d (%s)\n", ret, + strerror(errno)); + goto error; + } + + ret = glfs_set_logging(fs, log_fileile, 7); + if (ret < 0) { + fprintf(stderr, "\nglfs_set_logging failed with ret: %d (%s)\n", ret, + strerror(errno)); + goto error; + } + + ret = glfs_init(fs); + if (ret < 0) { + fprintf(stderr, "\nglfs_init failed with ret: %d (%s)\n", ret, + strerror(errno)); + goto error; + } + return fs; error: - return NULL; + return NULL; } int -write_something (glfs_t *fs) +write_something(glfs_t *fs) { - glfs_fd_t *fd = NULL; - char *buf = NULL; - int ret = 0; - int j = 0; - - fd = glfs_creat (fs, "filename", O_RDWR, 0644); - if (!fd) { - fprintf (stderr, "%s: (%p) %s\n", "filename", fd, - strerror (errno)); - return -1; - } + glfs_fd_t *fd = NULL; + char *buf = NULL; + int ret = 0; + int j = 0; + + fd = glfs_creat(fs, "filename", O_RDWR, 0644); + if (!fd) { + fprintf(stderr, "%s: (%p) %s\n", "filename", fd, strerror(errno)); + return -1; + } + + buf = (char *)malloc(WRITE_SIZE); + memset(buf, '-', WRITE_SIZE); - buf = (char *) malloc (WRITE_SIZE); - memset (buf, '-', WRITE_SIZE); - - for (j = 0; j < 4; j++) { - ret = glfs_write (fd, buf, WRITE_SIZE, 0); - if (ret < 0) { - fprintf (stderr, "Write(%s): %d (%s)\n", "filename", ret, - strerror (errno)); - return ret; - } - glfs_lseek (fd, 0, SEEK_SET); + for (j = 0; j < 4; j++) { + ret = glfs_write(fd, buf, WRITE_SIZE, 0); + if (ret < 0) { + fprintf(stderr, "Write(%s): %d (%s)\n", "filename", ret, + strerror(errno)); + return ret; } - return 0; + glfs_lseek(fd, 0, SEEK_SET); + } + return 0; } static int -volfile_change (const char *volname) { - int ret = 0; - char *cmd = NULL, *cmd1 = NULL; - - ret = asprintf (&cmd, "gluster volume set %s quick-read on", - volname); - if (ret < 0) { - fprintf (stderr, "cannot construct cli command string (%s)", - strerror (errno)); - return ret; - } +volfile_change(const char *volname) +{ + int ret = 0; + char *cmd = NULL, *cmd1 = NULL; - ret = asprintf (&cmd1, "gluster volume set %s quick-read off", - volname); - if (ret < 0) { - fprintf (stderr, "cannot construct cli command string (%s)", - strerror (errno)); - return ret; - } + ret = asprintf(&cmd, "gluster volume set %s quick-read on", volname); + if (ret < 0) { + fprintf(stderr, "cannot construct cli command string (%s)", + strerror(errno)); + return ret; + } - ret = system (cmd); - if (ret < 0) { - fprintf (stderr, "quick-read off on (%s) failed", volname); - return ret; - } + ret = asprintf(&cmd1, "gluster volume set %s quick-read off", volname); + if (ret < 0) { + fprintf(stderr, "cannot construct cli command string (%s)", + strerror(errno)); + return ret; + } - ret = system (cmd1); - if (ret < 0) { - fprintf (stderr, "quick-read on on (%s) failed", volname); - return ret; - } + ret = system(cmd); + if (ret < 0) { + fprintf(stderr, "quick-read off on (%s) failed", volname); + return ret; + } - ret = system (cmd); - if (ret < 0) { - fprintf (stderr, "quick-read off on (%s) failed", volname); - return ret; - } + ret = system(cmd1); + if (ret < 0) { + fprintf(stderr, "quick-read on on (%s) failed", volname); + return ret; + } - free (cmd); - free (cmd1); + ret = system(cmd); + if (ret < 0) { + fprintf(stderr, "quick-read off on (%s) failed", volname); return ret; + } + + free(cmd); + free(cmd1); + return ret; } int -main (int argc, char *argv[]) +main(int argc, char *argv[]) { - int ret = 0; - glfs_t *fs = NULL; - char buf[100]; - glfs_fd_t *fd = NULL; - - if (argc != 4) { - fprintf (stderr, - "Expect following args %s <hostname> <Vol> <log file location>\n" - , argv[0]); - return -1; - } - - fs = setup_new_client (argv[1], argv[2], argv[3]); - if (!fs) - goto error; - - ret = volfile_change (argv[2]); - if (ret < 0) - goto error; - - /* This is required as volfile change takes a while to reach this - * gfapi client and precess the graph change. Without this the issue - * cannot be reproduced as in cannot be tested. - */ - sleep (10); - - ret = write_something (fs); - if (ret < 0) - goto error; - - ret = glfs_fini (fs); - if (ret < 0) { - fprintf (stderr, "glfs_fini failed with ret: %d (%s)\n", - ret, strerror (errno)); - goto error; - } - - return 0; -error: + int ret = 0; + glfs_t *fs = NULL; + char buf[100]; + glfs_fd_t *fd = NULL; + + if (argc != 4) { + fprintf( + stderr, + "Expect following args %s <hostname> <Vol> <log file location>\n", + argv[0]); return -1; + } + + fs = setup_new_client(argv[1], argv[2], argv[3]); + if (!fs) + goto error; + + ret = volfile_change(argv[2]); + if (ret < 0) + goto error; + + /* This is required as volfile change takes a while to reach this + * gfapi client and precess the graph change. Without this the issue + * cannot be reproduced as in cannot be tested. + */ + sleep(10); + + ret = write_something(fs); + if (ret < 0) + goto error; + + ret = glfs_fini(fs); + if (ret < 0) { + fprintf(stderr, "glfs_fini failed with ret: %d (%s)\n", ret, + strerror(errno)); + goto error; + } + + return 0; +error: + return -1; } diff --git a/tests/bugs/glusterd/859927/repl.t b/tests/bugs/glusterd/859927/repl.t index 70143e2c193..6e7c23b5b1d 100755 --- a/tests/bugs/glusterd/859927/repl.t +++ b/tests/bugs/glusterd/859927/repl.t @@ -23,6 +23,9 @@ TEST $CLI volume create $V0 replica 2 $H0:$B0/${V0}{1,2}; TEST $CLI volume set $V0 cluster.self-heal-daemon off TEST $CLI volume set $V0 performance.stat-prefetch off TEST $CLI volume set $V0 client-log-level DEBUG +TEST $CLI volume set $V0 cluster.data-self-heal on +TEST $CLI volume set $V0 cluster.metadata-self-heal on +TEST $CLI volume set $V0 cluster.entry-self-heal on TEST $CLI volume start $V0 TEST glusterfs --entry-timeout=0 --attribute-timeout=0 -s $H0 --volfile-id=$V0 $M0; diff --git a/tests/bugs/glusterd/brick-mux-validation-in-cluster.t b/tests/bugs/glusterd/brick-mux-validation-in-cluster.t new file mode 100644 index 00000000000..b6af487a791 --- /dev/null +++ b/tests/bugs/glusterd/brick-mux-validation-in-cluster.t @@ -0,0 +1,108 @@ +#!/bin/bash + +. $(dirname $0)/../../include.rc +. $(dirname $0)/../../cluster.rc + +function count_brick_processes { + pgrep glusterfsd | wc -l +} + +function count_brick_pids { + $CLI_1 --xml volume status all | sed -n '/.*<pid>\([^<]*\).*/s//\1/p' \ + | grep -v "N/A" | sort | uniq | wc -l +} + +function count_N/A_brick_pids { + $CLI_1 --xml volume status all | sed -n '/.*<pid>\([^<]*\).*/s//\1/p' \ + | grep -- '\-1' | sort | uniq | wc -l +} + +function check_peers { + $CLI_2 peer status | grep 'Peer in Cluster (Connected)' | wc -l +} + +cleanup; + +TEST launch_cluster 3 +TEST $CLI_1 peer probe $H2; +EXPECT_WITHIN $PROBE_TIMEOUT 1 peer_count + +TEST $CLI_1 peer probe $H3; +EXPECT_WITHIN $PROBE_TIMEOUT 2 peer_count + +TEST $CLI_1 volume set all cluster.brick-multiplex on +#bug-1609163 - bricks of normal volume should not attach to bricks of gluster_shared_storage volume + +##Create, start and mount meta_volume i.e., shared_storage +TEST $CLI_1 volume create $META_VOL replica 3 $H1:$B1/${META_VOL}1 $H2:$B2/${META_VOL}1 $H3:$B3/${META_VOL}1 +TEST $CLI_1 volume start $META_VOL +TEST mkdir -p $META_MNT +TEST glusterfs -s $H1 --volfile-id $META_VOL $META_MNT + +TEST $CLI_1 volume info gluster_shared_storage + +EXPECT 3 count_brick_processes + +#create and start a new volume +TEST $CLI_1 volume create $V0 replica 3 $H1:$B1/${V0}{1..3} $H2:$B2/${V0}{1..3} +TEST $CLI_1 volume start $V0 + +# bricks of normal volume should not attach to bricks of gluster_shared_storage volume +EXPECT 5 count_brick_processes + +#bug-1549996 - stale brick processes on the nodes after volume deletion + +TEST $CLI_1 volume create $V1 replica 3 $H1:$B1/${V1}{1..3} $H2:$B2/${V1}{1..3} +TEST $CLI_1 volume start $V1 + +EXPECT 5 count_brick_processes + +TEST $CLI_1 volume stop $V0 +TEST $CLI_1 volume stop $V1 + +EXPECT 3 count_brick_processes + +TEST $CLI_1 volume stop $META_VOL + +TEST $CLI_1 volume delete $META_VOL +TEST $CLI_1 volume delete $V0 +TEST $CLI_1 volume delete $V1 + +#bug-1773856 - Brick process fails to come up with brickmux on + +TEST $CLI_1 volume create $V0 $H1:$B1/${V0}1 $H2:$B2/${V0}1 $H3:$B3/${V0}1 force +TEST $CLI_1 volume start $V0 + + +EXPECT 3 count_brick_processes + +#create and start a new volume +TEST $CLI_1 volume create $V1 $H1:$B1/${V1}2 $H2:$B2/${V1}2 $H3:$B3/${V1}2 force +TEST $CLI_1 volume start $V1 + +EXPECT 3 count_brick_processes + +V2=patchy2 +TEST $CLI_1 volume create $V2 $H1:$B1/${V2}3 $H2:$B2/${V2}3 $H3:$B3/${V2}3 force +TEST $CLI_1 volume start $V2 + +EXPECT 3 count_brick_processes + +EXPECT_WITHIN $PROCESS_UP_TIMEOUT 3 count_brick_pids + +TEST kill_node 1 + +sleep 10 + +EXPECT_WITHIN $PROBE_TIMEOUT 1 check_peers; + +$CLI_2 volume set $V0 performance.readdir-ahead on +$CLI_2 volume set $V1 performance.readdir-ahead on + +TEST $glusterd_1; +EXPECT_WITHIN $PROBE_TIMEOUT 2 peer_count + +EXPECT_WITHIN $PROCESS_UP_TIMEOUT 4 count_brick_pids +EXPECT_WITHIN $PROCESS_UP_TIMEOUT 0 count_N/A_brick_pids + +cleanup; diff --git a/tests/bugs/glusterd/brick-mux-validation.t b/tests/bugs/glusterd/brick-mux-validation.t index 9e1c2c21752..61b0455f9a8 100644 --- a/tests/bugs/glusterd/brick-mux-validation.t +++ b/tests/bugs/glusterd/brick-mux-validation.t @@ -19,14 +19,12 @@ cleanup; TEST glusterd TEST $CLI volume set all cluster.brick-multiplex on -push_trapfunc "$CLI volume set all cluster.brick-multiplex off" -push_trapfunc "cleanup" TEST $CLI volume create $V0 $H0:$B0/${V0}{1..3} TEST $CLI volume start $V0 EXPECT 1 count_brick_processes -EXPECT 1 count_brick_pids +EXPECT_WITHIN $PROCESS_UP_TIMEOUT 1 count_brick_pids EXPECT_WITHIN $PROCESS_UP_TIMEOUT 3 online_brick_count pkill gluster @@ -102,4 +100,5 @@ TEST $CLI_IGNORE_PARTITION volume reset-brick $V1 $H0:$B0/${V1}1 $H0:$B0/${V1}1 EXPECT_WITHIN $PROCESS_UP_TIMEOUT 6 online_brick_count EXPECT 1 count_brick_processes -cleanup + +cleanup; diff --git a/tests/bugs/glusterd/brick-mux.t b/tests/bugs/glusterd/brick-mux.t index eeaa3ebfea8..927940534c1 100644 --- a/tests/bugs/glusterd/brick-mux.t +++ b/tests/bugs/glusterd/brick-mux.t @@ -39,7 +39,7 @@ TEST glusterd EXPECT_WITHIN $PROCESS_UP_TIMEOUT 4 online_brick_count EXPECT 1 count_brick_processes -TEST $CLI volume set $V1 performance.cache-size 32MB +TEST $CLI volume set $V1 performance.io-cache-size 32MB TEST $CLI volume stop $V1 TEST $CLI volume start $V1 diff --git a/tests/bugs/glusterd/brick-order-check-add-brick.t b/tests/bugs/glusterd/brick-order-check-add-brick.t new file mode 100644 index 00000000000..0be31dac768 --- /dev/null +++ b/tests/bugs/glusterd/brick-order-check-add-brick.t @@ -0,0 +1,61 @@ +#!/bin/bash +. $(dirname $0)/../../include.rc +. $(dirname $0)/../../volume.rc +. $(dirname $0)/../../cluster.rc +. $(dirname $0)/../../snapshot.rc + +cleanup; + +TEST verify_lvm_version; +#Create cluster with 3 nodes +TEST launch_cluster 3 -NO_DEBUG -NO_FORCE +TEST setup_lvm 3 + +TEST $CLI_1 peer probe $H2 +TEST $CLI_1 peer probe $H3 +EXPECT_WITHIN $PROBE_TIMEOUT 2 peer_count + +TEST $CLI_1 volume create $V0 replica 3 $H1:$L1/$V0 $H2:$L2/$V0 $H3:$L3/$V0 +EXPECT '1 x 3 = 3' volinfo_field $V0 'Number of Bricks' +EXPECT 'Created' volinfo_field $V0 'Status' + +TEST $CLI_1 volume start $V0 +EXPECT 'Started' volinfo_field $V0 'Status' + +#add-brick with or without mentioning the replica count should not fail +TEST $CLI_1 volume add-brick $V0 replica 3 $H1:$L1/${V0}_1 $H2:$L2/${V0}_1 $H3:$L3/${V0}_1 +EXPECT '2 x 3 = 6' volinfo_field $V0 'Number of Bricks' + +TEST $CLI_1 volume add-brick $V0 $H1:$L1/${V0}_2 $H2:$L2/${V0}_2 $H3:$L3/${V0}_2 +EXPECT '3 x 3 = 9' volinfo_field $V0 'Number of Bricks' + +#adding bricks from same host should fail the brick order check +TEST ! $CLI_1 volume add-brick $V0 $H1:$L1/${V0}_3 $H1:$L1/${V0}_4 $H1:$L1/${V0}_5 +EXPECT '3 x 3 = 9' volinfo_field $V0 'Number of Bricks' + +#adding bricks from same host with force should succeed +TEST $CLI_1 volume add-brick $V0 $H1:$L1/${V0}_3 $H1:$L1/${V0}_4 $H1:$L1/${V0}_5 force +EXPECT '4 x 3 = 12' volinfo_field $V0 'Number of Bricks' + +TEST $CLI_1 volume stop $V0 +TEST $CLI_1 volume delete $V0 + +TEST $CLI_1 volume create $V0 replica 2 $H1:$L1/${V0}1 $H2:$L2/${V0}1 +EXPECT '1 x 2 = 2' volinfo_field $V0 'Number of Bricks' +EXPECT 'Created' volinfo_field $V0 'Status' + +TEST $CLI_1 volume start $V0 +EXPECT 'Started' volinfo_field $V0 'Status' + +#Add-brick with Increasing replica count +TEST $CLI_1 volume add-brick $V0 replica 3 $H3:$L3/${V0}1 +EXPECT '1 x 3 = 3' volinfo_field $V0 'Number of Bricks' + +#Add-brick with Increasing replica count from same host should fail +TEST ! $CLI_1 volume add-brick $V0 replica 5 $H1:$L1/${V0}2 $H1:$L1/${V0}3 + +#adding multiple bricks from same host should fail the brick order check +TEST ! $CLI_1 volume add-brick $V0 replica 3 $H1:$L1/${V0}{4..6} $H2:$L2/${V0}{7..9} +EXPECT '1 x 3 = 3' volinfo_field $V0 'Number of Bricks' + +cleanup diff --git a/tests/bugs/glusterd/bug-1070734.t b/tests/bugs/glusterd/bug-1070734.t index ea160d7ec6b..0afcb3b37b3 100755 --- a/tests/bugs/glusterd/bug-1070734.t +++ b/tests/bugs/glusterd/bug-1070734.t @@ -4,6 +4,8 @@ . $(dirname $0)/../../volume.rc . $(dirname $0)/../../nfs.rc +#G_TESTDEF_TEST_STATUS_CENTOS6=NFS_TEST + cleanup; ## Start glusterd diff --git a/tests/bugs/glusterd/bug-1303028-Rebalance-glusterd-rpc-connection-issue.t b/tests/bugs/glusterd/bug-1303028-Rebalance-glusterd-rpc-connection-issue.t deleted file mode 100644 index 3b62a4547b5..00000000000 --- a/tests/bugs/glusterd/bug-1303028-Rebalance-glusterd-rpc-connection-issue.t +++ /dev/null @@ -1,78 +0,0 @@ -#!/bin/bash - -. $(dirname $0)/../../include.rc -. $(dirname $0)/../../volume.rc -. $(dirname $0)/../../tier.rc - - -# Creates a tiered volume with pure distribute hot and cold tiers -# Both hot and cold tiers will have an equal number of bricks. - -function create_dist_tier_vol () { - mkdir $B0/cold - mkdir $B0/hot - TEST $CLI volume create $V0 $H0:$B0/cold/${V0}{1..3} - TEST $CLI volume set $V0 performance.quick-read off - TEST $CLI volume set $V0 performance.io-cache off - TEST $CLI volume start $V0 - TEST $CLI volume tier $V0 attach $H0:$B0/hot/${V0}{1..2} - TEST $CLI volume set $V0 cluster.tier-mode test -} - -function non_zero_check () { - if [ "$1" -ne 0 ] - then - echo "0" - else - echo "1" - fi -} - -function num_bricks_up { - local b - local n_up=0 - - for b in $B0/hot/${V0}{1..2} $B0/cold/${V0}{1..3}; do - if [ x"$(brick_up_status $V0 $H0 $b)" = x"1" ]; then - n_up=$((n_up+1)) - fi - done - - echo $n_up -} - -cleanup; - -#Basic checks -TEST glusterd -TEST pidof glusterd -TEST $CLI volume status - - -#Create and start a tiered volume -create_dist_tier_vol -# Wait for the bricks to come up, *then* the tier daemon. -EXPECT_WITHIN $PROCESS_UP_TIMEOUT 5 num_bricks_up -EXPECT_WITHIN $PROCESS_UP_TIMEOUT 0 tier_daemon_check -sleep 5 #wait for some time to run tier daemon -time_before_restarting=$(rebalance_run_time $V0); - -#checking for elapsed time after sleeping for two seconds. -EXPECT "0" non_zero_check $time_before_restarting; - -#Difference of elapsed time should be positive - -kill -9 $(pidof glusterd); -TEST glusterd; -sleep 2; -# Wait for the bricks to come up, *then* the tier daemon. -EXPECT_WITHIN $PROCESS_UP_TIMEOUT 5 num_bricks_up -EXPECT_WITHIN $PROCESS_UP_TIMEOUT "0" tier_daemon_check; -sleep 1; -time1=$(rebalance_run_time $V0); -EXPECT "0" non_zero_check $time1; -sleep 2; -time2=$(rebalance_run_time $V0); -EXPECT "0" non_zero_check $time2; -diff=`expr $time2 - $time1` -EXPECT "0" non_zero_check $diff; diff --git a/tests/bugs/glusterd/bug-1595320.t b/tests/bugs/glusterd/bug-1595320.t new file mode 100644 index 00000000000..c10e11821a1 --- /dev/null +++ b/tests/bugs/glusterd/bug-1595320.t @@ -0,0 +1,93 @@ +#!/bin/bash + +. $(dirname $0)/../../include.rc +. $(dirname $0)/../../volume.rc +. $(dirname $0)/../../snapshot.rc + +cleanup + +function count_up_bricks { + $CLI --xml volume status $V0 | grep '<status>1' | wc -l +} + +function count_brick_processes { + pgrep glusterfsd | wc -l +} + +# Setup 3 LVMS +LVM_PREFIX="test" +TEST init_n_bricks 3 +TEST setup_lvm 3 + +# Start glusterd +TEST glusterd +TEST pidof glusterd + +# Create volume and enable brick multiplexing +TEST $CLI volume create $V0 $H0:$L1 $H0:$L2 $H0:$L3 +TEST $CLI v set all cluster.brick-multiplex on + +# Start the volume +TEST $CLI volume start $V0 +EXPECT_WITHIN $PROCESS_UP_TIMEOUT 3 count_up_bricks +EXPECT 1 count_brick_processes + +# Kill volume ungracefully +brick_pid=`pgrep glusterfsd` + +# Make sure every brick root should be consumed by a brick process +n=`ls -lrth /proc/$brick_pid/fd | grep -iw $L1 | grep -v ".glusterfs" | wc -l` +TEST [ $n -eq 1 ] +n=`ls -lrth /proc/$brick_pid/fd | grep -iw $L2 | grep -v ".glusterfs" | wc -l` +TEST [ $n -eq 1 ] +n=`ls -lrth /proc/$brick_pid/fd | grep -iw $L3 | grep -v ".glusterfs" | wc -l` +TEST [ $n -eq 1 ] + +b1_pid_file=$(ls $GLUSTERD_PIDFILEDIR/vols/$V0/*d-backends-1*.pid) +b2_pid_file=$(ls $GLUSTERD_PIDFILEDIR/vols/$V0/*d-backends-2*.pid) +b3_pid_file=$(ls $GLUSTERD_PIDFILEDIR/vols/$V0/*d-backends-3*.pid) + +kill -9 $brick_pid +EXPECT_WITHIN $PROCESS_UP_TIMEOUT 0 count_brick_processes + +# Unmount 3rd brick root from node +brick_root=$L3 +_umount_lv 3 + +# Start the volume only 2 brick should be start +TEST $CLI volume start $V0 force +EXPECT_WITHIN $PROCESS_UP_TIMEOUT 2 count_up_bricks +EXPECT 1 count_brick_processes + +brick_pid=`pgrep glusterfsd` + +# Make sure only two brick root should be consumed by a brick process +n=`ls -lrth /proc/$brick_pid/fd | grep -iw $L1 | grep -v ".glusterfs" | wc -l` +TEST [ $n -eq 1 ] +n=`ls -lrth /proc/$brick_pid/fd | grep -iw $L2 | grep -v ".glusterfs" | wc -l` +TEST [ $n -eq 1 ] +n=`ls -lrth /proc/$brick_pid/fd | grep -iw $L3 | grep -v ".glusterfs" | wc -l` +TEST [ $n -eq 0 ] + +# Mount the brick root +TEST mkdir -p $brick_root +TEST mount -t xfs -o nouuid /dev/test_vg_3/brick_lvm $brick_root + +# Replace brick_pid file to test brick_attach code +TEST cp $b1_pid_file $b3_pid_file + +# Start the volume all brick should be up +TEST $CLI volume start $V0 force + +EXPECT_WITHIN $PROCESS_UP_TIMEOUT 3 count_up_bricks +EXPECT 1 count_brick_processes + +# Make sure every brick root should be consumed by a brick process +n=`ls -lrth /proc/$brick_pid/fd | grep -iw $L1 | grep -v ".glusterfs" | wc -l` +TEST [ $n -eq 1 ] +n=`ls -lrth /proc/$brick_pid/fd | grep -iw $L2 | grep -v ".glusterfs" | wc -l` +TEST [ $n -eq 1 ] +n=`ls -lrth /proc/$brick_pid/fd | grep -iw $L3 | grep -v ".glusterfs" | wc -l` +TEST [ $n -eq 1 ] + +cleanup diff --git a/tests/bugs/glusterd/bug-1696046.t b/tests/bugs/glusterd/bug-1696046.t new file mode 100644 index 00000000000..e1c1eb2ceb9 --- /dev/null +++ b/tests/bugs/glusterd/bug-1696046.t @@ -0,0 +1,113 @@ +#!/bin/bash + +. $(dirname $0)/../../include.rc +. $(dirname $0)/../../volume.rc + +cleanup; + +function count_up_bricks { + $CLI --xml volume status $1 | grep '<status>1' | wc -l +} + +function count_brick_processes { + pgrep glusterfsd | wc -l +} + +logdir=`gluster --print-logdir` + +## Start and create a volume +TEST glusterd; +TEST pidof glusterd; + +TEST $CLI volume set all cluster.brick-multiplex on +TEST $CLI volume create $V0 replica 3 $H0:$B0/${V0}{1,2,3}; +TEST $CLI volume create $V1 replica 3 $H0:$B0/${V1}{1,2,3}; + +## Start volume and verify +TEST $CLI volume start $V0; +EXPECT 'Started' volinfo_field $V0 'Status'; +TEST $CLI volume start $V1; +EXPECT 'Started' volinfo_field $V1 'Status'; + + +EXPECT_WITHIN $PROCESS_UP_TIMEOUT 4 count_up_bricks $V0 +EXPECT_WITHIN $PROCESS_UP_TIMEOUT 4 count_up_bricks $V1 + +EXPECT 1 count_brick_processes + +# Mount V0 +TEST glusterfs --volfile-id=$V0 --volfile-server=$H0 --entry-timeout=0 $M0; + +function client-log-file-name() +{ + logfilename=$M0".log" + echo ${logfilename:1} | tr / - +} + +function brick-log-file-name() +{ + logfilename=$B0"/"$V0"1.log" + echo ${logfilename:1} | tr / - +} + +log_file=$logdir"/"`client-log-file-name` +nofdlog=$(cat $log_file | grep " D " | wc -l) +TEST [ $((nofdlog)) -eq 0 ] + +brick_log_file=$logdir"/bricks/"`brick-log-file-name` +nofdlog=$(cat $brick_log_file | grep " D " | wc -l) +TEST [ $((nofdlog)) -eq 0 ] + +## Set brick-log-level to DEBUG +TEST $CLI volume set $V0 diagnostics.brick-log-level DEBUG + +# Do some operation +touch $M0/file1 + +# Check debug message debug message should be exist only for V0 +# Server xlator is common in brick_mux so after enabling DEBUG log +# some debug message should be available for other xlators like posix + +brick_log_file=$logdir"/bricks/"`brick-log-file-name` +nofdlog=$(cat $brick_log_file | grep file1 | grep -v server | wc -l) +TEST [ $((nofdlog)) -ne 0 ] + +#Check if any debug log exist in client-log file +nofdlog=$(cat $log_file | grep " D " | wc -l) +TEST [ $((nofdlog)) -eq 0 ] + +## Set brick-log-level to INFO +TEST $CLI volume set $V0 diagnostics.brick-log-level INFO + +## Set client-log-level to DEBUG +TEST $CLI volume set $V0 diagnostics.client-log-level DEBUG + +# Do some operation +touch $M0/file2 + +nofdlog=$(cat $brick_log_file | grep " D " | grep file2 | wc -l) +TEST [ $((nofdlog)) -eq 0 ] + +nofdlog=$(cat $log_file | grep " D " | wc -l) +TEST [ $((nofdlog)) -ne 0 ] + +# Unmount V0 +TEST umount $M0 + +#Mount V1 +TEST glusterfs --volfile-id=$V1 --volfile-server=$H0 --entry-timeout=0 $M0; + +#do some operation +touch $M0/file3 + + +# DEBUG log level is enabled only for V0 so no debug message should be available +# in log specific to file2 creation except for server xlator, server xlator is +# common xlator in brick mulitplex +nofdlog=$(cat $brick_log_file | grep file3 | grep -v server | wc -l) +TEST [ $((nofdlog)) -eq 0 ] + +# Unmount V1 +TEST umount $M0 + +cleanup; diff --git a/tests/bugs/glusterd/bug-1699339.t b/tests/bugs/glusterd/bug-1699339.t new file mode 100644 index 00000000000..bb8d4f46eb8 --- /dev/null +++ b/tests/bugs/glusterd/bug-1699339.t @@ -0,0 +1,73 @@ +#!/bin/bash + +. $(dirname $0)/../../include.rc +. $(dirname $0)/../../volume.rc +. $(dirname $0)/../../cluster.rc + +cleanup; + +NUM_VOLS=15 + + +get_brick_base () { + printf "%s/vol%02d" $B0 $1 +} + +function count_up_bricks { + vol=$1; + $CLI_1 --xml volume status $vol | grep '<status>1' | wc -l +} + +create_volume () { + + local vol_name=$(printf "%s-vol%02d" $V0 $1) + + TEST $CLI_1 volume create $vol_name replica 3 $H1:$B1/${vol_name} $H2:$B2/${vol_name} $H3:$B3/${vol_name} + TEST $CLI_1 volume start $vol_name +} + +TEST launch_cluster 3 +TEST $CLI_1 volume set all cluster.brick-multiplex on + +# The option accepts the value in the range from 5 to 200 +TEST ! $CLI_1 volume set all glusterd.vol_count_per_thread 210 +TEST ! $CLI_1 volume set all glusterd.vol_count_per_thread 4 + +TEST $CLI_1 volume set all glusterd.vol_count_per_thread 5 + +TEST $CLI_1 peer probe $H2; +EXPECT_WITHIN $PROBE_TIMEOUT 1 peer_count + +TEST $CLI_1 peer probe $H3; +EXPECT_WITHIN $PROBE_TIMEOUT 2 peer_count + +# Our infrastructure can't handle an arithmetic expression here. The formula +# is (NUM_VOLS-1)*5 because it sees each TEST/EXPECT once but needs the other +# NUM_VOLS-1 and there are 5 such statements in each iteration. +TESTS_EXPECTED_IN_LOOP=28 +for i in $(seq 1 $NUM_VOLS); do + starttime="$(date +%s)"; + create_volume $i +done + +TEST kill_glusterd 1 + +TESTS_EXPECTED_IN_LOOP=4 +for i in `seq 1 3 15` +do +vol1=$(printf "%s-vol%02d" $V0 $i) +TEST $CLI_2 volume set $vol1 performance.readdir-ahead on +done + +# Bring back 1st glusterd +TEST $glusterd_1 +EXPECT_WITHIN $PROBE_TIMEOUT 2 peer_count + +TESTS_EXPECTED_IN_LOOP=4 +for i in `seq 1 3 15` +do +vol1=$(printf "%s-vol%02d" $V0 $i) +EXPECT_WITHIN $PROBE_TIMEOUT "on" volinfo_field_1 $vol1 performance.readdir-ahead +done + +cleanup diff --git a/tests/bugs/glusterd/bug-1720566.t b/tests/bugs/glusterd/bug-1720566.t new file mode 100644 index 00000000000..99bcf6ff785 --- /dev/null +++ b/tests/bugs/glusterd/bug-1720566.t @@ -0,0 +1,50 @@ +#!/bin/bash + +. $(dirname $0)/../../include.rc +. $(dirname $0)/../../cluster.rc +. $(dirname $0)/../../volume.rc + + +cleanup; +V0="TestLongVolnamec363b7b536700ff06eedeae0dd9037fec363b7b536700ff06eedeae0dd9037fec363b7b536700ff06eedeae0dd9abcd" +V1="TestLongVolname3102bd28a16c49440bd5210e4ec4d5d93102bd28a16c49440bd5210e4ec4d5d933102bd28a16c49440bd5210e4ebbcd" +TEST launch_cluster 2; +TEST $CLI_1 peer probe $H2; + +EXPECT_WITHIN $PROBE_TIMEOUT 1 peer_count + +$CLI_1 volume create $V0 $H1:$B1/$V0 $H2:$B2/$V0 +EXPECT 'Created' cluster_volinfo_field 1 $V0 'Status'; +$CLI_1 volume create $V1 $H1:$B1/$V1 $H2:$B2/$V1 +EXPECT 'Created' cluster_volinfo_field 1 $V1 'Status'; + +$CLI_1 volume start $V0 +EXPECT 'Started' cluster_volinfo_field 1 $V0 'Status'; + +$CLI_1 volume start $V1 +EXPECT 'Started' cluster_volinfo_field 1 $V1 'Status'; + +#Mount FUSE +TEST glusterfs -s $H1 --volfile-id=$V0 $M0; + + +#Mount FUSE +TEST glusterfs -s $H1 --volfile-id=$V1 $M1; + +TEST mkdir $M0/dir{1..4}; +TEST touch $M0/dir{1..4}/files{1..4}; + +TEST mkdir $M1/dir{1..4}; +TEST touch $M1/dir{1..4}/files{1..4}; + +TEST $CLI_1 volume add-brick $V0 $H1:$B1/${V0}_1 $H2:$B2/${V0}_1 +TEST $CLI_1 volume add-brick $V1 $H1:$B1/${V1}_1 $H2:$B2/${V1}_1 + + +TEST $CLI_1 volume rebalance $V0 start +TEST $CLI_1 volume rebalance $V1 start + +EXPECT_WITHIN $REBALANCE_TIMEOUT "completed" cluster_rebalance_status_field 1 $V0 +EXPECT_WITHIN $REBALANCE_TIMEOUT "completed" cluster_rebalance_status_field 1 $V1 + +cleanup; diff --git a/tests/bugs/glusterd/bug-824753-file-locker.c b/tests/bugs/glusterd/bug-824753-file-locker.c index 915161b626b..f5dababad30 100644 --- a/tests/bugs/glusterd/bug-824753-file-locker.c +++ b/tests/bugs/glusterd/bug-824753-file-locker.c @@ -5,13 +5,13 @@ #include <unistd.h> #include <stdlib.h> - -int main (int argc, char *argv[]) +int +main(int argc, char *argv[]) { - int fd = -1; - int ret = -1; - char command[2048] = ""; - char filepath[255] = ""; + int fd = -1; + int ret = -1; + char command[2048] = ""; + char filepath[255] = ""; struct flock fl; fl.l_type = F_WRLCK; @@ -36,7 +36,7 @@ int main (int argc, char *argv[]) " grep %s | awk -F'..: ' '{print $1}' | grep %s:%s/%s", argv[1], argv[5], argv[2], argv[2], argv[3], argv[1]); - ret = system (command); + ret = system(command); close(fd); if (ret) diff --git a/tests/bugs/glusterd/bug-824753.t b/tests/bugs/glusterd/bug-824753.t index 2ce4a07c5bd..b969e28f35e 100755 --- a/tests/bugs/glusterd/bug-824753.t +++ b/tests/bugs/glusterd/bug-824753.t @@ -9,7 +9,7 @@ TEST glusterd; TEST pidof glusterd; TEST $CLI volume info; -TEST $CLI volume create $V0 replica 2 stripe 2 $H0:$B0/${V0}{1,2,3,4,5,6,7,8}; +TEST $CLI volume create $V0 replica 3 $H0:$B0/${V0}{1,2,3,4,5,6}; function volinfo_field() { diff --git a/tests/bugs/glusterd/bug-857330/common.rc b/tests/bugs/glusterd/bug-857330/common.rc deleted file mode 100644 index d0aa4b1a640..00000000000 --- a/tests/bugs/glusterd/bug-857330/common.rc +++ /dev/null @@ -1,57 +0,0 @@ -. $(dirname $0)/../../../include.rc - -UUID_REGEX='[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}' - -TASK_ID="" -COMMAND="" -PATTERN="" - -function check-and-store-task-id() -{ - TASK_ID="" - - local task_id=$($CLI $COMMAND | grep $PATTERN | grep -o -E "$UUID_REGEX") - - if [ -z "$task_id" ] && [ "${task_id+asdf}" = "asdf" ]; then - return 1 - fi - - TASK_ID=$task_id - return 0; -} - -function get-task-id() -{ - $CLI $COMMAND | grep $PATTERN | grep -o -E "$UUID_REGEX" | tail -n1 - -} - -function check-and-store-task-id-xml() -{ - TASK_ID="" - - local task_id=$($CLI $COMMAND --xml | xmllint --format - | grep $PATTERN | grep -o -E "$UUID_REGEX") - - if [ -z "$task_id" ] && [ "${task_id+asdf}" = "asdf" ]; then - return 1 - fi - - TASK_ID=$task_id - return 0; -} - -function get-task-id-xml() -{ - $CLI $COMMAND --xml | xmllint --format - | grep $PATTERN | grep -o -E "$UUID_REGEX" -} - -function get-task-status() -{ - pattern=$1 - val=1 - test=$(gluster $COMMAND | grep -o $pattern 2>&1) - if [ $? -eq 0 ]; then - val=0 - fi - echo $val -} diff --git a/tests/bugs/glusterd/bug-857330/normal.t b/tests/bugs/glusterd/bug-857330/normal.t deleted file mode 100755 index ad0c8844fae..00000000000 --- a/tests/bugs/glusterd/bug-857330/normal.t +++ /dev/null @@ -1,69 +0,0 @@ -#!/bin/bash - -. $(dirname $0)/common.rc -. $(dirname $0)/../../../volume.rc -cleanup; - -TEST glusterd -TEST pidof glusterd -TEST $CLI volume info; - -TEST $CLI volume create $V0 replica 2 $H0:$B0/${V0}1 $H0:$B0/${V0}2; -TEST $CLI volume info $V0; -TEST $CLI volume start $V0; - -TEST glusterfs -s $H0 --volfile-id=$V0 $M0; - -TEST $PYTHON $(dirname $0)/../../../utils/create-files.py \ - --multi -b 10 -d 10 -n 10 $M0; - -EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0 - -############### -## Rebalance ## -############### -TEST $CLI volume add-brick $V0 replica 2 $H0:$B0/${V0}3 $H0:$B0/${V0}4; - -COMMAND="volume rebalance $V0 start" -PATTERN="ID:" -TEST check-and-store-task-id - -COMMAND="volume status $V0" -PATTERN="ID" -EXPECT $TASK_ID get-task-id - -COMMAND="volume rebalance $V0 status" -PATTERN="completed" -EXPECT_WITHIN $REBALANCE_TIMEOUT "0" get-task-status $PATTERN - -################### -## Replace-brick ## -################### -REP_BRICK_PAIR="$H0:$B0/${V0}2 $H0:$B0/${V0}5" - -TEST $CLI volume replace-brick $V0 $REP_BRICK_PAIR commit force; - -################## -## Remove-brick ## -################## -EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status $V0 $H0 $B0/${V0}5 - -COMMAND="volume remove-brick $V0 $H0:$B0/${V0}1 $H0:$B0/${V0}5 start" -PATTERN="ID:" -TEST check-and-store-task-id - -COMMAND="volume status $V0" -PATTERN="ID" -EXPECT $TASK_ID get-task-id - -COMMAND="volume remove-brick $V0 $H0:$B0/${V0}1 $H0:$B0/${V0}5 status" -PATTERN="completed" -EXPECT_WITHIN $REBALANCE_TIMEOUT "0" get-task-status $PATTERN - -TEST $CLI volume remove-brick $V0 $H0:$B0/${V0}1 $H0:$B0/${V0}5 commit - -TEST $CLI volume stop $V0; -TEST $CLI volume delete $V0; -TEST ! $CLI volume info $V0; - -cleanup; diff --git a/tests/bugs/glusterd/bug-857330/xml.t b/tests/bugs/glusterd/bug-857330/xml.t deleted file mode 100755 index 8383d2a0711..00000000000 --- a/tests/bugs/glusterd/bug-857330/xml.t +++ /dev/null @@ -1,83 +0,0 @@ -#!/bin/bash - -. $(dirname $0)/common.rc -. $(dirname $0)/../../../volume.rc - -cleanup; - -TEST glusterd -TEST pidof glusterd -TEST $CLI volume info; - -TEST $CLI volume create $V0 replica 2 $H0:$B0/${V0}1 $H0:$B0/${V0}2; -TEST $CLI volume info $V0; -TEST $CLI volume start $V0; - -TEST glusterfs -s $H0 --volfile-id=$V0 $M0; - -TEST $PYTHON $(dirname $0)/../../../utils/create-files.py \ - --multi -b 10 -d 10 -n 10 $M0; - -EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0 - - -############### -## Rebalance ## -############### -TEST $CLI volume add-brick $V0 replica 2 $H0:$B0/${V0}3 $H0:$B0/${V0}4; - -COMMAND="volume rebalance $V0 start" -PATTERN="task-id" -TEST check-and-store-task-id-xml - -COMMAND="volume status $V0" -PATTERN="id" -EXPECT $TASK_ID get-task-id-xml - -COMMAND="volume rebalance $V0 status" -PATTERN="task-id" -EXPECT $TASK_ID get-task-id-xml - -## TODO: Add tests for rebalance stop - -COMMAND="volume rebalance $V0 status" -PATTERN="completed" -EXPECT_WITHIN $REBALANCE_TIMEOUT "0" get-task-status $PATTERN - -################### -## Replace-brick ## -################### -TEST $CLI volume replace-brick $V0 $H0:$B0/${V0}4 $H0:$B0/${V0}5 commit force - -################## -## Remove-brick ## -################## -EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status $V0 $H0 $B0/${V0}5 - -COMMAND="volume remove-brick $V0 $H0:$B0/${V0}3 $H0:$B0/${V0}5 start" -PATTERN="task-id" -TEST check-and-store-task-id-xml - -COMMAND="volume status $V0" -PATTERN="id" -EXPECT $TASK_ID get-task-id-xml - -COMMAND="volume remove-brick $V0 $H0:$B0/${V0}3 $H0:$B0/${V0}5 status" -PATTERN="task-id" -EXPECT $TASK_ID get-task-id-xml - -COMMAND="volume remove-brick $V0 $H0:$B0/${V0}3 $H0:$B0/${V0}5 status" -PATTERN="completed" -EXPECT_WITHIN $REBALANCE_TIMEOUT "0" get-task-status $PATTERN - -## TODO: Add tests for remove-brick stop - -COMMAND="volume remove-brick $V0 $H0:$B0/${V0}3 $H0:$B0/${V0}5 commit" -PATTERN="task-id" -EXPECT $TASK_ID get-task-id-xml - -TEST $CLI volume stop $V0; -TEST $CLI volume delete $V0; -TEST ! $CLI volume info $V0; - -cleanup; diff --git a/tests/bugs/glusterd/check_elastic_server.t b/tests/bugs/glusterd/check_elastic_server.t new file mode 100644 index 00000000000..41d2140aa2b --- /dev/null +++ b/tests/bugs/glusterd/check_elastic_server.t @@ -0,0 +1,63 @@ +#!/bin/bash + +. $(dirname $0)/../../include.rc +. $(dirname $0)/../../cluster.rc +. $(dirname $0)/../../volume.rc + +function cluster_rebalance_status { + local vol=$1 + $CLI_2 volume status | grep -iw "Rebalance" -A 5 | grep "Status" | sed 's/.*: //' +} + +cleanup; +TEST launch_cluster 4; +TEST $CLI_1 peer probe $H2; +TEST $CLI_1 peer probe $H3; +TEST $CLI_1 peer probe $H4; + +EXPECT_WITHIN $PROBE_TIMEOUT 3 peer_count + +TEST $CLI_1 volume create $V0 $H1:$B1/$V0 $H2:$B2/$V0 +EXPECT 'Created' cluster_volinfo_field 1 $V0 'Status'; + +$CLI_1 volume start $V0 +EXPECT 'Started' cluster_volinfo_field 1 $V0 'Status'; + +#Mount invalid volume +TEST ! glusterfs -s $H1 --volfile-id=$V0_NA $M0; + +#Mount FUSE +TEST glusterfs -s $H1 --volfile-id=$V0 $M0; + +TEST mkdir $M0/dir{1..4}; +TEST touch $M0/dir{1..4}/files{1..4}; + +TEST $CLI_1 volume remove-brick $V0 $H1:$B1/$V0 start +EXPECT_WITHIN $REBALANCE_TIMEOUT "completed" cluster_remove_brick_status_completed_field "$V0 $H1:$B1/$V0" + +TEST $CLI_1 volume remove-brick $V0 $H1:$B1/$V0 commit + +kill_glusterd 1 + +total_files=`find $M0 -name "files*" | wc -l` +TEST [ $total_files -eq 16 ]; + +TEST $CLI_2 volume add-brick $V0 $H3:$B3/$V0 + +TEST $CLI_2 volume rebalance $V0 start +EXPECT_WITHIN $REBALANCE_TIMEOUT "completed" cluster_rebalance_status $V0 + +total_files=`find $M0 -name "files*" | wc -l` +TEST [ $total_files -eq 16 ]; + +TEST $CLI_2 volume add-brick $V0 $H4:$B4/$V0 + +TEST $CLI_2 volume rebalance $V0 start +EXPECT_WITHIN $REBALANCE_TIMEOUT "completed" cluster_rebalance_status $V0 +kill_glusterd 2 + +total_files=`find $M0 -name "files*" | wc -l` +TEST [ $total_files -eq 16 ]; + +cleanup; + diff --git a/tests/bugs/glusterd/df-results-post-replace-brick-operations.t b/tests/bugs/glusterd/df-results-post-replace-brick-operations.t new file mode 100644 index 00000000000..04f75889388 --- /dev/null +++ b/tests/bugs/glusterd/df-results-post-replace-brick-operations.t @@ -0,0 +1,61 @@ +#!/bin/bash + +. $(dirname $0)/../../include.rc +. $(dirname $0)/../../volume.rc + +cleanup +TEST glusterd + +#Create brick partitions +TEST truncate -s 100M $B0/brick1 +TEST truncate -s 100M $B0/brick2 +TEST truncate -s 100M $B0/brick3 +TEST truncate -s 100M $B0/brick4 +TEST truncate -s 100M $B0/brick5 + +LO1=`SETUP_LOOP $B0/brick1` +TEST [ $? -eq 0 ] +TEST MKFS_LOOP $LO1 + +LO2=`SETUP_LOOP $B0/brick2` +TEST [ $? -eq 0 ] +TEST MKFS_LOOP $LO2 + +LO3=`SETUP_LOOP $B0/brick3` +TEST [ $? -eq 0 ] +TEST MKFS_LOOP $LO3 + +LO4=`SETUP_LOOP $B0/brick4` +TEST [ $? -eq 0 ] +TEST MKFS_LOOP $LO4 + +LO5=`SETUP_LOOP $B0/brick5` +TEST [ $? -eq 0 ] +TEST MKFS_LOOP $LO5 + +TEST mkdir -p $B0/${V0}1 $B0/${V0}2 $B0/${V0}3 $B0/${V0}4 $B0/${V0}5 +TEST MOUNT_LOOP $LO1 $B0/${V0}1 +TEST MOUNT_LOOP $LO2 $B0/${V0}2 +TEST MOUNT_LOOP $LO3 $B0/${V0}3 +TEST MOUNT_LOOP $LO4 $B0/${V0}4 +TEST MOUNT_LOOP $LO5 $B0/${V0}5 + +# create a subdirectory in mount point and use it for volume creation +TEST $CLI volume create $V0 replica 3 $H0:$B0/${V0}1/brick1 $H0:$B0/${V0}2/brick1 $H0:$B0/${V0}3/brick1 +TEST $CLI volume start $V0 +EXPECT_WITHIN $PROCESS_UP_TIMEOUT "3" online_brick_count + +# mount the volume and check the size at mount point +TEST $GFS --volfile-server=$H0 --volfile-id=$V0 $M0 +total_space=$(df -P $M0 | tail -1 | awk '{ print $2}') + +# perform replace brick operations +TEST $CLI volume replace-brick $V0 $H0:$B0/${V0}1/brick1 $H0:$B0/${V0}4/brick1 commit force +TEST $CLI volume replace-brick $V0 $H0:$B0/${V0}2/brick1 $H0:$B0/${V0}5/brick1 commit force + +EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status $V0 0 +EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status $V0 1 + +# check for the size at mount point, it should be same as previous +total_space_new=$(df -P $M0 | tail -1 | awk '{ print $2}') +TEST [ $total_space -eq $total_space_new ] diff --git a/tests/bugs/glusterd/mgmt-handshake-and-volume-sync-post-glusterd-restart.t b/tests/bugs/glusterd/mgmt-handshake-and-volume-sync-post-glusterd-restart.t index fdc0a73f60c..8001359e6b3 100644 --- a/tests/bugs/glusterd/mgmt-handshake-and-volume-sync-post-glusterd-restart.t +++ b/tests/bugs/glusterd/mgmt-handshake-and-volume-sync-post-glusterd-restart.t @@ -4,7 +4,7 @@ . $(dirname $0)/../../cluster.rc function check_peers { -$CLI_1 peer status | grep 'Peer in Cluster (Connected)' | wc -l +eval \$CLI_$1 peer status | grep 'Peer in Cluster (Connected)' | wc -l } cleanup @@ -36,23 +36,35 @@ TEST [[ $OP_VERS_ORIG == $OP_VERS_NEW ]] #bug-948686 - volume sync after bringing up the killed node TEST $CLI_1 peer probe $H3 -EXPECT_WITHIN $PROBE_TIMEOUT 2 check_peers; +EXPECT_WITHIN $PROBE_TIMEOUT 2 check_peers 1 +EXPECT_WITHIN $PROBE_TIMEOUT 2 check_peers 2 +EXPECT_WITHIN $PROBE_TIMEOUT 2 check_peers 3 TEST $CLI_1 volume create $V0 replica 2 $H1:$B1/$V0 $H1:$B1/${V0}_1 $H2:$B2/$V0 $H3:$B3/$V0 TEST $CLI_1 volume start $V0 +EXPECT_WITHIN $PROCESS_UP_TIMEOUT 'Started' volinfo_field_1 $V0 'Status' TEST glusterfs --volfile-server=$H1 --volfile-id=$V0 $M0 #kill a node TEST kill_node 3 +EXPECT_WITHIN $PROBE_TIMEOUT 1 check_peers 1 +EXPECT_WITHIN $PROBE_TIMEOUT 1 check_peers 2 #modify volume config to see change in volume-sync TEST $CLI_1 volume set $V0 write-behind off #add some files to the volume to see effect of volume-heal cmd TEST touch $M0/{1..100}; TEST $CLI_1 volume stop $V0; +EXPECT_WITHIN $PROCESS_DOWN_TIMEOUT 'Stopped' volinfo_field_1 $V0 'Status' + TEST $glusterd_3; -EXPECT_WITHIN $PROBE_TIMEOUT 2 check_peers +EXPECT_WITHIN $PROBE_TIMEOUT 2 check_peers 1 +EXPECT_WITHIN $PROBE_TIMEOUT 2 check_peers 2 +EXPECT_WITHIN $PROBE_TIMEOUT 2 check_peers 3 + +sleep 5 TEST $CLI_3 volume start $V0; +EXPECT_WITHIN $PROCESS_UP_TIMEOUT 'Started' volinfo_field_1 $V0 'Status' TEST $CLI_2 volume stop $V0; TEST $CLI_2 volume delete $V0; diff --git a/tests/bugs/glusterd/optimized-basic-testcases-in-cluster.t b/tests/bugs/glusterd/optimized-basic-testcases-in-cluster.t index a55e7cb7c46..99272e14245 100644 --- a/tests/bugs/glusterd/optimized-basic-testcases-in-cluster.t +++ b/tests/bugs/glusterd/optimized-basic-testcases-in-cluster.t @@ -13,7 +13,7 @@ cleanup; #bug-1454418 - Setting Port number in specific range sysctl net.ipv4.ip_local_reserved_ports="24007-24008,32765-32768,49152-49156" -TEST launch_cluster 3; +TEST launch_cluster 4; #bug-1223213 @@ -56,14 +56,29 @@ TEST $CLI_1 volume status $V0 $H2:$B2/$V0 --xml TEST $CLI_1 volume stop $V0 TEST $CLI_1 volume delete $V0 -TEST $CLI_1 volume create $V0 $H1:$B1/$V0 +TEST $CLI_1 volume create $V0 $H1:$B1/$V0 $H2:$B2/$V0 TEST $CLI_1 volume create $V1 $H1:$B1/$V1 -TEST $CLI_1 peer probe $H3; -EXPECT_WITHIN $PROBE_TIMEOUT 2 peer_count 1 +# bug - 1635820 +# rebooting a node which doen't host bricks for any one volume +# peer should not go into rejected state +TEST kill_glusterd 2 +TEST start_glusterd 2 + +EXPECT_WITHIN $PROBE_TIMEOUT 1 peer_count 1 +EXPECT_WITHIN $PROBE_TIMEOUT 1 peer_count 2 TEST $CLI_1 volume start $V0 +EXPECT_WITHIN $PROCESS_UP_TIMEOUT 'Started' volinfo_field_1 $V0 'Status' + TEST $CLI_1 volume start $V1 +EXPECT_WITHIN $PROCESS_UP_TIMEOUT 'Started' volinfo_field_1 $V1 'Status' + +TEST $CLI_1 peer probe $H3; +EXPECT_WITHIN $PROBE_TIMEOUT 2 peer_count 1 + +TEST $CLI_1 peer probe $H4; +EXPECT_WITHIN $PROBE_TIMEOUT 3 peer_count 1 #bug-1173414 - validate mgmt-v3-remote-lock-failure @@ -75,22 +90,25 @@ $CLI_2 volume set $V0 diagnostics.client-log-level DEBUG & $CLI_2 volume set $V1 barrier on done -EXPECT_WITHIN $PROBE_TIMEOUT 2 peer_count 1 +EXPECT_WITHIN $PROBE_TIMEOUT 3 peer_count 1 TEST $CLI_1 volume status TEST $CLI_2 volume status #bug-1293414 - validate peer detach # peers hosting bricks cannot be detached -TEST ! $CLI_2 peer detach $H1 -EXPECT_WITHIN $PROBE_TIMEOUT 2 peer_count 1 +TEST ! $CLI_4 peer detach $H1 +EXPECT_WITHIN $PROBE_TIMEOUT 3 peer_count 1 # peer not hosting bricks should be detachable -TEST $CLI_2 peer detach $H3 -EXPECT_WITHIN $PROBE_TIMEOUT 1 peer_count 1 +TEST $CLI_4 peer detach $H3 +EXPECT_WITHIN $PROBE_TIMEOUT 2 peer_count 1 #bug-1344407 - deleting a volume when peer is down should fail +#volume should be stopped before deletion +TEST $CLI_1 volume stop $V0 + TEST kill_glusterd 2 TEST ! $CLI_1 volume delete $V0 diff --git a/tests/bugs/glusterd/optimized-basic-testcases.t b/tests/bugs/glusterd/optimized-basic-testcases.t index b9fba4cdefb..b89ca22415e 100644 --- a/tests/bugs/glusterd/optimized-basic-testcases.t +++ b/tests/bugs/glusterd/optimized-basic-testcases.t @@ -32,6 +32,16 @@ function get_brick_host_uuid() echo $host_uuid_list | awk '{print $1}' } +function generate_statedump_and_check_for_glusterd_info { + pid=`pidof glusterd` + #remove old stale statedumps + cleanup_statedump $pid + kill -USR1 $pid + #Wait till the statedump is generated + sleep 1 + fname=$(ls $statedumpdir | grep -E "\.$pid\.dump\.") + cat $statedumpdir/$fname | grep "xlator.glusterd.priv" | wc -l +} cleanup; @@ -59,6 +69,11 @@ TEST pidof glusterd; TEST $CLI volume create $V0 $H0:$B0/${V0}{1,2}; EXPECT 'Created' volinfo_field $V0 'Status'; +#bug-1786478 - default volume option after volume reset +addr_family=`volinfo_field $V0 'transport.address-family'` +TEST $CLI volume reset $V0 +EXPECT $addr_family volinfo_field $V0 'transport.address-family' + #bug-955588 - uuid validation uuid=`grep UUID $GLUSTERD_WORKDIR/glusterd.info | cut -f2 -d=` @@ -114,7 +129,8 @@ TEST ! $CLI volume set all $V0 cluster.op-version $OP_VERS_NEW #bug-1022055 - validate log rotate command -TEST $CLI volume log rotate $V0; +TEST ! $CLI volume log rotate $V0; +TEST $CLI volume log $V0 rotate; #bug-1092841 - validating barrier enable/disable @@ -270,4 +286,20 @@ pkill glusterfsd; TEST glusterd TEST $CLI volume status $V1 +#bug-853601 - Avoid using /var/lib/glusterd as a brick +TEST ! $CLI volume create "test" $H0:/var/lib/glusterd +TEST ! $CLI volume create "test" $H0:/var/lib/glusterd force +TEST ! $CLI volume create "test" $H0:/var/lib/glusterd/abc +TEST ! $CLI volume create "test" $H0:/var/lib/glusterd/abc force +mkdir -p /xyz/var/lib/glusterd/abc + +#bug 1716812 - volfile should be created with transport type both +TEST $CLI volume create "test" transport tcp,rdma $H0:/xyz/var/lib/glusterd/abc +EXPECT 'Created' volinfo_field "test" 'Status'; + +#While taking a statedump, there is a TRY_LOCK on call_frame, which might may cause +#failure. So Adding a EXPECT_WITHIN +EXPECT_WITHIN $PROCESS_UP_TIMEOUT "^1$" generate_statedump_and_check_for_glusterd_info + +cleanup_statedump `pidof glusterd` cleanup diff --git a/tests/bugs/glusterd/quorum-validation.t b/tests/bugs/glusterd/quorum-validation.t index ab7c1adc1c3..3cc3351b43b 100644 --- a/tests/bugs/glusterd/quorum-validation.t +++ b/tests/bugs/glusterd/quorum-validation.t @@ -14,12 +14,15 @@ EXPECT_WITHIN $PROBE_TIMEOUT 1 peer_count TEST $CLI_1 volume create $V0 $H1:$B1/${V0}0 $H2:$B2/${V0}1 TEST $CLI_1 volume set $V0 cluster.server-quorum-type server TEST $CLI_1 volume start $V0 +EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" cluster_brick_up_status 1 $V0 $H1 $B1/${V0}0 +EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" cluster_brick_up_status 1 $V0 $H2 $B2/${V0}1 #bug-1177132 - sync server quorum options when a node is brought up TEST $CLI_1 volume set all cluster.server-quorum-ratio 52 #Bring down 2nd glusterd TEST kill_glusterd 2 +EXPECT_WITHIN $PROBE_TIMEOUT 0 peer_count #bug-1104642 - sync server quorum options when a node is brought up #set the volume all options from the 1st glusterd @@ -31,9 +34,13 @@ TEST ! $CLI_1 volume add-brick $V0 $H1:$B1/${V0}2 TEST ! $CLI_1 volume remove-brick $V0 $H1:$B1/${V0}0 start TEST ! $CLI_1 volume set $V0 barrier enable -# Now execute a command which goes through op state machine and it should fail +#quorum is not met, rebalance/profile start should fail +TEST ! $CLI_1 volume rebalance $V0 start TEST ! $CLI_1 volume profile $V0 start +#bug-1690753 - Volume stop when quorum not met is successful +TEST ! $CLI_1 volume stop $V0 + #Bring back the 2nd glusterd TEST $glusterd_2 @@ -49,8 +56,8 @@ TEST $CLI_1 volume remove-brick $V0 $H2:$B2/${V0}2 start TEST $CLI_1 volume set $V0 barrier enable TEST $CLI_1 volume remove-brick $V0 $H2:$B2/${V0}2 stop -EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status_1 $V0 $H1 $B1/${V0}0 -EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status_1 $V0 $H2 $B2/${V0}1 +EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" cluster_brick_up_status 1 $V0 $H1 $B1/${V0}0 +EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" cluster_brick_up_status 1 $V0 $H2 $B2/${V0}1 ## Stop the volume TEST $CLI_1 volume stop $V0 @@ -75,8 +82,8 @@ TEST $CLI_1 volume profile $V0 start #bug-1352277 -EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status_1 $V0 $H1 $B1/${V0}0 -EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status_1 $V0 $H2 $B2/${V0}1 +EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" cluster_brick_up_status 1 $V0 $H1 $B1/${V0}0 +EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" cluster_brick_up_status 1 $V0 $H2 $B2/${V0}1 TEST $CLI_1 volume set $V0 cluster.server-quorum-type none @@ -85,31 +92,31 @@ TEST killall_gluster #bring back 1st glusterd and check whether the brick process comes back TEST $glusterd_1 -EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status_1 $V0 $H1 $B1/${V0}0 +EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" cluster_brick_up_status 1 $V0 $H1 $B1/${V0}0 #enabling quorum should bring down the brick TEST $CLI_1 volume set $V0 cluster.server-quorum-type server -EXPECT_WITHIN $PROCESS_UP_TIMEOUT "0" brick_up_status_1 $V0 $H1 $B1/${V0}0 +EXPECT_WITHIN $PROCESS_UP_TIMEOUT "0" cluster_brick_up_status 1 $V0 $H1 $B1/${V0}0 TEST $glusterd_2 -EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status_1 $V0 $H1 $B1/${V0}0 -EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status_1 $V0 $H2 $B2/${V0}1 +EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" cluster_brick_up_status 1 $V0 $H1 $B1/${V0}0 +EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" cluster_brick_up_status 1 $V0 $H2 $B2/${V0}1 #bug-1367478 - brick processes should not be up when quorum is not met TEST $CLI_1 volume create $V1 $H1:$B1/${V1}1 $H2:$B2/${V1}2 TEST $CLI_1 volume start $V1 -EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status_1 $V1 $H1 $B1/${V1}1 -EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status_1 $V1 $H2 $B2/${V1}2 +EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" cluster_brick_up_status 1 $V1 $H1 $B1/${V1}1 +EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" cluster_brick_up_status 1 $V1 $H2 $B2/${V1}2 # Restart 2nd glusterd TEST kill_glusterd 2 TEST $glusterd_2 # Check if all bricks are up -EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status_1 $V0 $H1 $B1/${V0}0 -EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status_1 $V0 $H2 $B2/${V0}1 -EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status_1 $V1 $H1 $B1/${V1}1 -EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status_1 $V1 $H2 $B2/${V1}2 +EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" cluster_brick_up_status 1 $V0 $H1 $B1/${V0}0 +EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" cluster_brick_up_status 1 $V0 $H2 $B2/${V0}1 +EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" cluster_brick_up_status 1 $V1 $H1 $B1/${V1}1 +EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" cluster_brick_up_status 1 $V1 $H2 $B2/${V1}2 cleanup diff --git a/tests/bugs/glusterd/rebalance-in-cluster.t b/tests/bugs/glusterd/rebalance-in-cluster.t index 9565faef01d..469ec6cd48e 100644 --- a/tests/bugs/glusterd/rebalance-in-cluster.t +++ b/tests/bugs/glusterd/rebalance-in-cluster.t @@ -4,6 +4,10 @@ . $(dirname $0)/../../cluster.rc . $(dirname $0)/../../volume.rc +function rebalance_status_field_1 { + $CLI_1 volume rebalance $1 status | awk '{print $7}' | sed -n 3p +} + cleanup; TEST launch_cluster 2; TEST $CLI_1 peer probe $H2; @@ -29,6 +33,11 @@ TEST $CLI_1 volume add-brick $V0 $H1:$B1/${V0}1 $H2:$B2/${V0}1 TEST $CLI_1 volume rebalance $V0 start EXPECT_WITHIN $REBALANCE_TIMEOUT "completed" cluster_rebalance_status_field 1 $V0 +#bug - 1764119 - rebalance status should display detailed info when any of the node is dowm +TEST kill_glusterd 2 +EXPECT_WITHIN $REBALANCE_TIMEOUT "completed" rebalance_status_field_1 $V0 + +TEST start_glusterd 2 #bug-1245142 $CLI_1 volume rebalance $V0 start & diff --git a/tests/bugs/glusterd/rebalance-operations-in-single-node.t b/tests/bugs/glusterd/rebalance-operations-in-single-node.t index 9144b4a5000..ef85887f440 100644 --- a/tests/bugs/glusterd/rebalance-operations-in-single-node.t +++ b/tests/bugs/glusterd/rebalance-operations-in-single-node.t @@ -119,13 +119,13 @@ TEST touch $M0/dir{21..30}/files{1..10}; TEST $CLI volume add-brick $V0 $H0:$B0/${V0}{7,8} TEST $CLI volume rebalance $V0 start force -EXPECT_WITHIN 90 "completed" rebalance_status_field $V0 +EXPECT_WITHIN 180 "completed" rebalance_status_field $V0 TEST pkill gluster TEST glusterd TEST pidof glusterd # status should be "completed" immediate after glusterd has respawned. -EXPECT_WITHIN 5 "completed" rebalance_status_field $V0 +EXPECT_WITHIN 20 "completed" rebalance_status_field $V0 cleanup diff --git a/tests/bugs/glusterd/enable-shared-storage-and-remove-brick-validation.t b/tests/bugs/glusterd/remove-brick-validation.t index 9e05e8150d6..a0ff4ff6a24 100644 --- a/tests/bugs/glusterd/enable-shared-storage-and-remove-brick-validation.t +++ b/tests/bugs/glusterd/remove-brick-validation.t @@ -18,20 +18,6 @@ TEST $CLI_1 peer probe $H2; EXPECT_WITHIN $PROBE_TIMEOUT 1 peer_count 1 -#test case for bug 1266818 - disabling enable-shared-storage option -##should not delete user created volume with name glusterd_shared_storage - -## creating a volume with name glusterd_shared_storage -TEST $CLI_1 volume create glusterd_shared_storage $H1:$B1/${V0}0 $H2:$B2/${V0}1 -TEST $CLI_1 volume start glusterd_shared_storage - -## disabling enable-shared-storage should not succeed and should not delete the -## user created volume with name "glusterd_shared_storage" -TEST ! $CLI_1 volume all enable-shared-storage disable - -## volume with name should exist -TEST $CLI_1 volume info glusterd_shared_storage - #testcase: bug-1245045-remove-brick-validation TEST $CLI_1 peer probe $H3; @@ -46,7 +32,7 @@ kill_glusterd 2 TEST ! $CLI_1 volume remove-brick $V0 $H2:$B2/${V0} start TEST $glusterd_2 -EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status_1 $V0 $H2 $B2/${V0} +EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" cluster_brick_up_status 1 $V0 $H2 $B2/${V0} EXPECT_WITHIN $PROBE_TIMEOUT 2 peer_count 1 @@ -61,7 +47,7 @@ kill_glusterd 2 TEST ! $CLI_1 volume remove-brick $V0 $H2:$B2/${V0} commit TEST $glusterd_2 -EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status_1 $V0 $H2 $B2/${V0} +EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" cluster_brick_up_status 1 $V0 $H2 $B2/${V0} EXPECT_WITHIN $PROBE_TIMEOUT 2 peer_count 1 diff --git a/tests/bugs/glusterd/removing-multiple-bricks-in-single-remove-brick-command.t b/tests/bugs/glusterd/removing-multiple-bricks-in-single-remove-brick-command.t index 20c84d26b9c..00beab59137 100644 --- a/tests/bugs/glusterd/removing-multiple-bricks-in-single-remove-brick-command.t +++ b/tests/bugs/glusterd/removing-multiple-bricks-in-single-remove-brick-command.t @@ -49,6 +49,7 @@ EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0 #Create a 3x3 dist-rep volume TEST $CLI volume create $V1 replica 3 $H0:$B0/${V1}{0,1,2,3,4,5,6,7,8}; TEST $CLI volume start $V1 +EXPECT_WITHIN ${PROCESS_UP_TIMEOUT} "9" brick_count ${V1} # Mount FUSE and create file/directory TEST glusterfs -s $H0 --volfile-id $V1 $M0 diff --git a/tests/bugs/glusterd/reset-brick-and-daemons-follow-quorum.t b/tests/bugs/glusterd/reset-brick-and-daemons-follow-quorum.t index 5d2d9590a0e..e6e65c48456 100644 --- a/tests/bugs/glusterd/reset-brick-and-daemons-follow-quorum.t +++ b/tests/bugs/glusterd/reset-brick-and-daemons-follow-quorum.t @@ -41,8 +41,8 @@ TEST $CLI_1 volume reset-brick $V0 $H1:$B0/${V0} $H1:$B0/${V0} commit force TEST $CLI_1 peer probe $H3; EXPECT_WITHIN $PROBE_TIMEOUT 2 peer_count -EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status_1 $V0 $H1 $B0/${V0} -EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status_1 $V0 $H2 $B0/${V0} +EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" cluster_brick_up_status 1 $V0 $H1 $B0/${V0} +EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" cluster_brick_up_status 1 $V0 $H2 $B0/${V0} EXPECT_WITHIN $PROCESS_UP_TIMEOUT "Y" shd_up_status_1 EXPECT_WITHIN $PROCESS_UP_TIMEOUT "Y" shd_up_status_2 @@ -55,9 +55,9 @@ TEST kill_glusterd 1 #Bring back 1st glusterd TEST $glusterd_1 -# We need to wait till PROCESS_UP_TIMEOUT and then check shd service does not -# come up on node 2 -sleep $PROCESS_UP_TIMEOUT -EXPECT "N" shd_up_status_2 +# We need to wait till PROCESS_UP_TIMEOUT and then check shd service started +#on node 2, because once glusterd regains quorum, it will restart all volume +#level daemons +EXPECT_WITHIN $PROCESS_UP_TIMEOUT "Y" shd_up_status_2 cleanup; diff --git a/tests/bugs/glusterd/serialize-shd-manager-glusterd-restart.t b/tests/bugs/glusterd/serialize-shd-manager-glusterd-restart.t new file mode 100644 index 00000000000..a871e112d87 --- /dev/null +++ b/tests/bugs/glusterd/serialize-shd-manager-glusterd-restart.t @@ -0,0 +1,54 @@ +#! /bin/bash + +. $(dirname $0)/../../include.rc +. $(dirname $0)/../../cluster.rc + +function check_peers { +count=`$CLI_3 peer status | grep 'Peer in Cluster (Connected)' | wc -l` +echo $count +} + +function check_shd { +ps aux | grep $1 | grep glustershd | wc -l +} + +cleanup + + +TEST launch_cluster 6 + +TESTS_EXPECTED_IN_LOOP=25 +for i in $(seq 2 6); do + hostname="H$i" + TEST $CLI_1 peer probe ${!hostname} +done + + +EXPECT_WITHIN $PROBE_TIMEOUT 5 check_peers; +for i in $(seq 1 5); do + + TEST $CLI_1 volume create ${V0}_$i replica 3 $H1:$B1/${V0}_$i $H2:$B2/${V0}_$i $H3:$B3/${V0}_$i $H4:$B4/${V0}_$i $H5:$B5/${V0}_$i $H6:$B6/${V0}_$i + TEST $CLI_1 volume start ${V0}_$i force + +done + +#kill a node +TEST kill_node 3 + +TEST $glusterd_3; +EXPECT_WITHIN $PROBE_TIMEOUT 5 check_peers + +EXPECT_WITHIN $PROCESS_UP_TIMEOUT 1 check_shd $H3 + +for i in $(seq 1 5); do + + TEST $CLI_1 volume stop ${V0}_$i + TEST $CLI_1 volume delete ${V0}_$i + +done + +for i in $(seq 1 6); do + hostname="H$i" + EXPECT_WITHIN $PROCESS_DOWN_TIMEOUT 0 check_shd ${!hostname} +done +cleanup diff --git a/tests/bugs/glusterd/stale-brick-proc-brick-mux.t b/tests/bugs/glusterd/stale-brick-proc-brick-mux.t deleted file mode 100644 index f0a89760bb6..00000000000 --- a/tests/bugs/glusterd/stale-brick-proc-brick-mux.t +++ /dev/null @@ -1,33 +0,0 @@ -#!/bin/bash - -. $(dirname $0)/../../include.rc -. $(dirname $0)/../../cluster.rc - -function count_brick_processes { - pgrep glusterfsd | wc -l -} - -cleanup; - -TEST launch_cluster 2 -TEST $CLI_1 peer probe $H2; -EXPECT_WITHIN $PROBE_TIMEOUT 1 peer_count - -#bug-1549996 - stale brick processes on the nodes after volume deletion - -TEST $CLI_1 volume set all cluster.brick-multiplex on -TEST $CLI_1 volume create $V0 replica 3 $H1:$B1/${V0}{1..3} $H2:$B2/${V0}{1..3} -TEST $CLI_1 volume start $V0 - -TEST $CLI_1 volume create $V1 replica 3 $H1:$B1/${V1}{1..3} $H2:$B2/${V1}{1..3} -TEST $CLI_1 volume start $V1 - -EXPECT 2 count_brick_processes - -TEST $CLI_1 volume stop $V0 -TEST $CLI_1 volume stop $V1 - -EXPECT 0 count_brick_processes - -cleanup - diff --git a/tests/bugs/glusterd/validating-options-for-striped-replicated-volume.t b/tests/bugs/glusterd/validating-options-for-replicated-volume.t index 8a6772b402b..ddc80b17870 100644 --- a/tests/bugs/glusterd/validating-options-for-striped-replicated-volume.t +++ b/tests/bugs/glusterd/validating-options-for-replicated-volume.t @@ -7,7 +7,7 @@ cleanup; TEST glusterd -TEST $CLI volume create $V0 replica 2 stripe 2 $H0:$B0/${V0}{1,2,3,4,5,6,7,8}; +TEST $CLI volume create $V0 replica 3 $H0:$B0/${V0}{1,2,3,4,5,6}; ## start volume and verify TEST $CLI volume start $V0; @@ -51,8 +51,6 @@ EXPECT '30' volinfo_field $V0 'features.soft-timeout'; TEST ! $CLI volume set $V0 features.quota-deem-statfs off EXPECT '' volinfo_field $V0 'features.quota-deem-statfs' -#bug-859927 - validate different options for striped replicated volume - TEST ! $CLI volume set $V0 statedump-path "" TEST ! $CLI volume set $V0 statedump-path " " TEST $CLI volume set $V0 statedump-path "/home/" @@ -63,10 +61,15 @@ TEST ! $CLI volume set $V0 background-self-heal-count " " TEST $CLI volume set $V0 background-self-heal-count 10 EXPECT "10" volume_option $V0 cluster.background-self-heal-count -TEST ! $CLI volume set $V0 cache-size "" -TEST ! $CLI volume set $V0 cache-size " " -TEST $CLI volume set $V0 cache-size 512MB -EXPECT "512MB" volume_option $V0 performance.cache-size +TEST ! $CLI volume set $V0 io-cache-size "" +TEST ! $CLI volume set $V0 io-cache-size " " +TEST $CLI volume set $V0 io-cache-size 64MB +EXPECT "64MB" volume_option $V0 performance.io-cache-size + +TEST ! $CLI volume set $V0 quick-read-cache-size "" +TEST ! $CLI volume set $V0 quick-read-cache-size " " +TEST $CLI volume set $V0 quick-read-cache-size 512MB +EXPECT "512MB" volume_option $V0 performance.quick-read-cache-size TEST ! $CLI volume set $V0 self-heal-daemon "" TEST ! $CLI volume set $V0 self-heal-daemon " " @@ -107,11 +110,6 @@ TEST ! $CLI volume set $V0 auth.allow " " TEST $CLI volume set $V0 auth.allow 192.168.122.1 EXPECT "192.168.122.1" volume_option $V0 auth.allow -TEST ! $CLI volume set $V0 stripe-block-size "" -TEST ! $CLI volume set $V0 stripe-block-size " " -TEST $CLI volume set $V0 stripe-block-size 512MB -EXPECT "512MB" volume_option $V0 cluster.stripe-block-size - #bug-782095 - validate performance cache min/max size value ## setting performance cache min size as 2MB diff --git a/tests/bugs/glusterd/validating-server-quorum.t b/tests/bugs/glusterd/validating-server-quorum.t index 277bb4af993..ae7d83fd81c 100644 --- a/tests/bugs/glusterd/validating-server-quorum.t +++ b/tests/bugs/glusterd/validating-server-quorum.t @@ -32,9 +32,9 @@ TEST $CLI_1 volume start $V0 #bug-1345727 - bricks should be down when quorum is not met -EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status_1 $V0 $H1 $B1/${V0}1 -EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status_1 $V0 $H2 $B2/${V0}2 -EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status_1 $V0 $H3 $B3/${V0}3 +EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" cluster_brick_up_status 1 $V0 $H1 $B1/${V0}1 +EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" cluster_brick_up_status 1 $V0 $H2 $B2/${V0}2 +EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" cluster_brick_up_status 1 $V0 $H3 $B3/${V0}3 # Bring down glusterd on 2nd node TEST kill_glusterd 2 @@ -44,7 +44,7 @@ TEST kill_glusterd 3 EXPECT_WITHIN $PROBE_TIMEOUT 0 peer_count # Server quorum is not met. Brick on 1st node must be down -EXPECT_WITHIN $PROCESS_DOWN_TIMEOUT "0" brick_up_status_1 $V0 $H1 $B1/${V0}1 +EXPECT_WITHIN $PROCESS_DOWN_TIMEOUT "0" cluster_brick_up_status 1 $V0 $H1 $B1/${V0}1 # Set quorum ratio 95. means 95 % or more than 95% nodes of total available node # should be available for performing volume operation. @@ -62,26 +62,41 @@ TEST $glusterd_2 EXPECT_WITHIN $PROBE_TIMEOUT 1 peer_count # Server quorum is still not met. Bricks should be down on 1st and 2nd nodes -EXPECT_WITHIN $PROCESS_DOWN_TIMEOUT "0" brick_up_status_1 $V0 $H1 $B1/${V0}1 -EXPECT_WITHIN $PROCESS_DOWN_TIMEOUT "0" brick_up_status_1 $V0 $H2 $B2/${V0}2 +EXPECT_WITHIN $PROCESS_DOWN_TIMEOUT "0" cluster_brick_up_status 1 $V0 $H1 $B1/${V0}1 +EXPECT_WITHIN $PROCESS_DOWN_TIMEOUT "0" cluster_brick_up_status 1 $V0 $H2 $B2/${V0}2 # Bring back 3rd glusterd TEST $glusterd_3 EXPECT_WITHIN $PROBE_TIMEOUT 2 peer_count # Server quorum is met now. Bricks should be up on all nodes -EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status_1 $V0 $H1 $B1/${V0}1 -EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status_1 $V0 $H2 $B2/${V0}2 -EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status_1 $V0 $H3 $B3/${V0}3 +# Check from 3rd instance of glusterd so that the 3rd node finishes all its +# handshake and then report back the brick status +EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" cluster_brick_up_status 3 $V0 $H1 $B1/${V0}1 +EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" cluster_brick_up_status 3 $V0 $H2 $B2/${V0}2 +EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" cluster_brick_up_status 3 $V0 $H3 $B3/${V0}3 + +# Check from 1st instance of glusterd +EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" cluster_brick_up_status 3 $V0 $H1 $B1/${V0}1 +EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" cluster_brick_up_status 3 $V0 $H2 $B2/${V0}2 +EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" cluster_brick_up_status 3 $V0 $H3 $B3/${V0}3 + +# TODO : Because commit fe71ee7 introduced a delay of 1 sec to wait for shd connect and +# disconnect events to be serially processed during a restart of shd daemon, +# this introduced a race where while releasing big lock, if any command sneaks +# and acquires the big lock, it might be able to work on a volinfo which is +# stale. We need to find a better way to fix this. + +sleep 3 # quorum is met. replace-brick will execute successfully EXPECT_WITHIN $PEER_SYNC_TIMEOUT 0 attempt_replace_brick 1 $V0 $H2:$B2/${V0}2 $H2:$B2/${V0}2_new TEST $CLI_1 volume reset all TEST $CLI_1 volume set $V0 cluster.server-quorum-type server -EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status_1 $V0 $H1 $B1/${V0}1 -EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status_1 $V0 $H2 $B2/${V0}2_new -EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status_1 $V0 $H3 $B3/${V0}3 +EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" cluster_brick_up_status 1 $V0 $H1 $B1/${V0}1 +EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" cluster_brick_up_status 1 $V0 $H2 $B2/${V0}2_new +EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" cluster_brick_up_status 1 $V0 $H3 $B3/${V0}3 #bug-913555 - volume should become unwritable when quorum does not met @@ -92,15 +107,15 @@ EXPECT_WITHIN $PROCESS_UP_TIMEOUT 0 check_fs $M0; # Kill one pseudo-node, make sure the others survive and volume stays up. TEST kill_node 3; EXPECT_WITHIN $PROBE_TIMEOUT 1 check_peers; -EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status_1 $V0 $H1 $B1/${V0}1 -EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status_1 $V0 $H2 $B2/${V0}2_new +EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" cluster_brick_up_status 1 $V0 $H1 $B1/${V0}1 +EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" cluster_brick_up_status 1 $V0 $H2 $B2/${V0}2_new EXPECT_WITHIN $PROCESS_UP_TIMEOUT 0 check_fs $M0; # Kill another pseudo-node, make sure the last one dies and volume goes down. TEST kill_node 2; EXPECT_WITHIN $PROBE_TIMEOUT 0 check_peers #two glusterfsds of the other two glusterds must be dead -EXPECT_WITHIN $PROCESS_UP_TIMEOUT "0" brick_up_status_1 $V0 $H1 $B1/${V0}1 +EXPECT_WITHIN $PROCESS_UP_TIMEOUT "0" cluster_brick_up_status 1 $V0 $H1 $B1/${V0}1 EXPECT_WITHIN $PROCESS_UP_TIMEOUT 1 check_fs $M0; TEST $glusterd_2; diff --git a/tests/bugs/glusterfs-server/bug-852147.t b/tests/bugs/glusterfs-server/bug-852147.t index 8cb5fd13f85..75db2a26e05 100755 --- a/tests/bugs/glusterfs-server/bug-852147.t +++ b/tests/bugs/glusterfs-server/bug-852147.t @@ -11,7 +11,7 @@ TEST glusterd; TEST pidof glusterd; TEST $CLI volume info; -TEST $CLI volume create $V0 replica 2 stripe 2 $H0:$B0/${V0}{1,2,3,4,5,6,7,8}; +TEST $CLI volume create $V0 replica 3 $H0:$B0/${V0}{1,2,3,4,5,6}; ## Verify volume is is created EXPECT "$V0" volinfo_field $V0 'Volume Name'; @@ -42,7 +42,7 @@ function vol_prof_info() { $CLI volume profile $V0 info | grep Brick | wc -l } -EXPECT "8" vol_prof_info +EXPECT "6" vol_prof_info EXPECT "Stopping volume profile on $V0 has been successful " $CLI volume profile $V0 stop @@ -66,7 +66,7 @@ ren_file=$log_file".*" rm -rf $ren_file #Initiating log rotate -TEST $CLI volume log rotate $V0 +TEST $CLI volume log $V0 rotate #Capturing new log file's size new_file_size=`file-size $log_file` diff --git a/tests/bugs/glusterfs-server/bug-864222.t b/tests/bugs/glusterfs-server/bug-864222.t index 3a46c283599..01a7a4e3afd 100755 --- a/tests/bugs/glusterfs-server/bug-864222.t +++ b/tests/bugs/glusterfs-server/bug-864222.t @@ -4,6 +4,8 @@ . $(dirname $0)/../../nfs.rc . $(dirname $0)/../../volume.rc +#G_TESTDEF_TEST_STATUS_CENTOS6=NFS_TEST + cleanup; TEST glusterd diff --git a/tests/bugs/glusterfs-server/bug-873549.t b/tests/bugs/glusterfs-server/bug-873549.t index a3b2f9c9bf7..8b5534728fd 100644 --- a/tests/bugs/glusterfs-server/bug-873549.t +++ b/tests/bugs/glusterfs-server/bug-873549.t @@ -10,7 +10,7 @@ TEST $CLI volume info; TEST $CLI volume create $V0 $H0:$B0/${V0}{1,2}; -TEST $CLI volume set $V0 performance.cache-size 512MB +TEST $CLI volume set $V0 performance.quick-read-cache-size 512MB TEST $CLI volume start $V0 TEST $CLI volume statedump $V0 all diff --git a/tests/bugs/glusterfs-server/bug-877992.t b/tests/bugs/glusterfs-server/bug-877992.t index aeb73ed94dd..300000bcf2c 100755 --- a/tests/bugs/glusterfs-server/bug-877992.t +++ b/tests/bugs/glusterfs-server/bug-877992.t @@ -46,7 +46,9 @@ TEST $CLI volume create $V0 $H0:$B0/${V0}1; EXPECT "$V0" volinfo_field $V0 'Volume Name'; EXPECT 'Created' volinfo_field $V0 'Status'; EXPECT 'createPre' cat /tmp/pre.out; -EXPECT 'createPost' cat /tmp/post.out; +# Spost.sh comes after S10selinux-label-brick.sh under create post hook script +# list. So consider the delay in setting SELinux context on bricks +EXPECT_WITHIN 5 'createPost' cat /tmp/post.out; hooks_cleanup 'create' diff --git a/tests/bugs/glusterfs-server/bug-887145.t b/tests/bugs/glusterfs-server/bug-887145.t index 9b940259f55..db2cf3c050b 100755 --- a/tests/bugs/glusterfs-server/bug-887145.t +++ b/tests/bugs/glusterfs-server/bug-887145.t @@ -3,6 +3,8 @@ . $(dirname $0)/../../include.rc . $(dirname $0)/../../nfs.rc +#G_TESTDEF_TEST_STATUS_CENTOS6=NFS_TEST + cleanup; TEST glusterd @@ -27,7 +29,15 @@ chmod 600 $M0/file; TEST mount_nfs $H0:/$V0 $N0 nolock; -chown -R nfsnobody:nfsnobody $M0/dir; +grep nfsnobody /etc/passwd > /dev/null +if [ $? -eq 1 ]; then +usr=nobody +grp=nobody +else +usr=nfsnobody +grp=nfsnobody +fi +chown -R $usr:$grp $M0/dir; chown -R tmp_user:tmp_user $M0/other; TEST $CLI volume set $V0 server.root-squash on; @@ -36,7 +46,7 @@ EXPECT_WITHIN $NFS_EXPORT_TIMEOUT "1" is_nfs_export_available; # create files and directories in the root of the glusterfs and nfs mount # which is owned by root and hence the right behavior is getting EACCESS -# as the fops are executed as nfsnobody. +# as the fops are executed as nfsnobody/nobody. touch $M0/foo 2>/dev/null; TEST [ $? -ne 0 ] touch $N0/foo 2>/dev/null; @@ -59,7 +69,7 @@ cat $N0/passwd 1>/dev/null; TEST [ $? -eq 0 ] # create files and directories should succeed as the fops are being executed -# inside the directory owned by nfsnobody +# inside the directory owned by nfsnobody/nobody TEST touch $M0/dir/file; TEST touch $N0/dir/foo; TEST mkdir $M0/dir/new; diff --git a/tests/bugs/glusterfs-server/bug-904300.t b/tests/bugs/glusterfs-server/bug-904300.t index eea1c5b5463..95d5d381c8b 100755 --- a/tests/bugs/glusterfs-server/bug-904300.t +++ b/tests/bugs/glusterfs-server/bug-904300.t @@ -4,6 +4,8 @@ . $(dirname $0)/../../nfs.rc . $(dirname $0)/../../volume.rc +#G_TESTDEF_TEST_STATUS_CENTOS6=NFS_TEST + cleanup; # 1-8 diff --git a/tests/bugs/glusterfs-server/bug-905864.c b/tests/bugs/glusterfs-server/bug-905864.c index 3cc4cc5d232..f70003736e7 100644 --- a/tests/bugs/glusterfs-server/bug-905864.c +++ b/tests/bugs/glusterfs-server/bug-905864.c @@ -4,10 +4,9 @@ #include <fcntl.h> #include <pthread.h> - -pthread_t th[5] = {0}; +pthread_t th[5] = {0}; void -flock_init (struct flock *f, short int type, off_t start, off_t len) +flock_init(struct flock *f, short int type, off_t start, off_t len) { f->l_type = type; f->l_start = start; @@ -15,68 +14,70 @@ flock_init (struct flock *f, short int type, off_t start, off_t len) } int -flock_range_in_steps (int fd, int is_set, short l_type, - int start, int end, int step) +flock_range_in_steps(int fd, int is_set, short l_type, int start, int end, + int step) { - int ret = 0; - int i = 0; - struct flock f = {0,}; + int ret = 0; + int i = 0; + struct flock f = { + 0, + }; - for (i = start; i+step < end; i += step) { - flock_init (&f, l_type, i, step); - ret = fcntl (fd, (is_set) ? F_SETLKW : F_GETLK, &f); - if (ret) { - perror ("fcntl"); - goto out; - } + for (i = start; i + step < end; i += step) { + flock_init(&f, l_type, i, step); + ret = fcntl(fd, (is_set) ? F_SETLKW : F_GETLK, &f); + if (ret) { + perror("fcntl"); + goto out; } + } out: - return ret; + return ret; } void * -random_locker (void *arg) +random_locker(void *arg) { - int fd = *(int *)arg; - int i = 0; - int is_set = 0; + int fd = *(int *)arg; + int i = 0; + int is_set = 0; - /* use thread id to choose GETLK or SETLK operation*/ - is_set = pthread_self () % 2; - (void)flock_range_in_steps (fd, is_set, F_WRLCK, 0, 400, 1); + /* use thread id to choose GETLK or SETLK operation*/ + is_set = pthread_self() % 2; + (void)flock_range_in_steps(fd, is_set, F_WRLCK, 0, 400, 1); - return NULL; + return NULL; } - -int main (int argc, char **argv) +int +main(int argc, char **argv) { - int fd = -1; - int ret = 1; - int i = 0; - char *fname = NULL; + int fd = -1; + int ret = 1; + int i = 0; + char *fname = NULL; - if (argc < 2) - goto out; + if (argc < 2) + goto out; - fname = argv[1]; - fd = open (fname, O_RDWR); - if (fd == -1) { - perror ("open"); - goto out; - } + fname = argv[1]; + fd = open(fname, O_RDWR); + if (fd == -1) { + perror("open"); + goto out; + } - ret = flock_range_in_steps (fd, 1, F_WRLCK, 0, 2000, 2); - for (i = 0; i < 5; i++) { - pthread_create (&th[i], NULL, random_locker, (void *) &fd); - } - ret = flock_range_in_steps (fd, 1, F_WRLCK, 0, 2000, 2); - for (i = 0; i < 5; i++) { - pthread_join (th[i], NULL); - } + ret = flock_range_in_steps(fd, 1, F_WRLCK, 0, 2000, 2); + for (i = 0; i < 5; i++) { + pthread_create(&th[i], NULL, random_locker, (void *)&fd); + } + ret = flock_range_in_steps(fd, 1, F_WRLCK, 0, 2000, 2); + for (i = 0; i < 5; i++) { + pthread_join(th[i], NULL); + } out: - if (fd != -1) - close (fd); + if (fd != -1) + close(fd); - return ret; + return ret; } diff --git a/tests/bugs/glusterfs-server/bug-912297.t b/tests/bugs/glusterfs-server/bug-912297.t index f1f4147e6aa..08f5dcea9b9 100755 --- a/tests/bugs/glusterfs-server/bug-912297.t +++ b/tests/bugs/glusterfs-server/bug-912297.t @@ -8,7 +8,7 @@ cleanup; ## Start and create a volume TEST glusterd; TEST pidof glusterd; -TEST $CLI volume create $V0 replica 2 stripe 2 $H0:$B0/${V0}{1,2,3,4,5,6,7,8}; +TEST $CLI volume create $V0 replica 3 $H0:$B0/${V0}{1,2,3,4,5,6}; ## Verify volume is is created EXPECT "$V0" volinfo_field $V0 'Volume Name'; diff --git a/tests/bugs/glusterfs/bug-844688.t b/tests/bugs/glusterfs/bug-844688.t index 39f04092cf7..65f41b342a5 100755 --- a/tests/bugs/glusterfs/bug-844688.t +++ b/tests/bugs/glusterfs/bug-844688.t @@ -3,6 +3,17 @@ . $(dirname $0)/../../include.rc . $(dirname $0)/../../volume.rc +function check_callstack_log { + local text=$1 + statedump_file=$(generate_mount_statedump $V0); + grep $text $statedump_file 2>/dev/null 1>/dev/null; + if [ $? -eq 0 ]; then + echo "1"; + else + echo "0"; + fi; +} + cleanup; TEST glusterd @@ -15,19 +26,29 @@ mount_pid=$(get_mount_process_pid $V0); # enable dumping of call stack creation and frame creation times in statedump # monitoring is enabled by default -TEST touch $M0/touchfile; -(dd if=/dev/urandom of=$M0/file bs=5k 2>/dev/null 1>/dev/null)& -back_pid=$!; -statedump_file=$(generate_mount_statedump $V0); -grep "callstack-creation-time" $statedump_file 2>/dev/null 1>/dev/null; -TEST [ $? -eq 0 ]; -grep "frame-creation-time" $statedump_file 2>/dev/null 1>/dev/null; -TEST [ $? -eq 0 ]; +# We want to make sure that there is a pending frame in gluster stack. +# For that we are creating a blocking lock scenario. + +TEST touch $M0/lockfile; +# Open two fd's on the same file +exec 8>$M0/lockfile; +exec 9>$M0/lockfile; + +# First flock will succeed and the second one will block, hence the background run. +flock -x 8 ; +flock -x 9 & + +EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" check_callstack_log "callstack-creation-time"; +EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" check_callstack_log "frame-creation-time"; + +flock -u 8 +flock -u 9; -kill -SIGTERM $back_pid; -wait >/dev/null 2>&1; +# Closing the fd's +exec 8>&- +exec 9>&- -TEST rm -f $M0/touchfile $M0/file; +TEST rm -f $M0/lockfile; EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0 rm -f $statedumpdir/glusterdump.$mount_pid.*; diff --git a/tests/bugs/glusterfs/bug-867253.t b/tests/bugs/glusterfs/bug-867253.t index c2c6c2ab629..8c3c39baace 100644 --- a/tests/bugs/glusterfs/bug-867253.t +++ b/tests/bugs/glusterfs/bug-867253.t @@ -4,6 +4,8 @@ . $(dirname $0)/../../volume.rc . $(dirname $0)/../../nfs.rc +#G_TESTDEF_TEST_STATUS_CENTOS6=NFS_TEST + cleanup; function file_count() diff --git a/tests/bugs/glusterfs/bug-872923.t b/tests/bugs/glusterfs/bug-872923.t index 72e8f230864..00e02c89cbe 100755 --- a/tests/bugs/glusterfs/bug-872923.t +++ b/tests/bugs/glusterfs/bug-872923.t @@ -4,6 +4,8 @@ . $(dirname $0)/../../volume.rc . $(dirname $0)/../../nfs.rc +#G_TESTDEF_TEST_STATUS_CENTOS6=NFS_TEST + cleanup; TEST glusterd diff --git a/tests/bugs/glusterfs/bug-873962-spb.t b/tests/bugs/glusterfs/bug-873962-spb.t index db84a223089..db71cc0f6fe 100644 --- a/tests/bugs/glusterfs/bug-873962-spb.t +++ b/tests/bugs/glusterfs/bug-873962-spb.t @@ -14,6 +14,7 @@ TEST $CLI volume set $V0 performance.io-cache off TEST $CLI volume set $V0 performance.write-behind off TEST $CLI volume set $V0 performance.stat-prefetch off TEST $CLI volume set $V0 performance.read-ahead off +TEST $CLI volume set $V0 performance.open-behind off TEST $CLI volume set $V0 cluster.background-self-heal-count 0 TEST $CLI volume start $V0 TEST glusterfs --entry-timeout=0 --attribute-timeout=0 -s $H0 --volfile-id=$V0 $M0 --direct-io-mode=enable diff --git a/tests/bugs/glusterfs/bug-879490.t b/tests/bugs/glusterfs/bug-879490.t index c254b4f59eb..fb8d4263919 100755 --- a/tests/bugs/glusterfs/bug-879490.t +++ b/tests/bugs/glusterfs/bug-879490.t @@ -10,7 +10,7 @@ TEST glusterd; TEST pidof glusterd; TEST $CLI volume info; -TEST $CLI volume create $V0 replica 2 stripe 2 $H0:$B0/${V0}{1,2,3,4,5,6,7,8}; +TEST $CLI volume create $V0 replica 3 $H0:$B0/${V0}{1,2,3,4,5,6}; ## Verify volume is is created EXPECT "$V0" volinfo_field $V0 'Volume Name'; diff --git a/tests/bugs/glusterfs/bug-879494.t b/tests/bugs/glusterfs/bug-879494.t index 06a5e5d876d..12ee466b33a 100755 --- a/tests/bugs/glusterfs/bug-879494.t +++ b/tests/bugs/glusterfs/bug-879494.t @@ -10,7 +10,7 @@ TEST glusterd; TEST pidof glusterd; TEST $CLI volume info; -TEST $CLI volume create $V0 replica 2 stripe 2 $H0:$B0/${V0}{1,2,3,4,5,6,7,8}; +TEST $CLI volume create $V0 replica 3 $H0:$B0/${V0}{1,2,3,4,5,6}; ## Verify volume is is created EXPECT "$V0" volinfo_field $V0 'Volume Name'; diff --git a/tests/bugs/glusterfs/bug-893338.t b/tests/bugs/glusterfs/bug-893338.t index 0df1b9af2fe..b915d3e791e 100644 --- a/tests/bugs/glusterfs/bug-893338.t +++ b/tests/bugs/glusterfs/bug-893338.t @@ -10,7 +10,7 @@ TEST glusterd; TEST pidof glusterd; TEST $CLI volume info; -TEST $CLI volume create $V0 stripe 2 $H0:$B0/${V0}{1,2,3,4}; +TEST $CLI volume create $V0 replica 3 $H0:$B0/${V0}{1,2,3,4,5,6}; ## Verify volume is is created EXPECT "$V0" volinfo_field $V0 'Volume Name'; diff --git a/tests/bugs/glusterfs/bug-896431.t b/tests/bugs/glusterfs/bug-896431.t index 7764a88d896..61f71141713 100755 --- a/tests/bugs/glusterfs/bug-896431.t +++ b/tests/bugs/glusterfs/bug-896431.t @@ -8,7 +8,7 @@ cleanup; ## Start and create a volume TEST glusterd; TEST pidof glusterd; -TEST $CLI volume create $V0 replica 2 stripe 2 $H0:$B0/${V0}{1,2,3,4,5,6,7,8}; +TEST $CLI volume create $V0 replica 3 $H0:$B0/${V0}{1,2,3,4,5,6}; ## Verify volume is created EXPECT "$V0" volinfo_field $V0 'Volume Name'; @@ -87,38 +87,3 @@ TEST $CLI volume delete $V0; TEST ! $CLI volume info $V0; cleanup; - -## Start and create a pure stripe volume -TEST glusterd; -TEST pidof glusterd; -TEST $CLI volume create $V0 stripe 8 $H0:$B0/${V0}{1,2,3,4,5,6,7,8}; - -## Verify volume is created -EXPECT "$V0" volinfo_field $V0 'Volume Name'; -EXPECT 'Created' volinfo_field $V0 'Status'; -EXPECT 'Stripe' volinfo_field $V0 'Type'; - -## Start volume and verify -TEST $CLI volume start $V0; -EXPECT 'Started' volinfo_field $V0 'Status'; - -## Setting cluster.subvols-per-directory as 8 for a stripe volume -TEST ! $CLI volume set $V0 cluster.subvols-per-directory 8 -EXPECT '' volinfo_field $V0 'cluster.subvols-per-directory'; -TEST ! $CLI volume set $V0 subvols-per-directory 8 -EXPECT '' volinfo_field $V0 'cluster.subvols-per-directory'; - -## Setting cluster.subvols-per-directory as 1 for a stripe volume -TEST $CLI volume set $V0 cluster.subvols-per-directory 1 -EXPECT '1' volinfo_field $V0 'cluster.subvols-per-directory'; -TEST $CLI volume set $V0 subvols-per-directory 1 -EXPECT '1' volinfo_field $V0 'cluster.subvols-per-directory'; - -## Finish up -TEST $CLI volume stop $V0; -EXPECT 'Stopped' volinfo_field $V0 'Status'; - -TEST $CLI volume delete $V0; -TEST ! $CLI volume info $V0; - -cleanup; diff --git a/tests/bugs/glusterfs/bug-902610.t b/tests/bugs/glusterfs/bug-902610.t index b45e92b8a3b..112c947e116 100755 --- a/tests/bugs/glusterfs/bug-902610.t +++ b/tests/bugs/glusterfs/bug-902610.t @@ -28,7 +28,7 @@ function get_layout() fi # Figure out where the join point is. - target=$( $PYTHON -c "print '%08x' % (0x$layout1_e + 1)") + target=$( $PYTHON -c "print('%08x' % (0x$layout1_e + 1))") #echo "target for layout2 = $target" > /dev/tty # The second layout should cover everything that the first doesn't. diff --git a/tests/bugs/glusterfs/bug-906646.t b/tests/bugs/glusterfs/bug-906646.t index 45c85d9f67c..37b8fe5c8eb 100644 --- a/tests/bugs/glusterfs/bug-906646.t +++ b/tests/bugs/glusterfs/bug-906646.t @@ -13,7 +13,6 @@ TEST pidof glusterd TEST $CLI volume create $V0 replica $REPLICA $H0:$B0/${V0}-00 $H0:$B0/${V0}-01 $H0:$B0/${V0}-10 $H0:$B0/${V0}-11 TEST $CLI volume start $V0 -TEST $CLI volume set $V0 cluster.self-heal-daemon off TEST $CLI volume set $V0 cluster.background-self-heal-count 0 ## Mount FUSE with caching disabled @@ -82,10 +81,15 @@ EXPECT 1 xattr_query_check ${backend_paths_array[1]} "trusted.name" # restart the brick process TEST $CLI volume start $V0 force -EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status $V0 `expr $brick_id - 1` +EXPECT_WITHIN $PROCESS_UP_TIMEOUT "Y" glustershd_up_status +EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 0 +EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 1 +EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 2 +EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 3 -cat $pth >/dev/null +TEST $CLI volume heal $V0 +EXPECT_WITHIN $HEAL_TIMEOUT "0" get_pending_heal_count $V0 # check backends - xattr should not be present anywhere EXPECT 1 xattr_query_check ${backend_paths_array[0]} "trusted.name" EXPECT 1 xattr_query_check ${backend_paths_array[1]} "trusted.name" diff --git a/tests/bugs/glusterfs/getlk_owner.c b/tests/bugs/glusterfs/getlk_owner.c index 85fd1042496..cbe277318c1 100644 --- a/tests/bugs/glusterfs/getlk_owner.c +++ b/tests/bugs/glusterfs/getlk_owner.c @@ -3,24 +3,24 @@ #include <fcntl.h> #include <string.h> -#define GETLK_OWNER_CHECK(f, cp, label) \ - do { \ - switch (f.l_type) { \ - case F_RDLCK: \ - case F_WRLCK: \ - ret = 1; \ - goto label; \ - case F_UNLCK: \ - if (!are_flocks_sane (&f, &cp)) { \ - ret = 1; \ - goto label; \ - } \ - break; \ - } \ +#define GETLK_OWNER_CHECK(f, cp, label) \ + do { \ + switch (f.l_type) { \ + case F_RDLCK: \ + case F_WRLCK: \ + ret = 1; \ + goto label; \ + case F_UNLCK: \ + if (!are_flocks_sane(&f, &cp)) { \ + ret = 1; \ + goto label; \ + } \ + break; \ + } \ } while (0) void -flock_init (struct flock *f, short int type, off_t start, off_t len) +flock_init(struct flock *f, short int type, off_t start, off_t len) { f->l_type = type; f->l_start = start; @@ -28,17 +28,16 @@ flock_init (struct flock *f, short int type, off_t start, off_t len) } int -flock_cp (struct flock *dst, struct flock *src) +flock_cp(struct flock *dst, struct flock *src) { - memcpy ((void *) dst, (void *) src, sizeof (struct flock)); + memcpy((void *)dst, (void *)src, sizeof(struct flock)); } int -are_flocks_sane (struct flock *src, struct flock *cpy) +are_flocks_sane(struct flock *src, struct flock *cpy) { return ((src->l_whence == cpy->l_whence) && - (src->l_start == cpy->l_start) && - (src->l_len == cpy->l_len)); + (src->l_start == cpy->l_start) && (src->l_len == cpy->l_len)); } /* @@ -53,68 +52,73 @@ are_flocks_sane (struct flock *src, struct flock *cpy) * * */ -int main (int argc, char **argv) +int +main(int argc, char **argv) { int fd = -1; int ret = 1; char *fname = NULL; - struct flock f = {0,}; - struct flock cp = {0,}; + struct flock f = { + 0, + }; + struct flock cp = { + 0, + }; if (argc < 2) goto out; fname = argv[1]; - fd = open (fname, O_RDWR); + fd = open(fname, O_RDWR); if (fd == -1) { - perror ("open"); + perror("open"); goto out; } - flock_init (&f, F_WRLCK, 0, 3); - flock_cp (&cp, &f); - ret = fcntl (fd, F_SETLK, &f); + flock_init(&f, F_WRLCK, 0, 3); + flock_cp(&cp, &f); + ret = fcntl(fd, F_SETLK, &f); if (ret) { - perror ("fcntl"); + perror("fcntl"); goto out; } - if (!are_flocks_sane (&f, &cp)) { + if (!are_flocks_sane(&f, &cp)) { ret = 1; goto out; } - flock_init (&f, F_WRLCK, 3, 3); - flock_cp (&cp, &f); - ret = fcntl (fd, F_SETLK, &f); + flock_init(&f, F_WRLCK, 3, 3); + flock_cp(&cp, &f); + ret = fcntl(fd, F_SETLK, &f); if (ret) { - perror ("fcntl"); + perror("fcntl"); goto out; } - if (!are_flocks_sane (&f, &cp)) { + if (!are_flocks_sane(&f, &cp)) { ret = 1; goto out; } - flock_init (&f, F_WRLCK, 3, 3); - flock_cp (&cp, &f); - ret = fcntl (fd, F_GETLK, &f); + flock_init(&f, F_WRLCK, 3, 3); + flock_cp(&cp, &f); + ret = fcntl(fd, F_GETLK, &f); if (ret) { - perror ("fcntl"); + perror("fcntl"); return 1; } - GETLK_OWNER_CHECK (f, cp, out); + GETLK_OWNER_CHECK(f, cp, out); - flock_init (&f, F_RDLCK, 3, 3); - flock_cp (&cp, &f); - ret = fcntl (fd, F_GETLK, &f); + flock_init(&f, F_RDLCK, 3, 3); + flock_cp(&cp, &f); + ret = fcntl(fd, F_GETLK, &f); if (ret) { - perror ("fcntl"); + perror("fcntl"); return 1; } - GETLK_OWNER_CHECK (f, cp, out); + GETLK_OWNER_CHECK(f, cp, out); out: if (fd != -1) - close (fd); + close(fd); return ret; } diff --git a/tests/bugs/index/bug-1559004-EMLINK-handling.t b/tests/bugs/index/bug-1559004-EMLINK-handling.t index 82ea8b2d36a..5596fa56c4c 100644 --- a/tests/bugs/index/bug-1559004-EMLINK-handling.t +++ b/tests/bugs/index/bug-1559004-EMLINK-handling.t @@ -4,9 +4,39 @@ . $(dirname $0)/../../volume.rc . $(dirname $0)/../../afr.rc +function create_fake_links() { + local dst="$1" + local dir="$2" + local end=0 + local start=0 + local src + + src="$(ls ${dst}/.glusterfs/indices/${dir}/${dir}-* | head -1)" + mkdir -p ${dst}/.glusterfs/dummy/${dir} + while ln ${src} ${dst}/.glusterfs/dummy/${dir}/link-${end}; do + end="$((${end} + 1))" + done + + if [[ ${end} -gt 50 ]]; then + start="$((${end} - 50))" + fi + if [[ ${end} -gt 0 ]]; then + end="$((${end} - 1))" + fi + + for i in $(seq ${start} ${end}); do + rm -f ${dst}/.glusterfs/dummy/${dir}/link-${i} + done +} + +function count_fake_links() { + local dst="$1" + local dir="$2" + + echo "$(find ${dst}/.glusterfs/dummy/${dir}/ -name "link-*" | wc -l)" +} + cleanup -TESTS_EXPECTED_IN_LOOP=30 -SCRIPT_TIMEOUT=1200 TEST glusterd TEST pidof glusterd @@ -32,21 +62,30 @@ TEST mount -t ext4 -o loop $B0/ext4-3 $B0/ext43 TEST $CLI volume create $V0 replica 3 $H0:$B0/ext4{1,2,3} TEST $CLI volume start $V0 TEST $CLI volume heal $V0 granular-entry-heal enable -TEST $GFS --volfile-id=$V0 --volfile-server=$H0 $M0; +TEST $GFS --volfile-id=$V0 --volfile-server=$H0 $M0 TEST kill_brick $V0 $H0 $B0/ext41 -for i in {1..15} -do - TEST_IN_LOOP mkdir $M0/d${i} - TEST_IN_LOOP touch $M0/d${i}/{1..5000} -done + +# Make sure indices exist and are initialized +TEST touch $M0/dummy + +# Create enough hard links on bricks to make it fail faster. This is much +# faster than creating ~70000 files on a volume. +create_fake_links $B0/ext42 xattrop & +create_fake_links $B0/ext42 entry-changes & +wait +count_xattrop="$(count_fake_links $B0/ext42 xattrop)" +count_entry="$(count_fake_links $B0/ext42 entry-changes)" + +TEST mkdir $M0/d{1..10} +TEST touch $M0/d{1..10}/{1..10} #On ext4 max number of hardlinks is ~65k, so there should be 2 base index files EXPECT "^2$" echo $(ls $B0/ext42/.glusterfs/indices/xattrop | grep xattrop | wc -l) EXPECT "^2$" echo $(ls $B0/ext42/.glusterfs/indices/entry-changes | grep entry-changes | wc -l) -#Number of hardlinks: 75000 for files, 15 for dirs and 2 for base-indices -#and root-dir for xattrop -EXPECT "75018" echo $(ls -l $B0/ext42/.glusterfs/indices/xattrop | grep xattrop | awk '{sum+=$2} END{print sum}') -EXPECT "75017" echo $(ls -l $B0/ext42/.glusterfs/indices/entry-changes | grep entry-changes | awk '{sum+=$2} END{print sum}') +#Number of hardlinks: count_xattrop/count_entry for fake links, 101 for files, +# 10 for dirs and 2 for base-indices and root-dir for xattrop +EXPECT "$((${count_xattrop} + 114))" echo $(ls -l $B0/ext42/.glusterfs/indices/xattrop | grep xattrop | awk '{sum+=$2} END{print sum}') +EXPECT "$((${count_entry} + 113))" echo $(ls -l $B0/ext42/.glusterfs/indices/entry-changes | grep entry-changes | awk '{sum+=$2} END{print sum}') cleanup diff --git a/tests/bugs/io-cache/bug-858242.c b/tests/bugs/io-cache/bug-858242.c index b6a412d578c..ac87a15533e 100644 --- a/tests/bugs/io-cache/bug-858242.c +++ b/tests/bugs/io-cache/bug-858242.c @@ -10,72 +10,75 @@ #include <unistd.h> int -main (int argc, char *argv[]) +main(int argc, char *argv[]) { - char *filename = NULL, *volname = NULL, *cmd = NULL; - char buffer[1024] = {0, }; - int fd = -1; - int ret = -1; - struct stat statbuf = {0, }; + char *filename = NULL, *volname = NULL, *cmd = NULL; + char buffer[1024] = { + 0, + }; + int fd = -1; + int ret = -1; + struct stat statbuf = { + 0, + }; - if (argc != 3) { - fprintf (stderr, "usage: %s <file-name> <volname>\n", argv[0]); - goto out; - } + if (argc != 3) { + fprintf(stderr, "usage: %s <file-name> <volname>\n", argv[0]); + goto out; + } - filename = argv[1]; - volname = argv[2]; + filename = argv[1]; + volname = argv[2]; - fd = open (filename, O_RDWR | O_CREAT, 0); - if (fd < 0) { - fprintf (stderr, "open (%s) failed (%s)\n", filename, - strerror (errno)); - goto out; - } + fd = open(filename, O_RDWR | O_CREAT, 0); + if (fd < 0) { + fprintf(stderr, "open (%s) failed (%s)\n", filename, strerror(errno)); + goto out; + } - ret = write (fd, "test-content", 12); - if (ret < 0) { - fprintf (stderr, "write failed (%s)", strerror (errno)); - goto out; - } + ret = write(fd, "test-content", 12); + if (ret < 0) { + fprintf(stderr, "write failed (%s)", strerror(errno)); + goto out; + } - ret = fsync (fd); - if (ret < 0) { - fprintf (stderr, "fsync failed (%s)", strerror (errno)); - goto out; - } + ret = fsync(fd); + if (ret < 0) { + fprintf(stderr, "fsync failed (%s)", strerror(errno)); + goto out; + } - ret = fstat (fd, &statbuf); - if (ret < 0) { - fprintf (stderr, "fstat failed (%s)", strerror (errno)); - goto out; - } + ret = fstat(fd, &statbuf); + if (ret < 0) { + fprintf(stderr, "fstat failed (%s)", strerror(errno)); + goto out; + } - ret = asprintf (&cmd, "gluster --mode=script volume stop %s force", - volname); - if (ret < 0) { - fprintf (stderr, "cannot construct cli command string (%s)", - strerror (errno)); - goto out; - } + ret = asprintf(&cmd, "gluster --mode=script volume stop %s force", volname); + if (ret < 0) { + fprintf(stderr, "cannot construct cli command string (%s)", + strerror(errno)); + goto out; + } - ret = system (cmd); - if (ret < 0) { - fprintf (stderr, "stopping volume (%s) failed", volname); - goto out; - } + ret = system(cmd); + if (ret < 0) { + fprintf(stderr, "stopping volume (%s) failed", volname); + goto out; + } - sleep (3); + sleep(3); - ret = read (fd, buffer, 1024); - if (ret >= 0) { - fprintf (stderr, "read should've returned error, " - "but is successful\n"); - ret = -1; - goto out; - } + ret = read(fd, buffer, 1024); + if (ret >= 0) { + fprintf(stderr, + "read should've returned error, " + "but is successful\n"); + ret = -1; + goto out; + } - ret = 0; + ret = 0; out: - return ret; + return ret; } diff --git a/tests/bugs/io-cache/bug-read-hang.c b/tests/bugs/io-cache/bug-read-hang.c index 7709a41719d..e1fae97e7e8 100644 --- a/tests/bugs/io-cache/bug-read-hang.c +++ b/tests/bugs/io-cache/bug-read-hang.c @@ -9,117 +9,117 @@ int count = 0; void -read_cbk (glfs_fd_t *fd, ssize_t ret, void *data) { -count++; +read_cbk(glfs_fd_t *fd, ssize_t ret, void *data) +{ + count++; } glfs_t * setup_new_client(char *hostname, char *volname, char *log_file, int flag) { - int ret = 0; - glfs_t *fs = NULL; - - fs = glfs_new (volname); - if (!fs) { - fprintf (stderr, "\nglfs_new: returned NULL (%s)\n", - strerror (errno)); - goto error; - } - - ret = glfs_set_volfile_server (fs, "tcp", hostname, 24007); - if (ret < 0) { - fprintf (stderr, "\nglfs_set_volfile_server failed ret:%d (%s)\n", - ret, strerror (errno)); - goto error; - } - - ret = glfs_set_logging (fs, log_file, 7); - if (ret < 0) { - fprintf (stderr, "\nglfs_set_logging failed with ret: %d (%s)\n", - ret, strerror (errno)); - goto error; - } - - if (flag == NO_INIT) - goto out; - - ret = glfs_init (fs); - if (ret < 0) { - fprintf (stderr, "\nglfs_init failed with ret: %d (%s)\n", - ret, strerror (errno)); - goto error; - } + int ret = 0; + glfs_t *fs = NULL; + + fs = glfs_new(volname); + if (!fs) { + fprintf(stderr, "\nglfs_new: returned NULL (%s)\n", strerror(errno)); + goto error; + } + + ret = glfs_set_volfile_server(fs, "tcp", hostname, 24007); + if (ret < 0) { + fprintf(stderr, "\nglfs_set_volfile_server failed ret:%d (%s)\n", ret, + strerror(errno)); + goto error; + } + + ret = glfs_set_logging(fs, log_file, 7); + if (ret < 0) { + fprintf(stderr, "\nglfs_set_logging failed with ret: %d (%s)\n", ret, + strerror(errno)); + goto error; + } + + if (flag == NO_INIT) + goto out; + + ret = glfs_init(fs); + if (ret < 0) { + fprintf(stderr, "\nglfs_init failed with ret: %d (%s)\n", ret, + strerror(errno)); + goto error; + } out: - return fs; + return fs; error: - return NULL; + return NULL; } int -main (int argc, char *argv[]) +main(int argc, char *argv[]) { - int ret = 0; - glfs_t *fs = NULL; - struct glfs_fd *fd = NULL; - char *volname = NULL; - char *log_file = NULL; - char *hostname = NULL; - char *buf = NULL; - struct stat stat; - - if (argc != 4) { - fprintf (stderr, - "Expect following args %s <hostname> <Vol> <log file location>\n" - , argv[0]); - return -1; - } - - hostname = argv[1]; - volname = argv[2]; - log_file = argv[3]; - - fs = setup_new_client (hostname, volname, log_file, 0); - if (!fs) { - fprintf (stderr, "\nsetup_new_client: returned NULL (%s)\n", - strerror (errno)); - goto error; - } - - fd = glfs_opendir (fs, "/"); - if (!fd) { - fprintf (stderr, "/: %s\n", strerror (errno)); - return -1; - } - - glfs_readdirplus (fd, &stat); - - fd = glfs_open (fs, "/test", O_RDWR); - if (fd == NULL) { - fprintf (stderr, "glfs_open: returned NULL\n"); - goto error; - } - - buf = (char *) malloc (5); - - ret = glfs_pread (fd, buf, 5, 0, 0, NULL); - if (ret < 0) { - fprintf (stderr, "Read(%s): %d (%s)\n", "test", ret, - strerror (errno)); - return ret; - } - - free (buf); - glfs_close (fd); - - ret = glfs_fini (fs); - if (ret < 0) { - fprintf (stderr, "glfs_fini failed with ret: %d (%s)\n", - ret, strerror (errno)); - return -1; - } - - return 0; -error: + int ret = 0; + glfs_t *fs = NULL; + struct glfs_fd *fd = NULL; + char *volname = NULL; + char *log_file = NULL; + char *hostname = NULL; + char *buf = NULL; + struct stat stat; + + if (argc != 4) { + fprintf( + stderr, + "Expect following args %s <hostname> <Vol> <log file location>\n", + argv[0]); + return -1; + } + + hostname = argv[1]; + volname = argv[2]; + log_file = argv[3]; + + fs = setup_new_client(hostname, volname, log_file, 0); + if (!fs) { + fprintf(stderr, "\nsetup_new_client: returned NULL (%s)\n", + strerror(errno)); + goto error; + } + + fd = glfs_opendir(fs, "/"); + if (!fd) { + fprintf(stderr, "/: %s\n", strerror(errno)); + return -1; + } + + glfs_readdirplus(fd, &stat); + + fd = glfs_open(fs, "/test", O_RDWR); + if (fd == NULL) { + fprintf(stderr, "glfs_open: returned NULL\n"); + goto error; + } + + buf = (char *)malloc(5); + + ret = glfs_pread(fd, buf, 5, 0, 0, NULL); + if (ret < 0) { + fprintf(stderr, "Read(%s): %d (%s)\n", "test", ret, strerror(errno)); + return ret; + } + + free(buf); + glfs_close(fd); + + ret = glfs_fini(fs); + if (ret < 0) { + fprintf(stderr, "glfs_fini failed with ret: %d (%s)\n", ret, + strerror(errno)); return -1; + } + + return 0; +error: + return -1; } diff --git a/tests/bugs/logging/bug-823081.t b/tests/bugs/logging/bug-823081.t index 0ed8f4c26c1..bd1965d2d49 100755 --- a/tests/bugs/logging/bug-823081.t +++ b/tests/bugs/logging/bug-823081.t @@ -22,20 +22,20 @@ function set_tail () set_tail $V0; TEST $CLI volume create $V0 $H0:$B0/${V0}{1,2}; -tail=`tail -n 1 $logdir/$cmd_log_history | cut -d " " -f 5-` +tail=`tail -n 1 $logdir/$cmd_log_history | cut -d " " -f 6-` TEST [[ \"$tail\" == \"$tail_success\" ]] TEST ! $CLI volume create $V0 $H0:$B0/${V0}{1,2}; -tail=`tail -n 1 $logdir/$cmd_log_history | cut -d " " -f 5-` +tail=`tail -n 1 $logdir/$cmd_log_history | cut -d " " -f 6-` TEST [[ \"$tail\" == \"$tail_failure\" ]] set_tail $V1; TEST gluster volume create $V1 $H0:$B0/${V1}{1,2} force; -tail=`tail -n 1 $logdir/$cmd_log_history | cut -d " " -f 5-` +tail=`tail -n 1 $logdir/$cmd_log_history | cut -d " " -f 6-` TEST [[ \"$tail\" == \"$tail_success_force\" ]] TEST ! gluster volume create $V1 $H0:$B0/${V1}{1,2} force; -tail=`tail -n 1 $logdir/$cmd_log_history | cut -d " " -f 5-` +tail=`tail -n 1 $logdir/$cmd_log_history | cut -d " " -f 6-` TEST [[ \"$tail\" == \"$tail_failure_force\" ]] cleanup; diff --git a/tests/bugs/md-cache/bug-1632503.t b/tests/bugs/md-cache/bug-1632503.t new file mode 100755 index 00000000000..aeb57f65639 --- /dev/null +++ b/tests/bugs/md-cache/bug-1632503.t @@ -0,0 +1,24 @@ +#!/bin/bash + +. $(dirname $0)/../../include.rc +. $(dirname $0)/../../volume.rc + +cleanup; +TESTS_EXPECTED_IN_LOOP=5 + +TEST glusterd; + +TEST $CLI volume create $V0 $H0:$B0/${V0}{1,2,3}; + +TEST $CLI volume start $V0 + +TEST $CLI volume set $V0 performance.md-cache-timeout 600 +TEST $CLI volume set $V0 performance.md-cache-statfs on + +TEST glusterfs --volfile-id=/$V0 --volfile-server=$H0 $M0 + +for i in $(seq 1 5); do + TEST_IN_LOOP df $M0; +done + +cleanup; diff --git a/tests/bugs/md-cache/bug-1726205.t b/tests/bugs/md-cache/bug-1726205.t new file mode 100644 index 00000000000..795130e9bd8 --- /dev/null +++ b/tests/bugs/md-cache/bug-1726205.t @@ -0,0 +1,22 @@ +#!/bin/bash + +. $(dirname $0)/../../include.rc +. $(dirname $0)/../../volume.rc + +cleanup; + +TEST glusterd; + +TEST $CLI volume create $V0 $H0:$B0/${V0}{1,2,3}; + +TEST $CLI volume start $V0 + +TEST $CLI volume set $V0 group samba + +TEST $GFS --volfile-id=/$V0 --volfile-server=$H0 $M0 + +TEST touch $M0/file +TEST "setfattr -n "user.DosStream.Zone.Identifier:\$DATA" -v '\0' $M0/file" +TEST "getfattr -n "user.DosStream.Zone.Identifier:\$DATA" -e hex $M0/file | grep -q 0x00" + +cleanup; diff --git a/tests/bugs/md-cache/setxattr-prepoststat.t b/tests/bugs/md-cache/setxattr-prepoststat.t new file mode 100755 index 00000000000..01fa768299c --- /dev/null +++ b/tests/bugs/md-cache/setxattr-prepoststat.t @@ -0,0 +1,38 @@ +#!/bin/bash + +. $(dirname $0)/../../include.rc +. $(dirname $0)/../../volume.rc + +cleanup; + +## 1. Start glusterd +TEST glusterd; + +## 2. Lets create volume +TEST $CLI volume create $V0 disperse 6 redundancy 2 $H0:$B0/${V0}{0..5} + +TEST $CLI volume set $V0 group metadata-cache +TEST $CLI volume set $V0 performance.xattr-cache-list "user.*" +TEST $CLI volume start $V0 + +TEST glusterfs --volfile-id=/$V0 --volfile-server=$H0 $M0 +TEST glusterfs --volfile-id=/$V0 --volfile-server=$H0 $M1 + +TEST touch $M0/file1 +TEST `echo "abakjshdjahskjdhakjhdskjac" >> $M0/file1` +size=`stat -c '%s' $M0/file1` + +## Setxattr from mount-0 +TEST "setfattr -n user.DOSATTRIB -v "abc" $M0/file1" +EXPECT $size stat -c '%s' $M0/file1 + +## Getxattr from mount-1, this should return the correct value +TEST "getfattr -n user.DOSATTRIB $M1/file1 | grep -q abc" + +TEST "setfattr -x user.DOSATTRIB $M1/file1" +EXPECT $size stat -c '%s' $M1/file1 + +EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0 +EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M1 + +cleanup; diff --git a/tests/bugs/nfs/bug-1053579.t b/tests/bugs/nfs/bug-1053579.t index f616eb2baa5..2f53172e24c 100755 --- a/tests/bugs/nfs/bug-1053579.t +++ b/tests/bugs/nfs/bug-1053579.t @@ -4,6 +4,8 @@ . $(dirname $0)/../../volume.rc . $(dirname $0)/../../nfs.rc +#G_TESTDEF_TEST_STATUS_CENTOS6=NFS_TEST + cleanup # prepare the users and groups diff --git a/tests/bugs/nfs/bug-1116503.t b/tests/bugs/nfs/bug-1116503.t deleted file mode 100644 index c9ed840ec92..00000000000 --- a/tests/bugs/nfs/bug-1116503.t +++ /dev/null @@ -1,46 +0,0 @@ -#!/bin/bash -# -# Verify that mounting NFS over UDP (MOUNT service only) works. -# - -. $(dirname $0)/../../include.rc -. $(dirname $0)/../../volume.rc -. $(dirname $0)/../../nfs.rc - - -cleanup; -TEST glusterd -TEST pidof glusterd - -TEST $CLI volume create $V0 $H0:$B0/$V0 -TEST $CLI volume set $V0 nfs.disable false -TEST $CLI volume set $V0 nfs.mount-udp on - -TEST $CLI volume start $V0 -EXPECT_WITHIN $NFS_EXPORT_TIMEOUT "1" is_nfs_export_available; - -TEST mount_nfs $H0:/$V0 $N0 nolock,mountproto=udp,proto=tcp; -TEST mkdir -p $N0/foo/bar -TEST ls $N0/foo -TEST ls $N0/foo/bar -EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $N0 - -EXPECT_WITHIN $NFS_EXPORT_TIMEOUT "1" is_nfs_export_available; -TEST mount_nfs $H0:/$V0/foo $N0 nolock,mountproto=udp,proto=tcp; -EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $N0 - -EXPECT_WITHIN $NFS_EXPORT_TIMEOUT "1" is_nfs_export_available; -TEST mount_nfs $H0:/$V0/foo/bar $N0 nolock,mountproto=udp,proto=tcp; -EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $N0 - -TEST $CLI volume set $V0 nfs.addr-namelookup on -TEST $CLI volume set $V0 nfs.rpc-auth-allow $H0 -EXPECT_WITHIN $NFS_EXPORT_TIMEOUT "1" is_nfs_export_available; -TEST mount_nfs $H0:/$V0/foo/bar $N0 nolock,mountproto=udp,proto=tcp; -EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $N0 - -TEST $CLI volume set $V0 nfs.rpc-auth-reject $H0 -EXPECT_WITHIN $NFS_EXPORT_TIMEOUT "1" is_nfs_export_available; -TEST ! mount_nfs $H0:/$V0/foo/bar $N0 nolock,mountproto=udp,proto=tcp; - -cleanup; diff --git a/tests/bugs/nfs/bug-1143880-fix-gNFSd-auth-crash.t b/tests/bugs/nfs/bug-1143880-fix-gNFSd-auth-crash.t index b194b3744b4..c360db4c91c 100644 --- a/tests/bugs/nfs/bug-1143880-fix-gNFSd-auth-crash.t +++ b/tests/bugs/nfs/bug-1143880-fix-gNFSd-auth-crash.t @@ -2,6 +2,9 @@ . $(dirname $0)/../../include.rc . $(dirname $0)/../../nfs.rc + +#G_TESTDEF_TEST_STATUS_CENTOS6=NFS_TEST + cleanup; TEST glusterd diff --git a/tests/bugs/nfs/bug-1157223-symlink-mounting.t b/tests/bugs/nfs/bug-1157223-symlink-mounting.t index 740d638193d..dea609ed193 100644 --- a/tests/bugs/nfs/bug-1157223-symlink-mounting.t +++ b/tests/bugs/nfs/bug-1157223-symlink-mounting.t @@ -3,6 +3,8 @@ . $(dirname $0)/../../include.rc . $(dirname $0)/../../nfs.rc +#G_TESTDEF_TEST_STATUS_CENTOS6=NFS_TEST + cleanup; ## Start and create a volume diff --git a/tests/bugs/nfs/bug-1161092-nfs-acls.t b/tests/bugs/nfs/bug-1161092-nfs-acls.t index 1304ad905bf..45a22e79336 100644 --- a/tests/bugs/nfs/bug-1161092-nfs-acls.t +++ b/tests/bugs/nfs/bug-1161092-nfs-acls.t @@ -3,6 +3,8 @@ . $(dirname $0)/../../include.rc . $(dirname $0)/../../nfs.rc +#G_TESTDEF_TEST_STATUS_CENTOS6=NFS_TEST + cleanup; TEST glusterd diff --git a/tests/bugs/nfs/bug-1166862.t b/tests/bugs/nfs/bug-1166862.t index f986fe36ab7..c4f51a2d446 100755 --- a/tests/bugs/nfs/bug-1166862.t +++ b/tests/bugs/nfs/bug-1166862.t @@ -5,6 +5,8 @@ # Based on: bug-904065.t # +#G_TESTDEF_TEST_STATUS_CENTOS6=NFS_TEST + # count the lines of a file, return 0 if the file does not exist function count_lines() { diff --git a/tests/bugs/nfs/bug-1210338.c b/tests/bugs/nfs/bug-1210338.c index 7a17b9d68ce..d4099244176 100644 --- a/tests/bugs/nfs/bug-1210338.c +++ b/tests/bugs/nfs/bug-1210338.c @@ -7,26 +7,25 @@ #include <fcntl.h> #include <sys/stat.h> - int -main (int argc, char *argv[]) +main(int argc, char *argv[]) { - int ret = -1; - int fd = -1; + int ret = -1; + int fd = -1; - fd = open (argv[1], O_CREAT|O_EXCL, 0644); + fd = open(argv[1], O_CREAT | O_EXCL, 0644); - if (fd == -1) { - fprintf (stderr, "creation of the file %s failed (%s)\n", argv[1], - strerror (errno)); - goto out; - } + if (fd == -1) { + fprintf(stderr, "creation of the file %s failed (%s)\n", argv[1], + strerror(errno)); + goto out; + } - ret = 0; + ret = 0; out: - if (fd > 0) - close (fd); + if (fd > 0) + close(fd); - return ret; + return ret; } diff --git a/tests/bugs/nfs/bug-1210338.t b/tests/bugs/nfs/bug-1210338.t index 4232b9d8748..b5c9245affd 100644 --- a/tests/bugs/nfs/bug-1210338.t +++ b/tests/bugs/nfs/bug-1210338.t @@ -4,6 +4,8 @@ . $(dirname $0)/../../volume.rc . $(dirname $0)/../../nfs.rc +#G_TESTDEF_TEST_STATUS_CENTOS6=NFS_TEST + cleanup; NFS_SOURCE=$(dirname $0)/bug-1210338.c diff --git a/tests/bugs/nfs/bug-847622.t b/tests/bugs/nfs/bug-847622.t index 3b836745a07..5ccee722ed9 100755 --- a/tests/bugs/nfs/bug-847622.t +++ b/tests/bugs/nfs/bug-847622.t @@ -4,6 +4,8 @@ . $(dirname $0)/../../nfs.rc . $(dirname $0)/../../volume.rc +#G_TESTDEF_TEST_STATUS_CENTOS6=NFS_TEST + case $OSTYPE in NetBSD) echo "Skip test on ACL which are not available on NetBSD" >&2 diff --git a/tests/bugs/nfs/bug-877885.t b/tests/bugs/nfs/bug-877885.t index a47893d7fcb..dca315a3d01 100755 --- a/tests/bugs/nfs/bug-877885.t +++ b/tests/bugs/nfs/bug-877885.t @@ -4,6 +4,8 @@ . $(dirname $0)/../../nfs.rc . $(dirname $0)/../../volume.rc +#G_TESTDEF_TEST_STATUS_CENTOS6=NFS_TEST + cleanup; TEST glusterd diff --git a/tests/bugs/nfs/bug-904065.t b/tests/bugs/nfs/bug-904065.t index effd5972c9a..0eba86e7ee8 100755 --- a/tests/bugs/nfs/bug-904065.t +++ b/tests/bugs/nfs/bug-904065.t @@ -7,6 +7,8 @@ # sufficient. # +#G_TESTDEF_TEST_STATUS_CENTOS6=NFS_TEST + # count the lines of a file, return 0 if the file does not exist function count_lines() { diff --git a/tests/bugs/nfs/bug-915280.t b/tests/bugs/nfs/bug-915280.t index d70c36f0a53..bd279157c25 100755 --- a/tests/bugs/nfs/bug-915280.t +++ b/tests/bugs/nfs/bug-915280.t @@ -4,6 +4,8 @@ . $(dirname $0)/../../volume.rc . $(dirname $0)/../../nfs.rc +#G_TESTDEF_TEST_STATUS_CENTOS6=NFS_TEST + cleanup; TEST glusterd diff --git a/tests/bugs/nfs/bug-974972.t b/tests/bugs/nfs/bug-974972.t index 7047825b3d4..975c46f85a4 100755 --- a/tests/bugs/nfs/bug-974972.t +++ b/tests/bugs/nfs/bug-974972.t @@ -4,6 +4,8 @@ . $(dirname $0)/../../volume.rc . $(dirname $0)/../../nfs.rc +#G_TESTDEF_TEST_STATUS_CENTOS6=NFS_TEST + #This script checks that nfs mount does not fail lookup on files with split-brain cleanup; diff --git a/tests/bugs/nfs/showmount-many-clients.t b/tests/bugs/nfs/showmount-many-clients.t index f1b6859d528..c6c9c35d60a 100644 --- a/tests/bugs/nfs/showmount-many-clients.t +++ b/tests/bugs/nfs/showmount-many-clients.t @@ -12,6 +12,8 @@ # the groups into their own structures, this testcase passes. # +#G_TESTDEF_TEST_STATUS_CENTOS6=NFS_TEST + . $(dirname $0)/../../include.rc . $(dirname $0)/../../nfs.rc . $(dirname $0)/../../volume.rc diff --git a/tests/bugs/nfs/socket-as-fifo.py b/tests/bugs/nfs/socket-as-fifo.py index 796b8ef671b..eb507e1d30b 100755 --- a/tests/bugs/nfs/socket-as-fifo.py +++ b/tests/bugs/nfs/socket-as-fifo.py @@ -1,4 +1,3 @@ -#!/usr/bin/python2 # # Create a unix domain socket and test if it is a socket (and not a fifo/pipe). # diff --git a/tests/bugs/nfs/socket-as-fifo.t b/tests/bugs/nfs/socket-as-fifo.t index ca5f2af6f2b..d9b9e959ce3 100644 --- a/tests/bugs/nfs/socket-as-fifo.t +++ b/tests/bugs/nfs/socket-as-fifo.t @@ -4,6 +4,8 @@ . $(dirname $0)/../../volume.rc . $(dirname $0)/../../nfs.rc +#G_TESTDEF_TEST_STATUS_CENTOS6=NFS_TEST + cleanup; TEST glusterd @@ -16,7 +18,7 @@ EXPECT_WITHIN $NFS_EXPORT_TIMEOUT "1" is_nfs_export_available; TEST mount_nfs $H0:/$V0 $N0 nolock # this is the actual test -TEST $(dirname $0)/socket-as-fifo.py $N0/not-a-fifo.socket +TEST $PYTHON $(dirname $0)/socket-as-fifo.py $N0/not-a-fifo.socket TEST umount_nfs $N0 diff --git a/tests/bugs/nfs/subdir-trailing-slash.t b/tests/bugs/nfs/subdir-trailing-slash.t index a00959443d0..6a114877ac7 100644 --- a/tests/bugs/nfs/subdir-trailing-slash.t +++ b/tests/bugs/nfs/subdir-trailing-slash.t @@ -10,6 +10,7 @@ . $(dirname $0)/../../volume.rc . $(dirname $0)/../../nfs.rc +#G_TESTDEF_TEST_STATUS_CENTOS6=NFS_TEST cleanup; TEST glusterd diff --git a/tests/bugs/nfs/zero-atime.t b/tests/bugs/nfs/zero-atime.t index 631240a692f..2a940091ad9 100755 --- a/tests/bugs/nfs/zero-atime.t +++ b/tests/bugs/nfs/zero-atime.t @@ -8,6 +8,8 @@ . $(dirname $0)/../../volume.rc . $(dirname $0)/../../nfs.rc +#G_TESTDEF_TEST_STATUS_CENTOS6=NFS_TEST + cleanup TEST glusterd diff --git a/tests/bugs/posix/bug-1040275-brick-uid-reset-on-volume-restart.t b/tests/bugs/posix/bug-1040275-brick-uid-reset-on-volume-restart.t index e67616db618..3839c6e3380 100755 --- a/tests/bugs/posix/bug-1040275-brick-uid-reset-on-volume-restart.t +++ b/tests/bugs/posix/bug-1040275-brick-uid-reset-on-volume-restart.t @@ -11,17 +11,21 @@ function get_gid() { stat -c '%g' $1; } +function check_stat() { + stat $1 + echo $? +} cleanup; TEST glusterd TEST pidof glusterd -TEST $CLI volume create $V0 replica 2 stripe 2 $H0:$B0/${V0}{1,2,3,4,5,6,7,8}; +TEST $CLI volume create $V0 replica 3 $H0:$B0/${V0}{1,2,3,4,5,6}; EXPECT "$V0" volinfo_field $V0 'Volume Name'; EXPECT 'Created' volinfo_field $V0 'Status'; -EXPECT '8' brick_count $V0 +EXPECT '6' brick_count $V0 TEST $CLI volume start $V0; EXPECT 'Started' volinfo_field $V0 'Status'; @@ -37,7 +41,10 @@ EXPECT 100 get_uid $M0; EXPECT 101 get_gid $M0; TEST $CLI volume stop $V0; +EXPECT_WITHIN $PROCESS_UP_TIMEOUT "0" online_brick_count + TEST $CLI volume start $V0; +EXPECT_WITHIN $PROCESS_UP_TIMEOUT "6" online_brick_count EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 0 EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 1 @@ -45,9 +52,8 @@ EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 2 EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 3 EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 4 EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 5 -EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 6 -EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 7 +EXPECT_WITHIN $PROCESS_UP_TIMEOUT "0" check_stat $M0 EXPECT 100 get_uid $M0; EXPECT 101 get_gid $M0; diff --git a/tests/bugs/posix/bug-1175711.c b/tests/bugs/posix/bug-1175711.c index fbbea3f636b..8ab193c4014 100644 --- a/tests/bugs/posix/bug-1175711.c +++ b/tests/bugs/posix/bug-1175711.c @@ -6,32 +6,32 @@ int main(int argc, char **argv) { - DIR *dir = NULL; - struct dirent *entry = NULL; - int ret = 0; - char *path = NULL; + DIR *dir = NULL; + struct dirent *entry = NULL; + int ret = 0; + char *path = NULL; - assert (argc == 2); - path = argv[1]; + assert(argc == 2); + path = argv[1]; - dir = opendir(path); - if (!dir) { - printf("opendir(%s) failed.\n", path); - return -1; - } + dir = opendir(path); + if (!dir) { + printf("opendir(%s) failed.\n", path); + return -1; + } #ifdef _DIRENT_HAVE_D_TYPE - while ((entry = readdir(dir)) != NULL) { - if (entry->d_type == DT_UNKNOWN) { - printf("d_type found to be DT_UNKNOWN\n"); - ret = -1; - break; - } + while ((entry = readdir(dir)) != NULL) { + if (entry->d_type == DT_UNKNOWN) { + printf("d_type found to be DT_UNKNOWN\n"); + ret = -1; + break; } + } #endif - if (dir) - closedir(dir); + if (dir) + closedir(dir); - return ret; + return ret; } diff --git a/tests/bugs/posix/bug-1619720.t b/tests/bugs/posix/bug-1619720.t new file mode 100755 index 00000000000..bfd304dc809 --- /dev/null +++ b/tests/bugs/posix/bug-1619720.t @@ -0,0 +1,58 @@ +#!/bin/bash + +. $(dirname $0)/../../include.rc +. $(dirname $0)/../../dht.rc + +cleanup; + + +# Test steps: +# The test checks to make sure that the trusted.pgfid.xx xattr is set on +# both the linkto and data files post the final rename. +# The test creates files file-1 and file-3 so that src_hashed = dst_hashed, +# src_cached = dst_cached and xxx_hashed != xxx_cached. +# It then renames file-1 to file-3 which triggers the posix_mknod call +# which updates the trusted.pgfid.xx xattr. + + +TEST glusterd +TEST pidof glusterd + +TEST $CLI volume create $V0 $H0:$B0/${V0}0 $H0:$B0/${V0}1 +TEST $CLI volume start $V0 +TEST $CLI volume set $V0 storage.build-pgfid on + +## Mount FUSE +TEST glusterfs -s $H0 --volfile-id $V0 $M0; + +TEST mkdir $M0/tmp + + + +# Not the best way to do this but I need files which hash to the same subvol and +# whose cached subvols are the same. +# In a 2 subvol distributed volume, file-{1,3} hash to the same subvol. +# file-2 will hash to the other subvol + +TEST touch $M0/tmp/file-2 +pgfid_xattr_name=$(getfattr -m "trusted.pgfid.*" $B0/${V0}1/tmp/file-2 | grep "trusted.pgfid") +echo $pgfid_xattr_name + + +TEST mv $M0/tmp/file-2 $M0/tmp/file-1 +TEST touch $M0/tmp/file-2 +TEST mv $M0/tmp/file-2 $M0/tmp/file-3 + +# At this point, both the file-1 and file-3 data files exist on one subvol +# and both linkto files on the other + +TEST mv -f $M0/tmp/file-1 $M0/tmp/file-3 + + +TEST getfattr -n $pgfid_xattr_name $B0/${V0}0/tmp/file-3 +TEST getfattr -n $pgfid_xattr_name $B0/${V0}1/tmp/file-3 + +# Not required for the test but an extra check if required. +# The linkto file was not renamed Without the fix. +#TEST mv $M0/tmp/file-3 $M0/tmp/file-6 +cleanup; diff --git a/tests/bugs/posix/bug-1651445.t b/tests/bugs/posix/bug-1651445.t new file mode 100644 index 00000000000..4d08b69b9b0 --- /dev/null +++ b/tests/bugs/posix/bug-1651445.t @@ -0,0 +1,54 @@ +#!/bin/bash + +. $(dirname $0)/../../include.rc +. $(dirname $0)/../../volume.rc +. $(dirname $0)/../../snapshot.rc + +cleanup + +TEST verify_lvm_version +TEST glusterd +TEST pidof glusterd +TEST init_n_bricks 3 +TEST setup_lvm 3 + +TEST $CLI volume create $V0 replica 3 $H0:$L{1,2,3} +TEST $CLI volume start $V0 + +TEST glusterfs --volfile-id=/$V0 --volfile-server=$H0 $M0 + +#Setting the size in bytes +TEST $CLI volume set $V0 storage.reserve 40MB + +#wait 5s to reset disk_space_full flag +sleep 5 + +TEST dd if=/dev/zero of=$M0/a bs=100M count=1 +TEST dd if=/dev/zero of=$M0/b bs=10M count=1 + +# Wait 5s to update disk_space_full flag because thread check disk space +# after every 5s + +sleep 5 +# setup_lvm create lvm partition of 150M and 40M are reserve so after +# consuming more than 110M next dd should fail +TEST ! dd if=/dev/zero of=$M0/c bs=5M count=1 +TEST dd if=/dev/urandom of=$M0/a bs=1022 count=1 oflag=seek_bytes,sync seek=102 conv=notrunc + +rm -rf $M0/* + +#Setting the size in percent and repeating the above steps +TEST $CLI volume set $V0 storage.reserve 40 + +sleep 5 + +TEST dd if=/dev/zero of=$M0/a bs=80M count=1 +TEST dd if=/dev/zero of=$M0/b bs=10M count=1 + +sleep 5 +TEST ! dd if=/dev/zero of=$M0/c bs=5M count=1 + +TEST $CLI volume stop $V0 +TEST $CLI volume delete $V0 + +cleanup diff --git a/tests/bugs/posix/disallow-gfid-volumeid-fremovexattr.c b/tests/bugs/posix/disallow-gfid-volumeid-fremovexattr.c index 325edbbed97..4ed3181d48f 100644 --- a/tests/bugs/posix/disallow-gfid-volumeid-fremovexattr.c +++ b/tests/bugs/posix/disallow-gfid-volumeid-fremovexattr.c @@ -5,94 +5,100 @@ #include <string.h> int -main (int argc, char *argv[]) +main(int argc, char *argv[]) { - glfs_t *fs = NULL; - int ret = 0; - int i = 0; - glfs_fd_t *fd = NULL; - char *logfile = NULL; - char *hostname = NULL; + glfs_t *fs = NULL; + int ret = 0; + int i = 0; + glfs_fd_t *fd = NULL; + char *logfile = NULL; + char *hostname = NULL; - if (argc != 4) { - fprintf (stderr, - "Expect following args %s <hostname> <Vol> <log file>\n" - , argv[0]); - return -1; - } + if (argc != 4) { + fprintf(stderr, + "Expect following args %s <hostname> <Vol> <log file>\n", + argv[0]); + return -1; + } - hostname = argv[1]; - logfile = argv[3]; + hostname = argv[1]; + logfile = argv[3]; - fs = glfs_new (argv[2]); - if (!fs) { - fprintf (stderr, "glfs_new: returned NULL (%s)\n", - strerror (errno)); - return -1; - } + fs = glfs_new(argv[2]); + if (!fs) { + fprintf(stderr, "glfs_new: returned NULL (%s)\n", strerror(errno)); + return -1; + } - ret = glfs_set_volfile_server (fs, "tcp", hostname, 24007); - if (ret < 0) { - fprintf (stderr, "glfs_set_volfile_server failed ret:%d (%s)\n", - ret, strerror (errno)); - return -1; - } + ret = glfs_set_volfile_server(fs, "tcp", hostname, 24007); + if (ret < 0) { + fprintf(stderr, "glfs_set_volfile_server failed ret:%d (%s)\n", ret, + strerror(errno)); + return -1; + } - ret = glfs_set_logging (fs, logfile, 7); - if (ret < 0) { - fprintf (stderr, "glfs_set_logging failed with ret: %d (%s)\n", - ret, strerror (errno)); - return -1; - } + ret = glfs_set_logging(fs, logfile, 7); + if (ret < 0) { + fprintf(stderr, "glfs_set_logging failed with ret: %d (%s)\n", ret, + strerror(errno)); + return -1; + } - ret = glfs_init (fs); - if (ret < 0) { - fprintf (stderr, "glfs_init failed with ret: %d (%s)\n", - ret, strerror (errno)); - return -1; - } + ret = glfs_init(fs); + if (ret < 0) { + fprintf(stderr, "glfs_init failed with ret: %d (%s)\n", ret, + strerror(errno)); + return -1; + } - fd = glfs_opendir (fs, "/"); - if (!fd) { - fprintf (stderr, "glfs_opendir failed with (%s)\n", - strerror (errno)); - return -1; - } + fd = glfs_opendir(fs, "/"); + if (!fd) { + fprintf(stderr, "glfs_opendir failed with (%s)\n", strerror(errno)); + return -1; + } - ret = glfs_fremovexattr (fd, "trusted.gfid"); - if (ret == 0 || errno != EPERM) { - fprintf (stderr, "glfs_fremovexattr gfid exited with ret: " - "%d (%s)\n", ret, strerror (errno)); - return -1; - } + ret = glfs_fremovexattr(fd, "trusted.gfid"); + if (ret == 0 || errno != EPERM) { + fprintf(stderr, + "glfs_fremovexattr gfid exited with ret: " + "%d (%s)\n", + ret, strerror(errno)); + return -1; + } - ret = glfs_fremovexattr (fd, "trusted.glusterfs.volume-id"); - if (ret == 0 || errno != EPERM) { - fprintf (stderr, "glfs_fremovexattr volume-id exited with ret: " - "%d (%s)\n", ret, strerror (errno)); - return -1; - } + ret = glfs_fremovexattr(fd, "trusted.glusterfs.volume-id"); + if (ret == 0 || errno != EPERM) { + fprintf(stderr, + "glfs_fremovexattr volume-id exited with ret: " + "%d (%s)\n", + ret, strerror(errno)); + return -1; + } - ret = glfs_fsetxattr (fd, "trusted.abc", "abc", 3, 0); - if (ret < 0) { - fprintf (stderr, "glfs_fsetxattr trusted.abc exited with ret: " - "%d (%s)\n", ret, strerror (errno)); - return -1; - } + ret = glfs_fsetxattr(fd, "trusted.abc", "abc", 3, 0); + if (ret < 0) { + fprintf(stderr, + "glfs_fsetxattr trusted.abc exited with ret: " + "%d (%s)\n", + ret, strerror(errno)); + return -1; + } - ret = glfs_fremovexattr (fd, "trusted.abc"); - if (ret < 0) { - fprintf (stderr, "glfs_fremovexattr trusted.abc exited with " - "ret: %d (%s)\n", ret, strerror (errno)); - return -1; - } + ret = glfs_fremovexattr(fd, "trusted.abc"); + if (ret < 0) { + fprintf(stderr, + "glfs_fremovexattr trusted.abc exited with " + "ret: %d (%s)\n", + ret, strerror(errno)); + return -1; + } - (void) glfs_closedir(fd); - ret = glfs_fini (fs); - if (ret < 0) { - fprintf (stderr, "glfs_fini failed with ret: %d (%s)\n", - ret, strerror (errno)); - return -1; - } - return 0; + (void)glfs_closedir(fd); + ret = glfs_fini(fs); + if (ret < 0) { + fprintf(stderr, "glfs_fini failed with ret: %d (%s)\n", ret, + strerror(errno)); + return -1; + } + return 0; } diff --git a/tests/bugs/protocol/bug-1321578.t b/tests/bugs/protocol/bug-1321578.t index 160fc408fba..83904817467 100644 --- a/tests/bugs/protocol/bug-1321578.t +++ b/tests/bugs/protocol/bug-1321578.t @@ -6,6 +6,7 @@ check_mounted () { df | grep $1 | wc -l } +CHECK_MOUNT_TIMEOUT=7 TEST glusterd TEST $CLI volume create $V0 $H0:$B0/$V0 @@ -23,15 +24,59 @@ $CLI system getspec $V0 | sed -e /username/d -e /password/d > fubar.vol # This mount should fail because auth.allow doesn't include us. TEST $GFS -f fubar.vol $M0 +EXPECT_WITHIN $CHECK_MOUNT_TIMEOUT 0 check_mounted $M0 + +# Add tests when only username is present, but not password +# "System getspec" will include the username and password if the request comes +# from a server (which we are). Unfortunately, this will cause authentication +# to succeed in auth.login regardless of whether auth.addr is working properly +# or not, which is useless to us. To get a proper test, strip out those lines. +$CLI system getspec $V0 | sed -e /password/d > fubar.vol + +# This mount should fail because auth.allow doesn't include our password. +TEST $GFS -f fubar.vol $M0 + # If we had DONT_EXPECT_WITHIN we could use that, but we don't. -sleep 10 -EXPECT 0 check_mounted $M0 +EXPECT_WITHIN $CHECK_MOUNT_TIMEOUT 0 check_mounted $M0 + +# Now, add a test for login failure when server doesn't have the password entry +# Add tests when only username is present, but not password +# "System getspec" will include the username and password if the request comes +# from a server (which we are). Unfortunately, this will cause authentication +# to succeed in auth.login regardless of whether auth.addr is working properly +# or not, which is useless to us. To get a proper test, strip out those lines. +$CLI system getspec $V0 > fubar.vol +TEST $CLI volume stop $V0 + +sed -i -e '/password /d' /var/lib/glusterd/vols/$V0/$V0.*$V0.vol + +TEST $CLI volume start $V0 + +# This mount should fail because auth.allow doesn't include our password. +TEST $GFS -f fubar.vol $M0 + +EXPECT_WITHIN $CHECK_MOUNT_TIMEOUT 0 check_mounted $M0 # Set auth.allow to include us. This mount should therefore succeed. TEST $CLI volume set $V0 auth.allow $H0 +$CLI system getspec $V0 | sed -e /password/d > fubar.vol + +TEST $GFS -f fubar.vol $M0 +EXPECT_WITHIN $CHECK_MOUNT_TIMEOUT 1 check_mounted $M0 + +EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0 + +# Set auth.reject to include us. This mount should therefore fail. +TEST $CLI volume stop $V0 + +TEST $CLI volume set $V0 auth.allow "\*" +TEST $CLI volume set $V0 auth.reject $H0 +TEST $CLI volume start $V0 + +# Do this, so login module is not in picture +$CLI system getspec $V0 | sed -e /password/d > fubar.vol TEST $GFS -f fubar.vol $M0 -sleep 10 -EXPECT 1 check_mounted $M0 +EXPECT_WITHIN $CHECK_MOUNT_TIMEOUT 0 check_mounted $M0 cleanup diff --git a/tests/bugs/protocol/bug-1390914.t b/tests/bugs/protocol/bug-1390914.t new file mode 100644 index 00000000000..e3dab92de5a --- /dev/null +++ b/tests/bugs/protocol/bug-1390914.t @@ -0,0 +1,36 @@ +#!/bin/bash + +. $(dirname $0)/../../include.rc +. $(dirname $0)/../../volume.rc +. $(dirname $0)/../../fileio.rc +cleanup; + +#test that fops are not wound on anon-fd when fd is not open on that brick +TEST glusterd; +TEST pidof glusterd + +TEST $CLI volume create $V0 replica 3 $H0:$B0/${V0}{1,2,3}; +TEST $CLI volume set $V0 performance.open-behind off +TEST $CLI volume set $V0 diagnostics.client-log-level DEBUG +TEST $CLI volume heal $V0 disable +TEST $CLI volume start $V0 +TEST $CLI volume profile $V0 start +TEST $GFS -s $H0 --volfile-id=$V0 --direct-io-mode=enable $M0; + +TEST touch $M0/1 +TEST kill_brick $V0 $H0 $B0/${V0}1 +TEST fd_open 200 'w' "$M0/1" +TEST $CLI volume start $V0 force +EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 0 + +#lk should only happen on 2 bricks, if there is a bug, it will plant a lock +#with anon-fd on first-brick which will never be released because flush won't +#be wound below server xlator for anon-fd +TEST flock -x -n 200 +TEST fd_close 200 + +TEST fd_open 200 'w' "$M0/1" +#this lock will fail if there is a stale lock +TEST flock -x -n 200 +TEST fd_close 200 +cleanup; diff --git a/tests/bugs/protocol/bug-1433815-auth-allow.t b/tests/bugs/protocol/bug-1433815-auth-allow.t index fa22ad8afd5..a78c0eb7111 100644 --- a/tests/bugs/protocol/bug-1433815-auth-allow.t +++ b/tests/bugs/protocol/bug-1433815-auth-allow.t @@ -17,6 +17,7 @@ TEST $CLI volume create $V0 $H0:$B0/$V0 # Set auth.allow so it *doesn't* include ourselves. TEST $CLI volume set $V0 auth.allow 1.2.3.4 TEST $CLI volume start $V0 +EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" online_brick_count # "System getspec" will include the username and password if the request comes # from a server (which we are). Unfortunately, this will cause authentication diff --git a/tests/bugs/protocol/bug-762989.t b/tests/bugs/protocol/bug-762989.t index 1607fcf57f8..7d201b78b58 100755 --- a/tests/bugs/protocol/bug-762989.t +++ b/tests/bugs/protocol/bug-762989.t @@ -21,7 +21,7 @@ TEST glusterd TEST pidof glusterd TEST $CLI volume info; -TEST $CLI volume create $V0 replica 2 stripe 2 $H0:$B0/${V0}{1,2,3,4,5,6,7,8}; +TEST $CLI volume create $V0 replica 3 $H0:$B0/${V0}{1,2,3,4,5,6}; TEST $CLI volume start $V0; diff --git a/tests/bugs/protocol/bug-808400-fcntl.c b/tests/bugs/protocol/bug-808400-fcntl.c index 87a83f317b8..a703ca5c120 100644 --- a/tests/bugs/protocol/bug-808400-fcntl.c +++ b/tests/bugs/protocol/bug-808400-fcntl.c @@ -12,106 +12,113 @@ #endif int -run_child (char *filename) +run_child(char *filename) { - int fd = -1, ret = -1; - struct flock lock = {0, }; - int ppid = 0; - - fd = open (filename, O_RDWR); - if (fd < 0) { - fprintf (stderr, "open failed (%s)\n", strerror (errno)); - goto out; - } - - ppid = getppid (); - - lock.l_type = F_WRLCK; - lock.l_whence = SEEK_SET; - lock.l_start = 0; - lock.l_len = 0; - - ret = fcntl (fd, F_GETLK, &lock); - if (ret < 0) { - fprintf (stderr, "GETLK failed (%s)\n", strerror (errno)); - goto out; - } - - if ((lock.l_type == F_UNLCK) || - (ppid != lock.l_pid)) { - fprintf (stderr, "no locks present, though parent has held " - "one\n"); - ret = -1; - goto out; - } - - ret = 0; + int fd = -1, ret = -1; + struct flock lock = { + 0, + }; + int ppid = 0; + + fd = open(filename, O_RDWR); + if (fd < 0) { + fprintf(stderr, "open failed (%s)\n", strerror(errno)); + goto out; + } + + ppid = getppid(); + + lock.l_type = F_WRLCK; + lock.l_whence = SEEK_SET; + lock.l_start = 0; + lock.l_len = 0; + + ret = fcntl(fd, F_GETLK, &lock); + if (ret < 0) { + fprintf(stderr, "GETLK failed (%s)\n", strerror(errno)); + goto out; + } + + if ((lock.l_type == F_UNLCK) || (ppid != lock.l_pid)) { + fprintf(stderr, + "no locks present, though parent has held " + "one\n"); + ret = -1; + goto out; + } + + ret = 0; out: - return ret; + return ret; } int -main (int argc, char *argv[]) +main(int argc, char *argv[]) { - int fd = -1, ret = -1, status = 0; - char *filename = NULL, *cmd = NULL; - struct stat stbuf = {0, }; - struct flock lock = {0, }; - - if (argc != 3) { - fprintf (stderr, "Usage: %s <filename> " - "<gluster-cmd-to-trigger-graph-switch>\n", argv[0]); - goto out; - } - - filename = argv[1]; - cmd = argv[2]; - - fd = open (filename, O_RDWR | O_CREAT, 0); - if (fd < 0) { - fprintf (stderr, "open (%s) failed (%s)\n", filename, - strerror (errno)); - goto out; - } - - lock.l_type = F_WRLCK; - lock.l_whence = SEEK_SET; - lock.l_start = 0; - lock.l_len = 0; - - ret = fcntl (fd, F_SETLK, &lock); - if (ret < 0) { - fprintf (stderr, "fcntl failed (%s)\n", strerror (errno)); - goto out; - } - - system (cmd); - - /* wait till graph switch completes */ - ret = fstat64 (fd, &stbuf); - if (ret < 0) { - fprintf (stderr, "fstat64 failure (%s)\n", strerror (errno)); - goto out; - } - - sleep (10); - - /* By now old-graph would be disconnected and locks should be cleaned - * up if they are not migrated. Check that by trying to acquire a lock - * on a new fd opened by another process on same file. - */ - ret = fork (); - if (ret == 0) { - ret = run_child (filename); + int fd = -1, ret = -1, status = 0; + char *filename = NULL, *cmd = NULL; + struct stat stbuf = { + 0, + }; + struct flock lock = { + 0, + }; + + if (argc != 3) { + fprintf(stderr, + "Usage: %s <filename> " + "<gluster-cmd-to-trigger-graph-switch>\n", + argv[0]); + goto out; + } + + filename = argv[1]; + cmd = argv[2]; + + fd = open(filename, O_RDWR | O_CREAT, 0); + if (fd < 0) { + fprintf(stderr, "open (%s) failed (%s)\n", filename, strerror(errno)); + goto out; + } + + lock.l_type = F_WRLCK; + lock.l_whence = SEEK_SET; + lock.l_start = 0; + lock.l_len = 0; + + ret = fcntl(fd, F_SETLK, &lock); + if (ret < 0) { + fprintf(stderr, "fcntl failed (%s)\n", strerror(errno)); + goto out; + } + + system(cmd); + + /* wait till graph switch completes */ + ret = fstat64(fd, &stbuf); + if (ret < 0) { + fprintf(stderr, "fstat64 failure (%s)\n", strerror(errno)); + goto out; + } + + sleep(10); + + /* By now old-graph would be disconnected and locks should be cleaned + * up if they are not migrated. Check that by trying to acquire a lock + * on a new fd opened by another process on same file. + */ + ret = fork(); + if (ret == 0) { + ret = run_child(filename); + } else { + wait(&status); + if (WIFEXITED(status)) { + ret = WEXITSTATUS(status); } else { - wait (&status); - if (WIFEXITED(status)) { - ret = WEXITSTATUS(status); - } else { - ret = 0; - } + ret = 0; } + } out: - return ret; + return ret; } diff --git a/tests/bugs/protocol/bug-808400-flock.c b/tests/bugs/protocol/bug-808400-flock.c index bd2ce8cfb01..54a507cc227 100644 --- a/tests/bugs/protocol/bug-808400-flock.c +++ b/tests/bugs/protocol/bug-808400-flock.c @@ -12,85 +12,89 @@ #endif int -run_child (char *filename) +run_child(char *filename) { - int fd = -1, ret = -1; + int fd = -1, ret = -1; - fd = open (filename, O_RDWR); - if (fd < 0) { - fprintf (stderr, "open failed (%s)\n", strerror (errno)); - goto out; - } + fd = open(filename, O_RDWR); + if (fd < 0) { + fprintf(stderr, "open failed (%s)\n", strerror(errno)); + goto out; + } - ret = flock (fd, LOCK_EX | LOCK_NB); - if ((ret == 0) || (errno != EWOULDBLOCK)) { - fprintf (stderr, "no locks present, though parent has held " - "one\n"); - ret = -1; - goto out; - } + ret = flock(fd, LOCK_EX | LOCK_NB); + if ((ret == 0) || (errno != EWOULDBLOCK)) { + fprintf(stderr, + "no locks present, though parent has held " + "one\n"); + ret = -1; + goto out; + } - ret = 0; + ret = 0; out: - return ret; + return ret; } int -main (int argc, char *argv[]) +main(int argc, char *argv[]) { - int fd = -1, ret = -1, status = 0; - char *filename = NULL, *cmd = NULL; - struct stat stbuf = {0, }; + int fd = -1, ret = -1, status = 0; + char *filename = NULL, *cmd = NULL; + struct stat stbuf = { + 0, + }; - if (argc != 3) { - fprintf (stderr, "Usage: %s <filename> " - "<gluster-cmd-to-trigger-graph-switch>\n", argv[0]); - goto out; - } + if (argc != 3) { + fprintf(stderr, + "Usage: %s <filename> " + "<gluster-cmd-to-trigger-graph-switch>\n", + argv[0]); + goto out; + } - filename = argv[1]; - cmd = argv[2]; + filename = argv[1]; + cmd = argv[2]; - fd = open (filename, O_RDWR | O_CREAT, 0); - if (fd < 0) { - fprintf (stderr, "open (%s) failed (%s)\n", filename, - strerror (errno)); - goto out; - } + fd = open(filename, O_RDWR | O_CREAT, 0); + if (fd < 0) { + fprintf(stderr, "open (%s) failed (%s)\n", filename, strerror(errno)); + goto out; + } - ret = flock (fd, LOCK_EX); - if (ret < 0) { - fprintf (stderr, "flock failed (%s)\n", strerror (errno)); - goto out; - } + ret = flock(fd, LOCK_EX); + if (ret < 0) { + fprintf(stderr, "flock failed (%s)\n", strerror(errno)); + goto out; + } - system (cmd); + system(cmd); - /* wait till graph switch completes */ - ret = fstat64 (fd, &stbuf); - if (ret < 0) { - fprintf (stderr, "fstat64 failure (%s)\n", strerror (errno)); - goto out; - } + /* wait till graph switch completes */ + ret = fstat64(fd, &stbuf); + if (ret < 0) { + fprintf(stderr, "fstat64 failure (%s)\n", strerror(errno)); + goto out; + } - sleep (10); + sleep(10); - /* By now old-graph would be disconnected and locks should be cleaned - * up if they are not migrated. Check that by trying to acquire a lock - * on a new fd opened by another process on same file - */ - ret = fork (); - if (ret == 0) { - ret = run_child (filename); + /* By now old-graph would be disconnected and locks should be cleaned + * up if they are not migrated. Check that by trying to acquire a lock + * on a new fd opened by another process on same file + */ + ret = fork(); + if (ret == 0) { + ret = run_child(filename); + } else { + wait(&status); + if (WIFEXITED(status)) { + ret = WEXITSTATUS(status); } else { - wait (&status); - if (WIFEXITED(status)) { - ret = WEXITSTATUS(status); - } else { - ret = 0; - } + ret = 0; } + } out: - return ret; + return ret; } diff --git a/tests/bugs/protocol/bug-808400-stripe.t b/tests/bugs/protocol/bug-808400-stripe.t deleted file mode 100755 index 6d6c7271852..00000000000 --- a/tests/bugs/protocol/bug-808400-stripe.t +++ /dev/null @@ -1,32 +0,0 @@ -#!/bin/bash - -. $(dirname $0)/../../include.rc -. $(dirname $0)/../../volume.rc - -cleanup; - -TEST glusterd -TEST pidof glusterd -TEST $CLI volume info; - -TEST $CLI volume create $V0 stripe 2 $H0:$B0/brick1 $H0:$B0/brick2; -EXPECT 'Created' volinfo_field $V0 'Status'; - -TEST $CLI volume start $V0; -EXPECT 'Started' volinfo_field $V0 'Status'; - -MOUNTDIR=$M0; -TEST glusterfs --entry-timeout=0 --attribute-timeout=0 --volfile-server=$H0 --volfile-id=$V0 $MOUNTDIR; - -build_tester $(dirname $0)/bug-808400-flock.c -build_tester $(dirname $0)/bug-808400-fcntl.c - -TEST $(dirname $0)/bug-808400-flock $MOUNTDIR/testfile \'gluster volume set $V0 performance.write-behind off\' -TEST $(dirname $0)/bug-808400-fcntl $MOUNTDIR/testfile \'gluster volume set $V0 performance.write-behind on\' - -TEST rm -rf $MOUNTDIR/* -TEST rm -rf $(dirname $0)/bug-808400-flock $(dirname $0)/bug-808400-fcntl $(dirname $0)/glusterfs.log - -EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $MOUNTDIR - -cleanup; diff --git a/tests/bugs/quick-read/bug-846240.t b/tests/bugs/quick-read/bug-846240.t index c47040de1d1..bb997e10013 100755 --- a/tests/bugs/quick-read/bug-846240.t +++ b/tests/bugs/quick-read/bug-846240.t @@ -29,6 +29,8 @@ TEST glusterfs --volfile-server=$H0 --volfile-id=$V0 $MOUNTDIR; TEST glusterfs --volfile-server=$H0 --volfile-id=$V0 $M1; TEST touch $M0/testfile; +EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0 +TEST glusterfs --volfile-server=$H0 --volfile-id=$V0 $M0; # open the file with the fd as 4 TEST fd=`fd_available`; @@ -46,8 +48,7 @@ TEST rm -f $M1/testfile; # the file would have been removed from the mount $M1. open() gets error # and the write call which is put into a stub (open had to be sent first) # should unwind with the error received in the open call. -echo "data" >> $M0/testfile 2>/dev/null 1>/dev/null; -TEST [ $? -ne 0 ] +TEST ! fd_write $fd data TEST fd_close $fd; diff --git a/tests/bugs/quick-read/bz1523599/test_bz1523599.c b/tests/bugs/quick-read/bz1523599/test_bz1523599.c index 843408680a7..5076a9447f3 100644 --- a/tests/bugs/quick-read/bz1523599/test_bz1523599.c +++ b/tests/bugs/quick-read/bz1523599/test_bz1523599.c @@ -1,7 +1,8 @@ /* * ./test_bz1523599 0 vm140-111 gv0 test211 log * ./test_bz1523599 1 vm140-111 gv0 test211 log - * Open - Discard - Read - Then check read information to see if the initial TEST_STR_LEN/2 bytes read zero + * Open - Discard - Read - Then check read information to see if the initial + * TEST_STR_LEN/2 bytes read zero */ #define _GNU_SOURCE @@ -15,182 +16,183 @@ #define TEST_STR_LEN 2048 enum fallocate_flag { - TEST_WRITE, - TEST_DISCARD, - TEST_ZEROFILL, + TEST_WRITE, + TEST_DISCARD, + TEST_ZEROFILL, }; -void print_str(char *str, int len) +void +print_str(char *str, int len) { - int i, addr; - - printf("%07x\t", 0); - for (i = 0; i < len; i++) { - printf("%02x", str[i]); - if (i) { - if ((i + 1) % 16 == 0) - printf("\n%07x\t", i+1); - else if ((i + 1) % 4 == 0) - printf(" "); - } - } - printf("\n"); + int i, addr; + + printf("%07x\t", 0); + for (i = 0; i < len; i++) { + printf("%02x", str[i]); + if (i) { + if ((i + 1) % 16 == 0) + printf("\n%07x\t", i + 1); + else if ((i + 1) % 4 == 0) + printf(" "); + } + } + printf("\n"); } int test_read(char *str, int total_length, int len_zero) { - int i; - int ret = 0; - - for (i = 0; i < len_zero; i++) { - if (str[i]) { - fprintf(stderr, "char at position %d not zeroed out\n", - i); - ret = -EIO; - goto out; - } - } - - for (i = len_zero; i < total_length; i++) { - if (str[i] != 0x11) { - fprintf(stderr, - "char at position %d does not contain pattern\n", - i); - ret = -EIO; - goto out; - } - } + int i; + int ret = 0; + + for (i = 0; i < len_zero; i++) { + if (str[i]) { + fprintf(stderr, "char at position %d not zeroed out\n", i); + ret = -EIO; + goto out; + } + } + + for (i = len_zero; i < total_length; i++) { + if (str[i] != 0x11) { + fprintf(stderr, "char at position %d does not contain pattern\n", + i); + ret = -EIO; + goto out; + } + } out: - return ret; + return ret; } -int main(int argc, char *argv[]) +int +main(int argc, char *argv[]) { - int opcode; - char *host_name, *volume_name, *file_path, *glfs_log_path; - glfs_t *fs = NULL; - glfs_fd_t *fd = NULL; - off_t offset = 0; - size_t len_zero = TEST_STR_LEN / 2; - char writestr[TEST_STR_LEN]; - char readstr[TEST_STR_LEN]; - struct iovec iov = {&readstr, TEST_STR_LEN}; - int i; - int ret = 1; - - for (i = 0; i < TEST_STR_LEN; i++) - writestr[i] = 0x11; - for (i = 0; i < TEST_STR_LEN; i++) - readstr[i] = 0x22; - - if (argc != 6) { - fprintf(stderr, - "Syntax: %s <test type> <host> <volname> <file-path> <log-file>\n", - argv[0]); - return 1; - } - - opcode = atoi(argv[1]); - host_name = argv[2]; - volume_name = argv[3]; - file_path = argv[4]; - glfs_log_path = argv[5]; - - fs = glfs_new(volume_name); - if (!fs) { - perror("glfs_new"); - return 1; - } - - ret = glfs_set_volfile_server(fs, "tcp", host_name, 24007); - if (ret != 0) { - perror("glfs_set_volfile_server"); - goto out; - } - - ret = glfs_set_logging(fs, glfs_log_path, 7); - if (ret != 0) { - perror("glfs_set_logging"); - goto out; - } - - ret = glfs_init(fs); - if (ret != 0) { - perror("glfs_init"); - goto out; - } - - fd = glfs_creat(fs, file_path, O_RDWR, 0777); - if (fd == NULL) { - perror("glfs_creat"); - ret = -1; - goto out; - } - - switch (opcode) { - case TEST_WRITE: - fprintf(stderr, "Test Write\n"); - ret = glfs_write(fd, writestr, TEST_STR_LEN, 0); - if (ret < 0) { - perror("glfs_write"); - goto out; - } else if (ret != TEST_STR_LEN) { - fprintf(stderr, "insufficient data written %d \n", ret); - ret = -EIO; - goto out; - } - ret = 0; - goto out; - case TEST_DISCARD: - fprintf(stderr, "Test Discard\n"); - ret = glfs_discard(fd, offset, len_zero); - if (ret < 0) { - if (errno == EOPNOTSUPP) { - fprintf(stderr, "Operation not supported\n"); - ret = 0; - goto out; - } - perror("glfs_discard"); - goto out; - } - goto test_read; - case TEST_ZEROFILL: - fprintf(stderr, "Test Zerofill\n"); - ret = glfs_zerofill(fd, offset, len_zero); - if (ret < 0) { - if (errno == EOPNOTSUPP) { - fprintf(stderr, "Operation not supported\n"); - ret = 0; - goto out; - } - perror("glfs_zerofill"); - goto out; - } - goto test_read; - default: - ret = -1; - fprintf(stderr, "Incorrect test code %d\n", opcode); - goto out; - } + int opcode; + char *host_name, *volume_name, *file_path, *glfs_log_path; + glfs_t *fs = NULL; + glfs_fd_t *fd = NULL; + off_t offset = 0; + size_t len_zero = TEST_STR_LEN / 2; + char writestr[TEST_STR_LEN]; + char readstr[TEST_STR_LEN]; + struct iovec iov = {&readstr, TEST_STR_LEN}; + int i; + int ret = 1; + + for (i = 0; i < TEST_STR_LEN; i++) + writestr[i] = 0x11; + for (i = 0; i < TEST_STR_LEN; i++) + readstr[i] = 0x22; + + if (argc != 6) { + fprintf( + stderr, + "Syntax: %s <test type> <host> <volname> <file-path> <log-file>\n", + argv[0]); + return 1; + } + + opcode = atoi(argv[1]); + host_name = argv[2]; + volume_name = argv[3]; + file_path = argv[4]; + glfs_log_path = argv[5]; + + fs = glfs_new(volume_name); + if (!fs) { + perror("glfs_new"); + return 1; + } + + ret = glfs_set_volfile_server(fs, "tcp", host_name, 24007); + if (ret != 0) { + perror("glfs_set_volfile_server"); + goto out; + } + + ret = glfs_set_logging(fs, glfs_log_path, 7); + if (ret != 0) { + perror("glfs_set_logging"); + goto out; + } + + ret = glfs_init(fs); + if (ret != 0) { + perror("glfs_init"); + goto out; + } + + fd = glfs_creat(fs, file_path, O_RDWR, 0777); + if (fd == NULL) { + perror("glfs_creat"); + ret = -1; + goto out; + } + + switch (opcode) { + case TEST_WRITE: + fprintf(stderr, "Test Write\n"); + ret = glfs_write(fd, writestr, TEST_STR_LEN, 0); + if (ret < 0) { + perror("glfs_write"); + goto out; + } else if (ret != TEST_STR_LEN) { + fprintf(stderr, "insufficient data written %d \n", ret); + ret = -EIO; + goto out; + } + ret = 0; + goto out; + case TEST_DISCARD: + fprintf(stderr, "Test Discard\n"); + ret = glfs_discard(fd, offset, len_zero); + if (ret < 0) { + if (errno == EOPNOTSUPP) { + fprintf(stderr, "Operation not supported\n"); + ret = 0; + goto out; + } + perror("glfs_discard"); + goto out; + } + goto test_read; + case TEST_ZEROFILL: + fprintf(stderr, "Test Zerofill\n"); + ret = glfs_zerofill(fd, offset, len_zero); + if (ret < 0) { + if (errno == EOPNOTSUPP) { + fprintf(stderr, "Operation not supported\n"); + ret = 0; + goto out; + } + perror("glfs_zerofill"); + goto out; + } + goto test_read; + default: + ret = -1; + fprintf(stderr, "Incorrect test code %d\n", opcode); + goto out; + } test_read: - ret = glfs_readv(fd, &iov, 1, 0); - if (ret < 0) { - perror("glfs_readv"); - goto out; - } + ret = glfs_readv(fd, &iov, 1, 0); + if (ret < 0) { + perror("glfs_readv"); + goto out; + } - /* printf("Read str\n"); print_str(readstr, TEST_STR_LEN); printf("\n"); */ - ret = test_read(readstr, TEST_STR_LEN, len_zero); + /* printf("Read str\n"); print_str(readstr, TEST_STR_LEN); printf("\n"); */ + ret = test_read(readstr, TEST_STR_LEN, len_zero); out: - if (fd) - glfs_close(fd); - glfs_fini(fs); + if (fd) + glfs_close(fd); + glfs_fini(fs); - if (ret) - return -1; + if (ret) + return -1; - return 0; + return 0; } diff --git a/tests/bugs/quota/bug-1035576.t b/tests/bugs/quota/bug-1035576.t index eaf4439a063..cbc1b69ebb3 100644 --- a/tests/bugs/quota/bug-1035576.t +++ b/tests/bugs/quota/bug-1035576.t @@ -18,6 +18,9 @@ TEST $CLI volume set $V0 performance.write-behind off TEST $CLI volume set $V0 performance.stat-prefetch off TEST $CLI volume set $V0 performance.read-ahead off TEST $CLI volume set $V0 self-heal-daemon off +TEST $CLI volume set $V0 cluster.data-self-heal on +TEST $CLI volume set $V0 cluster.metadata-self-heal on +TEST $CLI volume set $V0 cluster.entry-self-heal on TEST $CLI volume quota $V0 enable TEST kill_brick $V0 $H0 $B0/${V0}0 diff --git a/tests/bugs/quota/bug-1087198.t b/tests/bugs/quota/bug-1087198.t index 95133085f13..618a46b957d 100644 --- a/tests/bugs/quota/bug-1087198.t +++ b/tests/bugs/quota/bug-1087198.t @@ -17,6 +17,8 @@ . $(dirname $0)/../../volume.rc . $(dirname $0)/../../nfs.rc +#G_TESTDEF_TEST_STATUS_CENTOS6=NFS_TEST + cleanup; QDD=$(dirname $0)/quota diff --git a/tests/bugs/quota/bug-1153964.t b/tests/bugs/quota/bug-1153964.t index d84a9b36d26..2e449d3ba00 100644 --- a/tests/bugs/quota/bug-1153964.t +++ b/tests/bugs/quota/bug-1153964.t @@ -4,6 +4,8 @@ . $(dirname $0)/../../volume.rc . $(dirname $0)/../../nfs.rc +#G_TESTDEF_TEST_STATUS_CENTOS6=NFS_TEST + function rename_loop() { local i=0 diff --git a/tests/bugs/quota/bug-1243798.t b/tests/bugs/quota/bug-1243798.t index 53f8b10adba..fa6abeb08fb 100644 --- a/tests/bugs/quota/bug-1243798.t +++ b/tests/bugs/quota/bug-1243798.t @@ -4,6 +4,8 @@ . $(dirname $0)/../../volume.rc . $(dirname $0)/../../nfs.rc +#G_TESTDEF_TEST_STATUS_CENTOS6=NFS_TEST + cleanup; TEST glusterd diff --git a/tests/bugs/quota/bug-1288474.t b/tests/bugs/quota/bug-1288474.t deleted file mode 100755 index b8f4ba38d4d..00000000000 --- a/tests/bugs/quota/bug-1288474.t +++ /dev/null @@ -1,51 +0,0 @@ -#!/bin/bash - -. $(dirname $0)/../../include.rc -. $(dirname $0)/../../volume.rc -. $(dirname $0)/../../tier.rc - -NUM_BRICKS=2 - -function create_dist_tier_vol () { - mkdir -p $B0/cold/${V0}{0..$1} - mkdir -p $B0/hot/${V0}{0..$1} - TEST $CLI volume create $V0 $H0:$B0/cold/${V0}{0..$1} - TEST $CLI volume set $V0 nfs.disable false - TEST $CLI volume start $V0 - TEST $CLI volume tier $V0 attach $H0:$B0/hot/${V0}{0..$1} -} - -cleanup; - -#Basic checks -TEST glusterd - -#Create and start a tiered volume -create_dist_tier_vol $NUM_BRICKS - -TEST $GFS --volfile-id=/$V0 --volfile-server=$H0 $M0 -touch $M0/foobar - -TEST $CLI volume quota $V0 enable -TEST $CLI volume quota $V0 limit-usage / 10MB - -EXPECT_WITHIN $MARKER_UPDATE_TIMEOUT "10.0MB" quota_list_field "/" 5 - -#check quota list after detach tier -TEST $CLI volume tier $V0 detach start -sleep 1 -TEST $CLI volume tier $V0 detach force - -EXPECT_WITHIN $MARKER_UPDATE_TIMEOUT "10.0MB" quota_list_field "/" 5 - -#check quota list after attach tier -rm -rf $B0/hot -mkdir $B0/hot -TEST $CLI volume tier $V0 attach $H0:$B0/hot/${V0}{0..$1} - -EXPECT_WITHIN $MARKER_UPDATE_TIMEOUT "10.0MB" quota_list_field "/" 5 - -TEST umount $M0 - -cleanup; - diff --git a/tests/bugs/quota/bug-1293601.t b/tests/bugs/quota/bug-1293601.t index 52b03bcc059..741758b73f5 100644 --- a/tests/bugs/quota/bug-1293601.t +++ b/tests/bugs/quota/bug-1293601.t @@ -9,6 +9,7 @@ TEST glusterd TEST $CLI volume create $V0 replica 2 $H0:$B0/${V0}{1,2,3,4} TEST $CLI volume start $V0 +EXPECT_WITHIN $PROCESS_UP_TIMEOUT "4" online_brick_count TEST $CLI volume quota $V0 enable TEST glusterfs --volfile-server=$H0 --volfile-id=$V0 $M0; @@ -27,6 +28,6 @@ EXPECT_WITHIN $MARKER_UPDATE_TIMEOUT "1.0MB" quotausage "/" TEST $CLI volume quota $V0 disable TEST $CLI volume quota $V0 enable -EXPECT_WITHIN $MARKER_UPDATE_TIMEOUT "1.0MB" quotausage "/" +EXPECT_WITHIN 60 "1.0MB" quotausage "/" cleanup; diff --git a/tests/bugs/readdir-ahead/bug-1390050.c b/tests/bugs/readdir-ahead/bug-1390050.c new file mode 100644 index 00000000000..9578df2dd90 --- /dev/null +++ b/tests/bugs/readdir-ahead/bug-1390050.c @@ -0,0 +1,72 @@ +#include <stdio.h> +#include <sys/types.h> +#include <sys/stat.h> +#include <unistd.h> +#include <fcntl.h> +#include <dirent.h> +#include <string.h> +#include <errno.h> + +int +main(int argc, char *argv[]) +{ + const char *glfs_dir = NULL, *filepath = NULL; + DIR *dirfd = NULL; + int filefd = 0, ret = 0; + struct stat stbuf = { + 0, + }; + size_t size_before_write = 0; + + glfs_dir = argv[1]; + filepath = argv[2]; + dirfd = opendir(glfs_dir); + if (dirfd == NULL) { + fprintf(stderr, "opening directory failed (%s)\n", strerror(errno)); + goto err; + } + + filefd = open(filepath, O_RDWR); + if (filefd < 0) { + fprintf(stderr, "open failed on path %s (%s)\n", filepath, + strerror(errno)); + goto err; + } + + ret = stat(filepath, &stbuf); + if (ret < 0) { + fprintf(stderr, "stat failed on path %s (%s)\n", filepath, + strerror(errno)); + goto err; + } + + size_before_write = stbuf.st_size; + + ret = write(filefd, "testdata", strlen("testdata123") + 1); + if (ret <= 0) { + fprintf(stderr, "write failed (%s)\n", strerror(errno)); + goto err; + } + + while (readdir(dirfd)) { + /* do nothing */ + } + + ret = stat(filepath, &stbuf); + if (ret < 0) { + fprintf(stderr, "stat failed on path %s (%s)\n", strerror(errno)); + goto err; + } + + if (stbuf.st_size == size_before_write) { + fprintf(stderr, + "file size (%lu) has not changed even after " + "its written to\n", + stbuf.st_size); + goto err; + } + + return 0; +err: + return -1; +} diff --git a/tests/bugs/readdir-ahead/bug-1390050.t b/tests/bugs/readdir-ahead/bug-1390050.t new file mode 100644 index 00000000000..ab1d7d4ead9 --- /dev/null +++ b/tests/bugs/readdir-ahead/bug-1390050.t @@ -0,0 +1,29 @@ +#!/bin/bash + +. $(dirname $0)/../../include.rc +. $(dirname $0)/../../volume.rc +. $(dirname $0)/../../fileio.rc + +cleanup; + +TEST glusterd + +TEST $CLI volume create $V0 $H0:$B{0..1}/$V0 +TEST $CLI volume set $V0 readdir-ahead on + +DIRECTORY="$M0/subdir1/subdir2" + +#Make sure md-cache has large timeout to hold stat from readdirp_cbk in its cache +TEST $CLI volume set $V0 performance.md-cache-timeout 600 +TEST $CLI volume start $V0 +TEST glusterfs --volfile-server=$H0 --volfile-id=$V0 $M0 +rm -rf $M0/* +TEST mkdir -p $DIRECTORY +rm -rf $DIRECTORY/* +TEST touch $DIRECTORY/file{0..10} +rdd_tester=$(dirname $0)/rdd-tester +TEST build_tester $(dirname $0)/bug-1390050.c -o $rdd_tester +TEST $rdd_tester $DIRECTORY $DIRECTORY/file4 +rm -f $rdd_tester +cleanup; + diff --git a/tests/bugs/readdir-ahead/bug-1436090.t b/tests/bugs/readdir-ahead/bug-1436090.t index 58e9093f1c3..e0877f15684 100755 --- a/tests/bugs/readdir-ahead/bug-1436090.t +++ b/tests/bugs/readdir-ahead/bug-1436090.t @@ -19,12 +19,12 @@ EXPECT 'Started' cluster_volinfo_field 1 $V0 'Status'; TEST glusterfs -s $H1 --volfile-id $V0 $M0; TEST mkdir $M0/dir1 -# Create a large file (3.2 GB), so that rebalance takes time -# Reading from /dev/urandom is slow, so we will cat it together -dd if=/dev/urandom of=/tmp/FILE2 bs=64k count=10240 -for i in {1..5}; do - cat /tmp/FILE2 >> $M0/dir1/foo -done +# Create a large file (4 GB), so that rebalance takes time +# Since we really don't care about the contents of the file, we use fallocate +# to generate the file much faster. We could also use truncate, which is even +# faster, but rebalance could take advantage of an sparse file and migrate it +# in an optimized way, but we don't want a fast migration. +TEST fallocate -l 4G $M0/dir1/foo TEST mv $M0/dir1/foo $M0/dir1/bar diff --git a/tests/bugs/readdir-ahead/bug-1670253-consistent-metadata.t b/tests/bugs/readdir-ahead/bug-1670253-consistent-metadata.t new file mode 100644 index 00000000000..6adfc17c92c --- /dev/null +++ b/tests/bugs/readdir-ahead/bug-1670253-consistent-metadata.t @@ -0,0 +1,23 @@ +#!/bin/bash + +. $(dirname $0)/../../include.rc +. $(dirname $0)/../../volume.rc + +cleanup; + +TEST glusterd + +TEST $CLI volume create $V0 replica 3 $H0:$B0/${V0}{0,1,2} +TEST $CLI volume set $V0 readdir-ahead on #on by default as of writing this .t. +TEST $CLI volume set $V0 consistent-metadata on +TEST $CLI volume start $V0 +TEST glusterfs --volfile-server=$H0 --volfile-id=$V0 $M0 +TEST touch $M0/FILE +echo "abc" >> $M0/FILE +EXPECT "^0$" echo $? +EXPECT "abc" cat $M0/FILE +echo "truncate" >$M0/FILE +EXPECT "^0$" echo $? +EXPECT "truncate" cat $M0/FILE +EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0 +cleanup; diff --git a/tests/bugs/replicate/bug-1015990-rep.t b/tests/bugs/replicate/bug-1015990-rep.t index 1b104969d10..ab8166e372a 100755 --- a/tests/bugs/replicate/bug-1015990-rep.t +++ b/tests/bugs/replicate/bug-1015990-rep.t @@ -11,7 +11,6 @@ TEST pidof glusterd; TEST $CLI volume info; TEST $CLI volume create $V0 replica 2 $H0:$B0/${V0}{1,2,3,4}; - ## Verify volume is is created EXPECT "$V0" volinfo_field $V0 'Volume Name'; EXPECT 'Created' volinfo_field $V0 'Status'; @@ -20,22 +19,23 @@ EXPECT 'Created' volinfo_field $V0 'Status'; TEST $CLI volume start $V0; EXPECT 'Started' volinfo_field $V0 'Status'; - TEST glusterfs --volfile-id=/$V0 --volfile-server=$H0 $M0 --attribute-timeout=0 --entry-timeout=0 - +EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 0 +EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 1 +EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 2 +EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 3 TEST kill_brick $V0 $H0 $B0/$V0"1" -sleep 5 TEST kill_brick $V0 $H0 $B0/$V0"3" -sleep 5 for i in {1..100}; do echo "STRING" > $M0/File$i; done +# Check shd is connected to all up bricks before running statistics command. +EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 1 +EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 3 command_output=$(gluster volume heal $V0 statistics heal-count replica $H0:$B0/$V0"1") - - substring="Number of entries:" count=0 while read -r line; @@ -48,15 +48,8 @@ do done <<< "$command_output" -brick_2_entries_count=$(($count-$value)) - -EXPECT "0" echo $brick_2_entries_count - brick_2_entries_count=$count - - xattrop_count_brick_2=$(count_sh_entries $B0/$V0"2") - EXPECT $brick_2_entries_count echo $xattrop_count_brick_2 ## Finish up diff --git a/tests/bugs/replicate/bug-1046624.t b/tests/bugs/replicate/bug-1046624.t index 9ae40879228..e2762ea6764 100755 --- a/tests/bugs/replicate/bug-1046624.t +++ b/tests/bugs/replicate/bug-1046624.t @@ -25,11 +25,12 @@ TEST $CLI volume start $V0; EXPECT 'Started' volinfo_field $V0 'Status'; ## Mount native -TEST glusterfs --volfile-server=$H0 --volfile-id=$V0 $M0 --use-readdirp=no +TEST ${GFS} --volfile-server=$H0 --volfile-id=$V0 --use-readdirp=no $M0 TEST `echo "TEST-FILE" > $M0/File` TEST `mkdir $M0/Dir` TEST kill_brick $V0 $H0 $B0/${V0}-0 +EXPECT_WITHIN ${PROCESS_DOWN_TIMEOUT} "^0$" afr_child_up_status $V0 0 TEST `ln -s $M0/File $M0/Link1` TEST `ln -s $M0/Dir $M0/Link2` diff --git a/tests/bugs/replicate/bug-1058797.t b/tests/bugs/replicate/bug-1058797.t index 99ab3eb3a66..598062a0dab 100644 --- a/tests/bugs/replicate/bug-1058797.t +++ b/tests/bugs/replicate/bug-1058797.t @@ -12,6 +12,9 @@ TEST glusterd TEST $CLI volume create $V0 replica 2 $H0:$B0/brick{0,1}; TEST $CLI volume start $V0 TEST $CLI volume set $V0 cluster.self-heal-daemon off +TEST $CLI volume set $V0 cluster.data-self-heal on +TEST $CLI volume set $V0 cluster.metadata-self-heal on +TEST $CLI volume set $V0 cluster.entry-self-heal on # FUSE mount;create a file TEST glusterfs -s $H0 --volfile-id $V0 $M0 diff --git a/tests/bugs/replicate/bug-1101647.t b/tests/bugs/replicate/bug-1101647.t index 8f420eec012..708bc1a1e29 100644 --- a/tests/bugs/replicate/bug-1101647.t +++ b/tests/bugs/replicate/bug-1101647.t @@ -12,6 +12,8 @@ TEST $CLI volume create $V0 replica 2 $H0:$B0/${V0}{1,2}; TEST $CLI volume start $V0; TEST glusterfs --volfile-id=/$V0 --volfile-server=$H0 $M0 --attribute-timeout=0 --entry-timeout=0 EXPECT_WITHIN $PROCESS_UP_TIMEOUT "Y" glustershd_up_status +EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 0 +EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 1 #Create base entry in indices/xattrop echo "Data">$M0/file diff --git a/tests/bugs/replicate/bug-1130892.t b/tests/bugs/replicate/bug-1130892.t index c7988fd648b..c7509f33cc2 100644 --- a/tests/bugs/replicate/bug-1130892.t +++ b/tests/bugs/replicate/bug-1130892.t @@ -16,6 +16,11 @@ EXPECT 'Created' volinfo_field $V0 'Status'; # Disable self-heal daemon TEST gluster volume set $V0 self-heal-daemon off +# Enable Client side heal +TEST $CLI volume set $V0 cluster.data-self-heal off +TEST $CLI volume set $V0 cluster.metadata-self-heal off +TEST $CLI volume set $V0 cluster.entry-self-heal off + # Disable all perf-xlators TEST $CLI volume set $V0 performance.quick-read off TEST $CLI volume set $V0 performance.io-cache off @@ -28,7 +33,7 @@ TEST $CLI volume start $V0; EXPECT 'Started' volinfo_field $V0 'Status'; # FUSE Mount -TEST glusterfs -s $H0 --volfile-id $V0 $M0 +TEST ${GFS} -s $H0 --volfile-id $V0 $M0 # Create files and dirs TEST mkdir -p $M0/one/two/ @@ -36,6 +41,7 @@ TEST `echo "Carpe diem" > $M0/one/two/three` # Simulate disk-replacement TEST kill_brick $V0 $H0 $B0/${V0}-1 +EXPECT_WITHIN ${PROCESS_DOWN_TIMEOUT} "^0$" afr_child_up_status $V0 1 TEST rm -rf $B0/${V0}-1/one TEST rm -rf $B0/${V0}-1/.glusterfs @@ -50,10 +56,12 @@ EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status $V0 1 TEST stat $M0/one +sleep 1 + # Check pending xattrs EXPECT "00000000" afr_get_specific_changelog_xattr $B0/${V0}-0/one trusted.afr.$V0-client-1 data EXPECT_NOT "00000000" afr_get_specific_changelog_xattr $B0/${V0}-0/one trusted.afr.$V0-client-1 entry -EXPECT "00000000" afr_get_specific_changelog_xattr $B0/${V0}-0/one trusted.afr.$V0-client-1 metadata +EXPECT_NOT "00000000" afr_get_specific_changelog_xattr $B0/${V0}-0/one trusted.afr.$V0-client-1 metadata TEST gluster volume set $V0 self-heal-daemon on diff --git a/tests/bugs/replicate/bug-1134691-afr-lookup-metadata-heal.t b/tests/bugs/replicate/bug-1134691-afr-lookup-metadata-heal.t index 44c2ed25f9d..b69a38ae788 100644 --- a/tests/bugs/replicate/bug-1134691-afr-lookup-metadata-heal.t +++ b/tests/bugs/replicate/bug-1134691-afr-lookup-metadata-heal.t @@ -10,6 +10,9 @@ TEST pidof glusterd TEST $CLI volume create $V0 replica 3 $H0:$B0/brick{0,1,2} TEST $CLI volume set $V0 performance.stat-prefetch off TEST $CLI volume set $V0 cluster.self-heal-daemon off +TEST $CLI volume set $V0 cluster.data-self-heal on +TEST $CLI volume set $V0 cluster.metadata-self-heal on +TEST $CLI volume set $V0 cluster.entry-self-heal on TEST $CLI volume start $V0 TEST glusterfs --volfile-id=/$V0 --volfile-server=$H0 $M0 --attribute-timeout=0 --entry-timeout=0 @@ -22,9 +25,11 @@ iatt=$(stat -c "%g:%u:%A" file) TEST $CLI volume start $V0 force EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 2 +EXPECT 2 get_pending_heal_count $V0 #Trigger metadataheal TEST stat file +EXPECT_WITHIN $HEAL_TIMEOUT "^0$" get_pending_heal_count $V0 #iattrs must be matching iatt1=$(stat -c "%g:%u:%A" $B0/brick0/file) diff --git a/tests/bugs/replicate/bug-1180545.t b/tests/bugs/replicate/bug-1180545.t index e9531625ee2..5e40edd6c38 100644 --- a/tests/bugs/replicate/bug-1180545.t +++ b/tests/bugs/replicate/bug-1180545.t @@ -7,6 +7,31 @@ . $(dirname $0)/../../volume.rc . $(dirname $0)/../../afr.rc +function check_sh_entries() { + local expected="$1" + local count= + local good="0" + shift + + for i in $*; do + count="$(count_sh_entries $i)" + if [[ "x${count}" == "x${expected}" ]]; then + good="$((good + 1))" + fi + done + if [[ "x${good}" != "x${last_good}" ]]; then + last_good="${good}" +# This triggers a sweep of the heal index. However if more than one brick +# tries to heal the same directory at the same time, one of them will take +# the lock and the other will give up, waiting for the next heal cycle, which +# is set to 60 seconds (the minimum valid value). So, each time we detect +# that one brick has completed the heal, we trigger another heal. + $CLI volume heal $V0 + fi + + echo "${good}" +} + cleanup; TEST glusterd @@ -15,6 +40,7 @@ TEST pidof glusterd TEST $CLI volume create $V0 replica 2 $H0:$B0/brick{0,1} TEST $CLI volume set $V0 cluster.heal-timeout 60 TEST $CLI volume set $V0 cluster.self-heal-daemon off +TEST $CLI volume set $V0 stat-prefetch off TEST $CLI volume start $V0 TEST $GFS --volfile-id=$V0 --volfile-server=$H0 $M0; @@ -35,13 +61,16 @@ EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status $V0 0 #Trigger heal and verify number of entries in backend TEST $CLI volume set $V0 cluster.self-heal-daemon on -EXPECT_WITHIN PROCESS_UP_TIMEOUT "Y" glustershd_up_status +EXPECT_WITHIN $PROCESS_UP_TIMEOUT "Y" glustershd_up_status EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 0 EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 1 + TEST $CLI volume heal $V0 -EXPECT_WITHIN $HEAL_TIMEOUT '2' count_sh_entries $B0/brick0 -EXPECT_WITHIN $HEAL_TIMEOUT '2' count_sh_entries $B0/brick1 +last_good="" + +EXPECT_WITHIN $HEAL_TIMEOUT "2" check_sh_entries 2 $B0/brick{0,1} + #Two entries for DIR and two for FILE EXPECT_WITHIN $HEAL_TIMEOUT "4" get_pending_heal_count $V0 TEST diff <(ls $B0/brick0/DIR) <(ls $B0/brick1/DIR) diff --git a/tests/bugs/replicate/bug-1221481-allow-fops-on-dir-split-brain.t b/tests/bugs/replicate/bug-1221481-allow-fops-on-dir-split-brain.t index c4752c488f4..6ff471fbf15 100644 --- a/tests/bugs/replicate/bug-1221481-allow-fops-on-dir-split-brain.t +++ b/tests/bugs/replicate/bug-1221481-allow-fops-on-dir-split-brain.t @@ -11,19 +11,27 @@ TEST pidof glusterd; TEST $CLI volume create $V0 replica 2 $H0:$B0/${V0}{0,1}; TEST $CLI volume set $V0 cluster.self-heal-daemon off TEST $CLI volume start $V0; -TEST glusterfs --volfile-id=/$V0 --volfile-server=$H0 $M0 --attribute-timeout=0 --entry-timeout=0 +TEST $GFS --volfile-id=/$V0 --volfile-server=$H0 $M0 TEST mkdir $M0/dir TEST touch $M0/dir/file{1..5} #Create entry split-brain TEST kill_brick $V0 $H0 $B0/$V0"1" +EXPECT_WITHIN ${PROCESS_DOWN_TIMEOUT} "^0$" afr_child_up_status $V0 1 TEST touch $M0/dir/FILE +EXPECT_WITHIN ${UMOUNT_TIMEOUT} "^Y$" force_umount $M0 TEST $CLI volume start $V0 force +TEST $GFS --volfile-id=/$V0 --volfile-server=$H0 $M0 +EXPECT_WITHIN $CHILD_UP_TIMEOUT '1' afr_child_up_status_meta $M0 $V0-replicate-0 0 EXPECT_WITHIN $CHILD_UP_TIMEOUT '1' afr_child_up_status_meta $M0 $V0-replicate-0 1 TEST kill_brick $V0 $H0 $B0/$V0"0" +EXPECT_WITHIN ${PROCESS_DOWN_TIMEOUT} "^0$" afr_child_up_status $V0 0 TEST touch $M0/dir/FILE +EXPECT_WITHIN ${UMOUNT_TIMEOUT} "^Y$" force_umount $M0 TEST $CLI volume start $V0 force +TEST $GFS --volfile-id=/$V0 --volfile-server=$H0 $M0 EXPECT_WITHIN $CHILD_UP_TIMEOUT '1' afr_child_up_status_meta $M0 $V0-replicate-0 0 +EXPECT_WITHIN $CHILD_UP_TIMEOUT '1' afr_child_up_status_meta $M0 $V0-replicate-0 1 cd $M0/dir EXPECT "6" echo $(ls | wc -l) diff --git a/tests/bugs/replicate/bug-1238398-split-brain-resolution.t b/tests/bugs/replicate/bug-1238398-split-brain-resolution.t index 7ba09f0dc5d..8ef3aae979f 100644 --- a/tests/bugs/replicate/bug-1238398-split-brain-resolution.t +++ b/tests/bugs/replicate/bug-1238398-split-brain-resolution.t @@ -46,3 +46,6 @@ TEST setfattr -n replica.split-brain-choice -v $V0-client-1 $M0/metadata-split-b EXPECT "666" stat -c %a $M0/metadata-split-brain.txt cleanup; + +#G_TESTDEF_TEST_STATUS_NETBSD7=BAD_TEST,BUG=000000 +#G_TESTDEF_TEST_STATUS_CENTOS6=BAD_TEST,BUG=000000 diff --git a/tests/bugs/replicate/bug-1250170-fsync.c b/tests/bugs/replicate/bug-1250170-fsync.c index 1d3025bcd9f..21fd96594aa 100644 --- a/tests/bugs/replicate/bug-1250170-fsync.c +++ b/tests/bugs/replicate/bug-1250170-fsync.c @@ -7,50 +7,50 @@ #include <unistd.h> #include <string.h> -int main (int argc, char **argv) +int +main(int argc, char **argv) { - char *file = NULL; - int fd = -1; - char *buffer = NULL; - size_t buf_size = 0; - size_t written = 0; - int ret = 0; - off_t offset = 0; - int i = 0; - int loop_count = 5; + char *file = NULL; + int fd = -1; + char *buffer = NULL; + size_t buf_size = 0; + size_t written = 0; + int ret = 0; + off_t offset = 0; + int i = 0; + int loop_count = 5; - if (argc < 2) { - printf ("Usage:%s <filename>\n", argv[0]); - return -1; - } + if (argc < 2) { + printf("Usage:%s <filename>\n", argv[0]); + return -1; + } - file = argv[1]; - buf_size = 1024; - buffer = calloc(1, buf_size); - if (!buffer) { - perror("calloc"); - return -1; - } - memset (buffer, 'R', buf_size); + file = argv[1]; + buf_size = 1024; + buffer = malloc(buf_size); + if (!buffer) { + perror("malloc"); + return -1; + } + memset(buffer, 'R', buf_size); - fd = open(file, O_WRONLY); - if (fd == -1) { - perror("open"); - return -1; - } + fd = open(file, O_WRONLY); + if (fd == -1) { + perror("open"); + return -1; + } - for (i = 0; i < loop_count; i++) { - ret = write (fd, buffer, buf_size); - if (ret == -1) { - perror("write"); - return ret; - } else { - written += ret; - } - offset = lseek (fd, 0 , SEEK_SET); + for (i = 0; i < loop_count; i++) { + ret = write(fd, buffer, buf_size); + if (ret == -1) { + perror("write"); + return ret; + } else { + written += ret; } + offset = lseek(fd, 0, SEEK_SET); + } - free(buffer); - return 0; - + free(buffer); + return 0; } diff --git a/tests/bugs/replicate/bug-1290965-detect-bitrotten-objects.t b/tests/bugs/replicate/bug-1290965-detect-bitrotten-objects.t deleted file mode 100644 index 9863834dbb5..00000000000 --- a/tests/bugs/replicate/bug-1290965-detect-bitrotten-objects.t +++ /dev/null @@ -1,53 +0,0 @@ -#!/bin/bash -#Self-heal tests - -. $(dirname $0)/../../include.rc -. $(dirname $0)/../../volume.rc -cleanup; - -TEST glusterd -TEST pidof glusterd -TEST $CLI volume create $V0 replica 2 $H0:$B0/brick{0,1} -TEST $CLI volume set $V0 self-heal-daemon off -TEST $CLI volume set $V0 entry-self-heal off -TEST $CLI volume set $V0 metadata-self-heal off -TEST $CLI volume set $V0 data-self-heal off -TEST $CLI volume set $V0 performance.stat-prefetch off -TEST $CLI volume start $V0 -TEST $CLI volume tier $V0 attach replica 2 $H0:$B0/brick{2,3} -TEST $CLI volume bitrot $V0 enable -EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" get_bitd_count -TEST $CLI volume bitrot $V0 scrub-frequency hourly -TEST $GFS --volfile-id=$V0 --volfile-server=$H0 $M0 -TEST dd if=/dev/urandom of=$M0/FILE bs=1024 count=1 - -#Corrupt file from back-end -TEST stat $B0/brick3/FILE -echo "Corrupted data" >> $B0/brick3/FILE -#Manually set bad-file xattr since we can't wait for an hour. -TEST setfattr -n trusted.bit-rot.bad-file -v 0x3100 $B0/brick3/FILE - -TEST $CLI volume stop $V0 -TEST $CLI volume start $V0 -EXPECT 'Started' volinfo_field $V0 'Status'; -EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status $V0 $H0 $B0/brick0 -EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status $V0 $H0 $B0/brick1 -EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status $V0 $H0 $B0/brick2 -EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status $V0 $H0 $B0/brick3 -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 $CHILD_UP_TIMEOUT "1" afr_child_up_status $V0 2 -EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status $V0 3 -EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" get_bitd_count -#Trigger lookup so that bitrot xlator marks file as bad in its inode context. -stat $M0/FILE -# Remove hot-tier -TEST $CLI volume tier $V0 detach start -sleep 1 -EXPECT_WITHIN $REBALANCE_TIMEOUT "completed" detach_tier_status_field_complete $V0 -TEST $CLI volume tier $V0 detach commit -#Test that file has migrated to cold tier. -EXPECT "1024" stat -c "%s" $B0/brick0/FILE -EXPECT "1024" stat -c "%s" $B0/brick1/FILE -TEST umount $M0 -cleanup diff --git a/tests/bugs/replicate/bug-1340623-mkdir-fails-remove-brick-started.t b/tests/bugs/replicate/bug-1340623-mkdir-fails-remove-brick-started.t index 5467127bd59..6d177a7d3f8 100644 --- a/tests/bugs/replicate/bug-1340623-mkdir-fails-remove-brick-started.t +++ b/tests/bugs/replicate/bug-1340623-mkdir-fails-remove-brick-started.t @@ -3,6 +3,9 @@ . $(dirname $0)/../../include.rc . $(dirname $0)/../../volume.rc . $(dirname $0)/../../nfs.rc + +#G_TESTDEF_TEST_STATUS_CENTOS6=NFS_TEST + cleanup; TEST glusterd diff --git a/tests/bugs/replicate/bug-1408712.t b/tests/bugs/replicate/bug-1408712.t index 18376b649f4..9499a598ef1 100644 --- a/tests/bugs/replicate/bug-1408712.t +++ b/tests/bugs/replicate/bug-1408712.t @@ -13,6 +13,11 @@ TEST pidof glusterd TEST $CLI volume create $V0 replica 3 $H0:$B0/${V0}{0,1,2} TEST $CLI volume start $V0 +EXPECT 'Started' volinfo_field $V0 'Status' +EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status $V0 $H0 $B0/${V0}0 +EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status $V0 $H0 $B0/${V0}1 +EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status $V0 $H0 $B0/${V0}2 + TEST $CLI volume set $V0 features.shard on TEST $CLI volume set $V0 features.shard-block-size 4MB TEST $CLI volume heal $V0 granular-entry-heal enable @@ -23,13 +28,21 @@ TEST $CLI volume set $V0 self-heal-daemon off TEST $CLI volume set $V0 performance.flush-behind off TEST glusterfs --volfile-id=$V0 --volfile-server=$H0 $M0 +EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_meta $M0 $V0-replicate-0 0 +EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_meta $M0 $V0-replicate-0 1 +EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_meta $M0 $V0-replicate-0 2 + TEST glusterfs --volfile-id=$V0 --volfile-server=$H0 $M1 +EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_meta $M1 $V0-replicate-0 0 +EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_meta $M1 $V0-replicate-0 1 +EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_meta $M1 $V0-replicate-0 2 -cd $M0 +TEST cd $M0 TEST dd if=/dev/zero of=file bs=1M count=8 # Kill brick-0. TEST kill_brick $V0 $H0 $B0/${V0}0 +EXPECT_WITHIN $PROCESS_DOWN_TIMEOUT "0" brick_up_status $V0 $H0 $B0/${V0}0 TEST "dd if=/dev/zero bs=1M count=8 >> file" @@ -45,7 +58,7 @@ do TEST_IN_LOOP stat $B0/${V0}2/.glusterfs/indices/entry-changes/$DOT_SHARD_GFID/$FILE_GFID.$i done -cd ~ +TEST cd ~ TEST md5sum $M1/file # Test that the index associated with '/.shard' and the created shards do not disappear on B1 and B2. diff --git a/tests/bugs/replicate/bug-1417522-block-split-brain-resolution.t b/tests/bugs/replicate/bug-1417522-block-split-brain-resolution.t index 4592ebf8d23..d0e2fee8bcd 100644 --- a/tests/bugs/replicate/bug-1417522-block-split-brain-resolution.t +++ b/tests/bugs/replicate/bug-1417522-block-split-brain-resolution.t @@ -64,3 +64,6 @@ TEST [ "$SOURCE_BRICK_MD5" == "$B2_MD5" ] EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0 cleanup; + +#G_TESTDEF_TEST_STATUS_NETBSD7=BAD_TEST,BUG=000000 +#G_TESTDEF_TEST_STATUS_CENTOS6=BAD_TEST,BUG=000000 diff --git a/tests/bugs/replicate/bug-1433571-undo-pending-only-on-up-bricks.t b/tests/bugs/replicate/bug-1433571-undo-pending-only-on-up-bricks.t index 271abb4fe9a..10ce0131f4f 100644 --- a/tests/bugs/replicate/bug-1433571-undo-pending-only-on-up-bricks.t +++ b/tests/bugs/replicate/bug-1433571-undo-pending-only-on-up-bricks.t @@ -49,25 +49,15 @@ TEST $CLI volume start $V0 force EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status $V0 0 EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status $V0 2 -#Kill brick 0 and turn on the client side heal and do ls to trigger the heal. -#The pending xattrs on bricks 1 & 2 should have pending entry on brick 0. -TEST kill_brick $V0 $H0 $B0/${V0}0 +# We were killing one brick and checking that entry heal does not reset the +# pending xattrs for the down brick. Now that we need all bricks to be up for +# entry heal, I'm removing that test from the .t + TEST $CLI volume set $V0 cluster.data-self-heal on TEST $CLI volume set $V0 cluster.metadata-self-heal on TEST $CLI volume set $V0 cluster.entry-self-heal on TEST ls $M0 -EXPECT "000000000000000000000001" get_hex_xattr trusted.afr.$V0-client-0 $B0/${V0}1 -EXPECT "000000000000000000000000" get_hex_xattr trusted.afr.$V0-client-2 $B0/${V0}1 -EXPECT "000000000000000000000001" get_hex_xattr trusted.afr.$V0-client-0 $B0/${V0}2 -EXPECT "000000000000000000000000" get_hex_xattr trusted.afr.$V0-client-1 $B0/${V0}2 - -#Bring back all the bricks and trigger the heal again by doing ls. Now the -#pending xattrs on all the bricks should be 0. -TEST $CLI volume start $V0 force -EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status $V0 0 -TEST ls $M0 - TEST cat $M0/f1 TEST cat $M0/f2 TEST cat $M0/f3 diff --git a/tests/bugs/replicate/bug-1438255-do-not-mark-self-accusing-xattrs.t b/tests/bugs/replicate/bug-1438255-do-not-mark-self-accusing-xattrs.t index edfd0d7820d..cdcaf62c925 100644 --- a/tests/bugs/replicate/bug-1438255-do-not-mark-self-accusing-xattrs.t +++ b/tests/bugs/replicate/bug-1438255-do-not-mark-self-accusing-xattrs.t @@ -42,5 +42,5 @@ TEST ! getfattr -n trusted.afr.$V0-client-2 $B0/${V0}2/FILE TEST userdel --force ${NEW_USER} TEST groupdel ${NEW_USER}-${NEW_GID} cleanup - - +#G_TESTDEF_TEST_STATUS_CENTOS6=BAD_TEST,BUG=000000 +#G_TESTDEF_TEST_STATUS_NETBSD7=BAD_TEST,BUG=000000 diff --git a/tests/bugs/replicate/bug-1448804-check-quorum-type-values.t b/tests/bugs/replicate/bug-1448804-check-quorum-type-values.t index 4b654e704c5..5bacf3edcfe 100644 --- a/tests/bugs/replicate/bug-1448804-check-quorum-type-values.t +++ b/tests/bugs/replicate/bug-1448804-check-quorum-type-values.t @@ -1,6 +1,7 @@ #!/bin/bash . $(dirname $0)/../../include.rc . $(dirname $0)/../../volume.rc +. $(dirname $0)/../../afr.rc cleanup; TEST glusterd @@ -11,9 +12,8 @@ EXPECT 'Started' volinfo_field $V0 'Status' TEST glusterfs --volfile-id=$V0 --volfile-server=$H0 $M0; - # Default quorum-type for replica 2 is none. quorum-count is zero but it is not displayed. -EXPECT_WITHIN $CONFIG_UPDATE_TIMEOUT "none" echo `cat $M0/.meta/graphs/active/$V0-replicate-0/private|grep quorum-type|awk '{print $3}'` +EXPECT_WITHIN $CONFIG_UPDATE_TIMEOUT "none" get_quorum_type $M0 $V0 0 cat $M0/.meta/graphs/active/$V0-replicate-0/private|grep quorum-count TEST [ $? -ne 0 ] @@ -22,25 +22,25 @@ TEST $CLI volume add-brick $V0 replica 3 $H0:$B0/${V0}2 EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 2 # Default quorum-type for replica 3 is auto. quorum-count is INT_MAX but it is not displayed. -EXPECT_WITHIN $CONFIG_UPDATE_TIMEOUT "auto" echo `cat $M0/.meta/graphs/active/$V0-replicate-0/private|grep quorum-type|awk '{print $3}'` +EXPECT_WITHIN $CONFIG_UPDATE_TIMEOUT "auto" get_quorum_type $M0 $V0 0 cat $M0/.meta/graphs/active/$V0-replicate-0/private|grep quorum-count TEST [ $? -ne 0 ] # Change the type to fixed. TEST $CLI volume set $V0 cluster.quorum-type fixed # We haven't set quorum-count yet, so it takes the default value of zero in reconfigure() and hence the quorum-type is displayed as none. -EXPECT_WITHIN $CONFIG_UPDATE_TIMEOUT "none" echo `cat $M0/.meta/graphs/active/$V0-replicate-0/private|grep quorum-type|awk '{print $3}'` +EXPECT_WITHIN $CONFIG_UPDATE_TIMEOUT "none" get_quorum_type $M0 $V0 0 cat $M0/.meta/graphs/active/$V0-replicate-0/private|grep quorum-count TEST [ $? -ne 0 ] # set quorum-count and check. TEST $CLI volume set $V0 cluster.quorum-count 1 -EXPECT_WITHIN $CONFIG_UPDATE_TIMEOUT "fixed" echo `cat $M0/.meta/graphs/active/$V0-replicate-0/private|grep quorum-type|awk '{print $3}'` +EXPECT_WITHIN $CONFIG_UPDATE_TIMEOUT "fixed" get_quorum_type $M0 $V0 0 EXPECT "1" echo `cat $M0/.meta/graphs/active/$V0-replicate-0/private|grep quorum-count|awk '{print $3}'` # reset to default values. TEST $CLI volume reset $V0 cluster.quorum-type -EXPECT_WITHIN $CONFIG_UPDATE_TIMEOUT "auto" echo `cat $M0/.meta/graphs/active/$V0-replicate-0/private|grep quorum-type|awk '{print $3}'` +EXPECT_WITHIN $CONFIG_UPDATE_TIMEOUT "auto" get_quorum_type $M0 $V0 0 cat $M0/.meta/graphs/active/$V0-replicate-0/private|grep quorum-count TEST [ $? -ne 0 ] diff --git a/tests/bugs/replicate/bug-1468279-source-not-blaming-sinks.t b/tests/bugs/replicate/bug-1468279-source-not-blaming-sinks.t deleted file mode 100644 index 054a4adb90d..00000000000 --- a/tests/bugs/replicate/bug-1468279-source-not-blaming-sinks.t +++ /dev/null @@ -1,64 +0,0 @@ -#!/bin/bash -. $(dirname $0)/../../include.rc -. $(dirname $0)/../../volume.rc -cleanup; - -TEST glusterd -TEST pidof glusterd -TEST $CLI volume create $V0 replica 3 $H0:$B0/${V0}{0,1,2} -TEST $CLI volume start $V0 -TEST $CLI volume set $V0 cluster.self-heal-daemon off -TEST $CLI volume set $V0 cluster.metadata-self-heal off -TEST $GFS --volfile-id=$V0 --volfile-server=$H0 --attribute-timeout=0 --entry-timeout=0 $M0; -TEST touch $M0/file - -# Kill B1, create a pending metadata heal. -TEST kill_brick $V0 $H0 $B0/${V0}0 -TEST setfattr -n user.xattr -v value1 $M0/file -EXPECT "0000000000000010000000" get_hex_xattr trusted.afr.$V0-client-0 $B0/${V0}1/file -EXPECT "0000000000000010000000" get_hex_xattr trusted.afr.$V0-client-0 $B0/${V0}2/file - -# Kill B2, heal from B3 to B1. -TEST $CLI volume start $V0 force -EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status $V0 0 -TEST kill_brick $V0 $H0 $B0/${V0}1 -TEST $CLI volume set $V0 cluster.self-heal-daemon on -EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 2 -EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 0 -$CLI volume heal $V0 -EXPECT_WITHIN $HEAL_TIMEOUT "00000000" afr_get_specific_changelog_xattr $B0/${V0}2/file trusted.afr.$V0-client-0 "metadata" -TEST $CLI volume set $V0 cluster.self-heal-daemon off - -# Create another pending metadata heal. -TEST setfattr -n user.xattr -v value2 $M0/file -EXPECT "0000000000000010000000" get_hex_xattr trusted.afr.$V0-client-1 $B0/${V0}0/file -EXPECT "0000000000000010000000" get_hex_xattr trusted.afr.$V0-client-1 $B0/${V0}2/file - -# Kill B1, heal from B3 to B2 -TEST $CLI volume start $V0 force -EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status $V0 1 -TEST kill_brick $V0 $H0 $B0/${V0}0 -TEST $CLI volume set $V0 cluster.self-heal-daemon on -EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 2 -EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 1 -$CLI volume heal $V0 -EXPECT_WITHIN $HEAL_TIMEOUT "00000000" afr_get_specific_changelog_xattr $B0/${V0}2/file trusted.afr.$V0-client-1 "metadata" -TEST $CLI volume set $V0 cluster.self-heal-daemon off - -# ALL bricks up again. -TEST $CLI volume start $V0 force -EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status $V0 1 -EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 1 -# B1 and B2 blame each other, B3 doesn't blame anyone. -EXPECT "0000000000000010000000" get_hex_xattr trusted.afr.$V0-client-1 $B0/${V0}0/file -EXPECT "0000000000000010000000" get_hex_xattr trusted.afr.$V0-client-0 $B0/${V0}1/file -EXPECT "0000000000000000000000" get_hex_xattr trusted.afr.$V0-client-0 $B0/${V0}2/file -EXPECT "0000000000000000000000" get_hex_xattr trusted.afr.$V0-client-1 $B0/${V0}2/file -TEST $CLI volume set $V0 cluster.self-heal-daemon on -EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 0 -EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 1 -EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 2 -TEST $CLI volume heal $V0 -EXPECT_WITHIN $HEAL_TIMEOUT "^0$" get_pending_heal_count $V0 - -cleanup; diff --git a/tests/bugs/replicate/bug-1493415-gfid-heal.t b/tests/bugs/replicate/bug-1493415-gfid-heal.t index 125c35a7a21..8a79febf4b4 100644 --- a/tests/bugs/replicate/bug-1493415-gfid-heal.t +++ b/tests/bugs/replicate/bug-1493415-gfid-heal.t @@ -27,6 +27,11 @@ gfid_str_f1=$(gf_gfid_xattr_to_str $gfid_f1) TEST setfattr -x trusted.gfid $B0/${V0}1/f1 TEST rm $B0/${V0}1/.glusterfs/${gfid_str_f1:0:2}/${gfid_str_f1:2:2}/$gfid_str_f1 +# storage/posix considers that a file without gfid changed less than a second +# before doesn't exist, so we need to wait for a second to force posix to +# consider that this is a valid file but without gfid. +sleep 2 + # Assume there were no pending xattrs on parent dir due to 1st brick crashing # too. Then name heal from client must heal the gfid. EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0 @@ -52,6 +57,11 @@ TEST rm $B0/${V0}1/.glusterfs/${gfid_str_f2:0:2}/${gfid_str_f2:2:2}/$gfid_str_f2 TEST setfattr -n trusted.afr.$V0-client-1 -v 0x000000000000000000000001 $B0/${V0}0/dir create_brick_xattrop_entry $B0/${V0}0 dir +# storage/posix considers that a file without gfid changed less than a second +# before doesn't exist, so we need to wait for a second to force posix to +# consider that this is a valid file but without gfid. +sleep 2 + #Trigger entry-heal via shd TEST $CLI volume set $V0 self-heal-daemon on EXPECT_WITHIN $PROCESS_UP_TIMEOUT "Y" glustershd_up_status diff --git a/tests/bugs/replicate/bug-1586020-mark-dirty-for-entry-txn-on-quorum-failure.t b/tests/bugs/replicate/bug-1586020-mark-dirty-for-entry-txn-on-quorum-failure.t new file mode 100644 index 00000000000..49c4dea4e9c --- /dev/null +++ b/tests/bugs/replicate/bug-1586020-mark-dirty-for-entry-txn-on-quorum-failure.t @@ -0,0 +1,72 @@ +#!/bin/bash + +. $(dirname $0)/../../include.rc +. $(dirname $0)/../../volume.rc + +cleanup; + +function create_files { + local i=1 + while (true) + do + dd if=/dev/zero of=$M0/file$i bs=1M count=10 + if [ -e $B0/${V0}0/file$i ] || [ -e $B0/${V0}1/file$i ]; then + ((i++)) + else + break + fi + done + echo $i +} + +TEST glusterd + +#Create brick partitions +TEST truncate -s 100M $B0/brick0 +TEST truncate -s 100M $B0/brick1 +#Have the 3rd brick of a higher size to test the scenario of entry transaction +#passing on only one brick and not on other bricks. +TEST truncate -s 110M $B0/brick2 +LO1=`SETUP_LOOP $B0/brick0` +TEST [ $? -eq 0 ] +TEST MKFS_LOOP $LO1 +LO2=`SETUP_LOOP $B0/brick1` +TEST [ $? -eq 0 ] +TEST MKFS_LOOP $LO2 +LO3=`SETUP_LOOP $B0/brick2` +TEST [ $? -eq 0 ] +TEST MKFS_LOOP $LO3 +TEST mkdir -p $B0/${V0}0 $B0/${V0}1 $B0/${V0}2 +TEST MOUNT_LOOP $LO1 $B0/${V0}0 +TEST MOUNT_LOOP $LO2 $B0/${V0}1 +TEST MOUNT_LOOP $LO3 $B0/${V0}2 + +TEST $CLI volume create $V0 replica 3 $H0:$B0/${V0}{0,1,2} +TEST $CLI volume start $V0 +TEST $CLI volume set $V0 performance.write-behind off +TEST $CLI volume set $V0 self-heal-daemon off +TEST $GFS --volfile-server=$H0 --volfile-id=$V0 $M0 + +i=$(create_files) +TEST ! ls $B0/${V0}0/file$i +TEST ! ls $B0/${V0}1/file$i +TEST ls $B0/${V0}2/file$i +dirty=$(get_hex_xattr trusted.afr.dirty $B0/${V0}2) +TEST [ "$dirty" != "000000000000000000000000" ] + +TEST $CLI volume set $V0 self-heal-daemon on +EXPECT_WITHIN $PROCESS_UP_TIMEOUT "Y" glustershd_up_status +EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 0 +EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 1 +EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 2 +TEST rm -f $M0/file1 + +TEST $CLI volume heal $V0 +EXPECT_WITHIN $HEAL_TIMEOUT "0" get_pending_heal_count $V0 +TEST force_umount $M0 +TEST $CLI volume stop $V0 +EXPECT 'Stopped' volinfo_field $V0 'Status'; +TEST $CLI volume delete $V0; +UMOUNT_LOOP ${B0}/${V0}{0,1,2} +rm -f ${B0}/brick{0,1,2} +cleanup; diff --git a/tests/bugs/replicate/bug-1626994-info-split-brain.t b/tests/bugs/replicate/bug-1626994-info-split-brain.t new file mode 100644 index 00000000000..86bfecb1a9e --- /dev/null +++ b/tests/bugs/replicate/bug-1626994-info-split-brain.t @@ -0,0 +1,62 @@ +#!/bin/bash + +. $(dirname $0)/../../include.rc +. $(dirname $0)/../../volume.rc +. $(dirname $0)/../../afr.rc + +cleanup; + +# Test to check dirs having dirty xattr do not show up in info split-brain. + +TEST glusterd; +TEST pidof glusterd; +TEST $CLI volume create $V0 replica 3 $H0:$B0/${V0}{0,1,2}; +TEST $CLI volume set $V0 self-heal-daemon off +TEST $CLI volume start $V0; +EXPECT 'Started' volinfo_field $V0 'Status'; +EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status $V0 $H0 $B0/${V0}0 +EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status $V0 $H0 $B0/${V0}1 +EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status $V0 $H0 $B0/${V0}2 +TEST $GFS --volfile-id=/$V0 --volfile-server=$H0 $M0 +EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 0 +EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 1 +EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 2 + +# Create base entry in indices/xattrop +echo "Data" > $M0/FILE +rm -f $M0/FILE +EXPECT "1" count_index_entries $B0/${V0}0 +EXPECT "1" count_index_entries $B0/${V0}1 +EXPECT "1" count_index_entries $B0/${V0}2 + +TEST mkdir $M0/dirty_dir +TEST mkdir $M0/pending_dir + +# Set dirty xattrs on all bricks to simulate the case where entry transaction +# succeeded only the pre-op phase. +TEST setfattr -n trusted.afr.dirty -v 0x000000000000000000000001 $B0/${V0}0/dirty_dir +TEST setfattr -n trusted.afr.dirty -v 0x000000000000000000000001 $B0/${V0}1/dirty_dir +TEST setfattr -n trusted.afr.dirty -v 0x000000000000000000000001 $B0/${V0}2/dirty_dir +create_brick_xattrop_entry $B0/${V0}0 dirty_dir +# Should not show up as split-brain. +EXPECT "0" afr_get_split_brain_count $V0 + +# replace/reset brick case where the new brick has dirty and the other 2 bricks +# blame it should not be reported as split-brain. +TEST setfattr -n trusted.afr.$V0-client-2 -v 0x000000000000000000000001 $B0/${V0}0 +TEST setfattr -n trusted.afr.$V0-client-2 -v 0x000000000000000000000001 $B0/${V0}1 +TEST setfattr -n trusted.afr.dirty -v 0x000000000000000000000001 $B0/${V0}2 +create_brick_xattrop_entry $B0/${V0}0 "/" +# Should not show up as split-brain. +EXPECT "0" afr_get_split_brain_count $V0 + +# Set pending xattrs on all bricks blaming each other to simulate the case of +# entry split-brain. +TEST setfattr -n trusted.afr.$V0-client-1 -v 0x000000000000000000000001 $B0/${V0}0/pending_dir +TEST setfattr -n trusted.afr.$V0-client-2 -v 0x000000000000000000000001 $B0/${V0}1/pending_dir +TEST setfattr -n trusted.afr.$V0-client-0 -v 0x000000000000000000000001 $B0/${V0}2/pending_dir +create_brick_xattrop_entry $B0/${V0}0 pending_dir +# Should show up as split-brain. +EXPECT "1" afr_get_split_brain_count $V0 + +cleanup; diff --git a/tests/bugs/replicate/bug-1637249-gfid-heal.t b/tests/bugs/replicate/bug-1637249-gfid-heal.t new file mode 100644 index 00000000000..e824f14531e --- /dev/null +++ b/tests/bugs/replicate/bug-1637249-gfid-heal.t @@ -0,0 +1,149 @@ +#!/bin/bash + +. $(dirname $0)/../../include.rc +. $(dirname $0)/../../volume.rc +. $(dirname $0)/../../afr.rc + +cleanup; + +TEST glusterd; +TEST pidof glusterd; +TEST $CLI volume create $V0 replica 2 $H0:$B0/${V0}{0,1}; +TEST $CLI volume set $V0 self-heal-daemon off +TEST $CLI volume set $V0 entry-self-heal off +TEST $CLI volume start $V0; +EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status $V0 $H0 $B0/${V0}0 +EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status $V0 $H0 $B0/${V0}1 + +TEST $GFS --volfile-id=/$V0 --volfile-server=$H0 --attribute-timeout=0 --entry-timeout=0 $M0 +EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 0 +EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 1 + +############################################################################### + +# Test for gfid + name heal when there is no 'source' brick, i.e. parent dir +# xattrs are in split-brain or have dirty xattrs. + +TEST mkdir $M0/dir_pending +TEST dd if=/dev/urandom of=$M0/dir_pending/file1 bs=1024 count=1024 +TEST mkdir $M0/dir_pending/dir11 +TEST mkdir $M0/dir_dirty +TEST touch $M0/dir_dirty/file2 + +# Set pending entry xattrs on dir_pending and remove gfid of entries under it on one brick. +TEST setfattr -n trusted.afr.$V0-client-1 -v 0x000000000000000000000001 $B0/${V0}0/dir_pending +TEST setfattr -n trusted.afr.$V0-client-0 -v 0x000000000000000000000001 $B0/${V0}1/dir_pending + +gfid_f1=$(gf_get_gfid_xattr $B0/${V0}0/dir_pending/file1) +gfid_str_f1=$(gf_gfid_xattr_to_str $gfid_f1) +TEST setfattr -x trusted.gfid $B0/${V0}1/dir_pending/file1 +TEST rm $B0/${V0}1/.glusterfs/${gfid_str_f1:0:2}/${gfid_str_f1:2:2}/$gfid_str_f1 + +gfid_d11=$(gf_get_gfid_xattr $B0/${V0}0/dir_pending/dir11) +gfid_str_d11=$(gf_gfid_xattr_to_str $gfid_d11) +TEST setfattr -x trusted.gfid $B0/${V0}1/dir_pending/dir11 +TEST rm $B0/${V0}1/.glusterfs/${gfid_str_d11:0:2}/${gfid_str_d11:2:2}/$gfid_str_d11 + + +# Set dirty entry xattrs on dir_dirty and remove gfid of entries under it on one brick. +TEST setfattr -n trusted.afr.dirty -v 0x000000000000000000000001 $B0/${V0}1/dir_dirty +gfid_f2=$(gf_get_gfid_xattr $B0/${V0}0/dir_dirty/file2) +gfid_str_f2=$(gf_gfid_xattr_to_str $gfid_f2) +TEST setfattr -x trusted.gfid $B0/${V0}1/dir_dirty/file2 +TEST rm $B0/${V0}1/.glusterfs/${gfid_str_f2:0:2}/${gfid_str_f2:2:2}/$gfid_str_f2 + +# Create a file under dir_pending directly on the backend only on 1 brick +TEST touch $B0/${V0}1/dir_pending/file3 + +# Create a file under dir_pending directly on the backend on all bricks +TEST touch $B0/${V0}0/dir_pending/file4 +TEST touch $B0/${V0}1/dir_pending/file4 + +# Stop & start the volume and mount client again. +EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0 +TEST $CLI volume stop $V0 +TEST $CLI volume start $V0 +EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status $V0 $H0 $B0/${V0}0 +EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status $V0 $H0 $B0/${V0}1 +TEST $GFS --volfile-id=/$V0 --volfile-server=$H0 --attribute-timeout=0 --entry-timeout=0 $M0 +EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 0 +EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 1 + +TEST stat $M0/dir_pending/file1 +EXPECT "$gfid_f1" gf_get_gfid_xattr $B0/${V0}1/dir_pending/file1 +TEST stat $B0/${V0}1/.glusterfs/${gfid_str_f1:0:2}/${gfid_str_f1:2:2}/$gfid_str_f1 + +TEST stat $M0/dir_pending/dir11 +EXPECT "$gfid_d11" gf_get_gfid_xattr $B0/${V0}1/dir_pending/dir11 +TEST stat $B0/${V0}1/.glusterfs/${gfid_str_d11:0:2}/${gfid_str_d11:2:2}/$gfid_str_d11 + + +TEST stat $M0/dir_dirty/file2 +EXPECT "$gfid_f2" gf_get_gfid_xattr $B0/${V0}1/dir_dirty/file2 +TEST stat $B0/${V0}1/.glusterfs/${gfid_str_f2:0:2}/${gfid_str_f2:2:2}/$gfid_str_f2 + +TEST stat $M0/dir_pending/file3 # This assigns gfid on 2nd brick and heals the entry on to the 1st brick. +gfid_f3=$(gf_get_gfid_xattr $B0/${V0}1/dir_pending/file3) +TEST [ ! -z "$gfid_f3" ] +EXPECT "$gfid_f3" gf_get_gfid_xattr $B0/${V0}0/dir_pending/file3 + +TEST stat $M0/dir_pending/file4 +gfid_f4=$(gf_get_gfid_xattr $B0/${V0}0/dir_pending/file4) +TEST [ ! -z "$gfid_f4" ] +EXPECT "$gfid_f4" gf_get_gfid_xattr $B0/${V0}1/dir_pending/file4 +############################################################################### + +# Test for gfid + name heal when all bricks are 'source', i.e. parent dir +# does not have any pending or dirty xattrs. + +TEST mkdir $M0/dir_clean +TEST dd if=/dev/urandom of=$M0/dir_clean/file1 bs=1024 count=1024 +TEST mkdir $M0/dir_clean/dir11 + +gfid_f1=$(gf_get_gfid_xattr $B0/${V0}0/dir_clean/file1) +gfid_str_f1=$(gf_gfid_xattr_to_str $gfid_f1) +TEST setfattr -x trusted.gfid $B0/${V0}1/dir_clean/file1 +TEST rm $B0/${V0}1/.glusterfs/${gfid_str_f1:0:2}/${gfid_str_f1:2:2}/$gfid_str_f1 + +gfid_d11=$(gf_get_gfid_xattr $B0/${V0}0/dir_clean/dir11) +gfid_str_d11=$(gf_gfid_xattr_to_str $gfid_d11) +TEST setfattr -x trusted.gfid $B0/${V0}1/dir_clean/dir11 +TEST rm $B0/${V0}1/.glusterfs/${gfid_str_d11:0:2}/${gfid_str_d11:2:2}/$gfid_str_d11 + +# Create a file under dir_clean directly on the backend only on 1 brick +TEST touch $B0/${V0}1/dir_clean/file3 + +# Create a file under dir_clean directly on the backend on all bricks +TEST touch $B0/${V0}0/dir_clean/file4 +TEST touch $B0/${V0}1/dir_clean/file4 + +# Stop & start the volume and mount client again. +EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0 +TEST $CLI volume stop $V0 +TEST $CLI volume start $V0 +EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status $V0 $H0 $B0/${V0}0 +EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status $V0 $H0 $B0/${V0}1 +TEST $GFS --volfile-id=/$V0 --volfile-server=$H0 --attribute-timeout=0 --entry-timeout=0 $M0 +EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 0 +EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 1 + +TEST stat $M0/dir_clean/file1 +EXPECT "$gfid_f1" gf_get_gfid_xattr $B0/${V0}1/dir_clean/file1 +TEST stat $B0/${V0}1/.glusterfs/${gfid_str_f1:0:2}/${gfid_str_f1:2:2}/$gfid_str_f1 + +TEST stat $M0/dir_clean/dir11 +EXPECT "$gfid_d11" gf_get_gfid_xattr $B0/${V0}1/dir_clean/dir11 +TEST stat $B0/${V0}1/.glusterfs/${gfid_str_d11:0:2}/${gfid_str_d11:2:2}/$gfid_str_d11 + +TEST stat $M0/dir_clean/file3 # This assigns gfid on 2nd brick and heals the entry on to the 1st brick. +gfid_f3=$(gf_get_gfid_xattr $B0/${V0}1/dir_clean/file3) +TEST [ ! -z "$gfid_f3" ] +EXPECT "$gfid_f3" gf_get_gfid_xattr $B0/${V0}0/dir_clean/file3 + +TEST stat $M0/dir_clean/file4 +gfid_f4=$(gf_get_gfid_xattr $B0/${V0}0/dir_clean/file4) +TEST [ ! -z "$gfid_f4" ] +EXPECT "$gfid_f4" gf_get_gfid_xattr $B0/${V0}1/dir_clean/file4 +############################################################################### + +cleanup; diff --git a/tests/bugs/replicate/bug-1637802-arbiter-stale-data-heal-lock.t b/tests/bugs/replicate/bug-1637802-arbiter-stale-data-heal-lock.t new file mode 100644 index 00000000000..d7d1f285e01 --- /dev/null +++ b/tests/bugs/replicate/bug-1637802-arbiter-stale-data-heal-lock.t @@ -0,0 +1,45 @@ +#!/bin/bash + +. $(dirname $0)/../../include.rc +. $(dirname $0)/../../volume.rc +. $(dirname $0)/../../afr.rc + +cleanup; + +# Test to check that data self-heal does not leave any stale lock. + +TEST glusterd; +TEST pidof glusterd; +TEST $CLI volume create $V0 replica 3 arbiter 1 $H0:$B0/${V0}{0,1,2}; +TEST $CLI volume start $V0; +EXPECT 'Started' volinfo_field $V0 'Status'; +EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status $V0 $H0 $B0/${V0}0 +EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status $V0 $H0 $B0/${V0}1 +EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status $V0 $H0 $B0/${V0}2 +TEST $GFS --volfile-id=/$V0 --volfile-server=$H0 $M0 +EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 0 +EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 1 +EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 2 + +# Create base entry in indices/xattrop +echo "Data" > $M0/FILE + +# Kill arbiter brick and write to FILE. +TEST kill_brick $V0 $H0 $B0/${V0}2 +echo "arbiter down" >> $M0/FILE +EXPECT 2 get_pending_heal_count $V0 + +# Bring it back up and let heal complete. +TEST $CLI volume start $V0 force +EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status $V0 $H0 $B0/${V0}2 +EXPECT_WITHIN $PROCESS_UP_TIMEOUT "Y" glustershd_up_status +EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 0 +EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 1 +EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 2 +TEST $CLI volume heal $V0 +EXPECT_WITHIN $HEAL_TIMEOUT "^0$" get_pending_heal_count $V0 + +# write to the FILE must succeed. +echo "this must succeed" >> $M0/FILE +TEST [ $? -eq 0 ] +cleanup; diff --git a/tests/bugs/replicate/bug-1655050-dir-sbrain-size-policy.t b/tests/bugs/replicate/bug-1655050-dir-sbrain-size-policy.t new file mode 100644 index 00000000000..63f72e86bf6 --- /dev/null +++ b/tests/bugs/replicate/bug-1655050-dir-sbrain-size-policy.t @@ -0,0 +1,55 @@ +#!/bin/bash +. $(dirname $0)/../../include.rc +. $(dirname $0)/../../volume.rc +cleanup; + +TEST glusterd +TEST pidof glusterd + +#Create replica 2 volume +TEST $CLI volume create $V0 replica 2 $H0:$B0/${V0}{0,1} +TEST $CLI volume set $V0 self-heal-daemon off +TEST $CLI volume set $V0 data-self-heal off +TEST $CLI volume set $V0 entry-self-heal off +TEST $CLI volume set $V0 metadata-self-heal off +TEST $CLI volume start $V0 +TEST glusterfs --volfile-id=$V0 --volfile-server=$H0 $M0; + +cd $M0 +TEST mkdir dir + +#Create metadata split-brain +TEST kill_brick $V0 $H0 $B0/${V0}0 +TEST chmod 757 dir +TEST $CLI volume start $V0 force +EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status $V0 $H0 $B0/${V0}0 +EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 0 +TEST kill_brick $V0 $H0 $B0/${V0}1 +TEST chmod 747 dir +TEST $CLI volume start $V0 force +EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status $V0 $H0 $B0/${V0}1 +EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 1 + +#Use size as fav-child policy. +TEST $CLI volume set $V0 cluster.favorite-child-policy size + +#Enable shd and heal the file. +TEST $CLI volume set $V0 cluster.self-heal-daemon on +EXPECT_WITHIN $PROCESS_UP_TIMEOUT "Y" glustershd_up_status +EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 0 +EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 1 +TEST $CLI volume heal $V0 + +EXPECT_WITHIN $HEAL_TIMEOUT "2" get_pending_heal_count $V0 + +b1c1dir=$(afr_get_specific_changelog_xattr $B0/${V0}0/dir \ + trusted.afr.$V0-client-1 "metadata") +b2c0dir=$(afr_get_specific_changelog_xattr $B0/${V0}1/dir \ + trusted.afr.$V0-client-0 "metadata") + +EXPECT "00000001" echo $b1c1dir +EXPECT "00000001" echo $b2c0dir + +#Finish up +TEST force_umount $M0 +cleanup; diff --git a/tests/bugs/replicate/bug-1655052-sbrain-policy-same-size.t b/tests/bugs/replicate/bug-1655052-sbrain-policy-same-size.t new file mode 100755 index 00000000000..319736e1157 --- /dev/null +++ b/tests/bugs/replicate/bug-1655052-sbrain-policy-same-size.t @@ -0,0 +1,55 @@ +#!/bin/bash + +#Test the split-brain resolution CLI commands. +. $(dirname $0)/../../include.rc +. $(dirname $0)/../../volume.rc + +cleanup; + +TEST glusterd +TEST pidof glusterd + +#Create replica 2 volume +TEST $CLI volume create $V0 replica 2 $H0:$B0/${V0}{0,1} +TEST $CLI volume set $V0 performance.write-behind off +TEST $CLI volume set $V0 cluster.self-heal-daemon off +TEST $CLI volume set $V0 cluster.entry-self-heal off +TEST $CLI volume set $V0 cluster.data-self-heal off +TEST $CLI volume set $V0 cluster.metadata-self-heal off +TEST $CLI volume start $V0 +TEST $GFS --volfile-id=/$V0 --volfile-server=$H0 $M0 +TEST touch $M0/file + +############ Healing using favorite-child-policy = size and size of bricks is same ################# +TEST kill_brick $V0 $H0 $B0/${V0}1 +TEST dd if=/dev/urandom of=$M0/file bs=1024 count=1024 +TEST $CLI volume start $V0 force +EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status $V0 $H0 $B0/${V0}1 +EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 1 +TEST kill_brick $V0 $H0 $B0/${V0}0 +TEST dd if=/dev/urandom of=$M0/file bs=1024 count=1024 + +TEST $CLI volume start $V0 force +EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status $V0 $H0 $B0/${V0}0 +EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 0 +TEST $CLI volume set $V0 cluster.self-heal-daemon on +EXPECT_WITHIN $PROCESS_UP_TIMEOUT "Y" glustershd_up_status +EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 0 +EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 1 +TEST $CLI volume heal $V0 + +#file still in split-brain +EXPECT_WITHIN $HEAL_TIMEOUT "2" get_pending_heal_count $V0 +cat $M0/file > /dev/null +EXPECT_NOT "^0$" echo $? + +#We know that both bricks have same size file +TEST $CLI volume set $V0 cluster.favorite-child-policy size +TEST $CLI volume heal $V0 +EXPECT_WITHIN $HEAL_TIMEOUT "2" get_pending_heal_count $V0 +cat $M0/file > /dev/null +EXPECT_NOT "^0$" echo $? + +EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0 +cleanup + diff --git a/tests/bugs/replicate/bug-1655854-support-dist-to-rep3-arb-conversion.t b/tests/bugs/replicate/bug-1655854-support-dist-to-rep3-arb-conversion.t new file mode 100644 index 00000000000..783016dc3c0 --- /dev/null +++ b/tests/bugs/replicate/bug-1655854-support-dist-to-rep3-arb-conversion.t @@ -0,0 +1,95 @@ +#!/bin/bash +. $(dirname $0)/../../include.rc +. $(dirname $0)/../../volume.rc +cleanup; + +TEST glusterd +TEST pidof glusterd + +# Conversion from 2x1 to 2x3 + +TEST $CLI volume create $V0 $H0:$B0/${V0}{0,1} +EXPECT 'Created' volinfo_field $V0 'Status'; +TEST $CLI volume start $V0 +EXPECT 'Started' volinfo_field $V0 'Status'; + +EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status $V0 $H0 $B0/${V0}0 +EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status $V0 $H0 $B0/${V0}1 + +TEST $GFS --volfile-id=$V0 --volfile-server=$H0 $M0; +TEST mkdir $M0/dir +TEST dd if=/dev/urandom of=$M0/dir/file bs=100K count=5 +file_md5sum=$(md5sum $M0/dir/file | awk '{print $1}') + +TEST $CLI volume add-brick $V0 replica 3 $H0:$B0/${V0}{2..5} + +EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status $V0 $H0 $B0/${V0}2 +EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status $V0 $H0 $B0/${V0}3 +EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status $V0 $H0 $B0/${V0}4 +EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status $V0 $H0 $B0/${V0}5 + +EXPECT_WITHIN $PROCESS_UP_TIMEOUT "Y" glustershd_up_status +EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 0 +EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 1 +EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 2 +EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 3 +EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 4 +EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 5 + +# Trigger heal and wait for for it to complete +TEST $CLI volume heal $V0 +EXPECT_WITHIN $HEAL_TIMEOUT "^0$" get_pending_heal_count $V0 + +# Check whether the directory & file are healed to the newly added bricks +TEST ls $B0/${V0}2/dir +TEST ls $B0/${V0}3/dir +TEST ls $B0/${V0}4/dir +TEST ls $B0/${V0}5/dir + +TEST [ $file_md5sum == $(md5sum $B0/${V0}4/dir/file | awk '{print $1}') ] +TEST [ $file_md5sum == $(md5sum $B0/${V0}5/dir/file | awk '{print $1}') ] + + +# Conversion from 2x1 to 2x(2+1) + +TEST $CLI volume create $V1 $H0:$B0/${V1}{0,1} +EXPECT 'Created' volinfo_field $V1 'Status'; +TEST $CLI volume start $V1 +EXPECT 'Started' volinfo_field $V1 'Status'; + +EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status $V1 $H0 $B0/${V1}0 +EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status $V1 $H0 $B0/${V1}1 + +TEST $GFS --volfile-id=$V1 --volfile-server=$H0 $M1; +TEST mkdir $M1/dir +TEST dd if=/dev/urandom of=$M1/dir/file bs=100K count=5 +file_md5sum=$(md5sum $M1/dir/file | awk '{print $1}') + +TEST $CLI volume add-brick $V1 replica 3 arbiter 1 $H0:$B0/${V1}{2..5} +EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status $V1 $H0 $B0/${V1}2 +EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status $V1 $H0 $B0/${V1}3 +EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status $V1 $H0 $B0/${V1}4 +EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status $V1 $H0 $B0/${V1}5 + +EXPECT_WITHIN $PROCESS_UP_TIMEOUT "Y" glustershd_up_status +EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V1 0 +EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V1 1 +EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V1 2 +EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V1 3 +EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V1 4 +EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V1 5 + +# Trigger heal and wait for for it to complete +TEST $CLI volume heal $V1 +EXPECT_WITHIN $HEAL_TIMEOUT "^0$" get_pending_heal_count $V1 + +# Check whether the directory & file are healed to the newly added bricks +TEST ls $B0/${V1}2/dir +TEST ls $B0/${V1}3/dir +TEST ls $B0/${V1}4/dir +TEST ls $B0/${V1}5/dir + +EXPECT "0" stat -c %s $B0/${V1}5/dir/file +TEST [ $file_md5sum == $(md5sum $B0/${V1}4/dir/file | awk '{print $1}') ] + +cleanup; diff --git a/tests/bugs/replicate/bug-1657783-do-not-update-read-subvol-on-rename-link.t b/tests/bugs/replicate/bug-1657783-do-not-update-read-subvol-on-rename-link.t new file mode 100644 index 00000000000..b180f0e1239 --- /dev/null +++ b/tests/bugs/replicate/bug-1657783-do-not-update-read-subvol-on-rename-link.t @@ -0,0 +1,40 @@ +#!/bin/bash +. $(dirname $0)/../../include.rc +. $(dirname $0)/../../volume.rc +cleanup; + +TEST glusterd +TEST pidof glusterd +TEST $CLI volume create $V0 replica 3 $H0:$B0/${V0}{0..2} +TEST $CLI volume set $V0 self-heal-daemon off +TEST $CLI volume set $V0 cluster.data-self-heal off +TEST $CLI volume set $V0 cluster.metadata-self-heal off +TEST $CLI volume set $V0 cluster.entry-self-heal off +TEST $CLI volume set $V0 performance.write-behind off + +TEST $CLI volume start $V0 +TEST $GFS --volfile-id=$V0 --volfile-server=$H0 $M0; +TEST mkdir $M0/dir +TEST "echo abc > $M0/file1" +TEST "echo uvw > $M0/file2" + +TEST kill_brick $V0 $H0 $B0/${V0}0 +TEST "echo def > $M0/file1" +TEST "echo xyz > $M0/file2" + +TEST $CLI volume start $V0 force +EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status $V0 $H0 $B0/${V0}0 +EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 0 + +TEST kill_brick $V0 $H0 $B0/${V0}1 + +# Rename file1 and read it. Read should be served from the 3rd brick +TEST mv $M0/file1 $M0/file3 +EXPECT "def" cat $M0/file3 + +# Create a link to file2 and read it. Read should be served from the 3rd brick +TEST ln $M0/file2 $M0/dir/file4 +EXPECT "xyz" cat $M0/dir/file4 +EXPECT "xyz" cat $M0/file2 + +cleanup diff --git a/tests/bugs/replicate/bug-1686568-send-truncate-on-arbiter-from-shd.t b/tests/bugs/replicate/bug-1686568-send-truncate-on-arbiter-from-shd.t new file mode 100644 index 00000000000..78581e99614 --- /dev/null +++ b/tests/bugs/replicate/bug-1686568-send-truncate-on-arbiter-from-shd.t @@ -0,0 +1,38 @@ +#!/bin/bash +. $(dirname $0)/../../include.rc +. $(dirname $0)/../../volume.rc +cleanup; + +CHANGELOG_PATH_0="$B0/${V0}2/.glusterfs/changelogs" +ROLLOVER_TIME=100 + +TEST glusterd +TEST pidof glusterd +TEST $CLI volume create $V0 replica 2 $H0:$B0/${V0}{0,1} +TEST $CLI volume set $V0 changelog.changelog on +TEST $CLI volume set $V0 changelog.rollover-time $ROLLOVER_TIME +TEST $CLI volume start $V0 +EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status $V0 $H0 $B0/${V0}0 +EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status $V0 $H0 $B0/${V0}1 + +TEST $GFS --volfile-id=$V0 --volfile-server=$H0 $M0; +TEST dd if=/dev/zero of=$M0/file1 bs=128K count=5 + +TEST $CLI volume profile $V0 start +TEST $CLI volume add-brick $V0 replica 3 arbiter 1 $H0:$B0/${V0}2 +EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status $V0 $H0 $B0/${V0}2 +EXPECT_WITHIN $PROCESS_UP_TIMEOUT "Y" glustershd_up_status +EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 0 +EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 1 +EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 2 + +TEST $CLI volume heal $V0 +EXPECT_WITHIN $HEAL_TIMEOUT "^0$" get_pending_heal_count $V0 + +TEST $CLI volume profile $V0 info +truncate_count=$($CLI volume profile $V0 info | grep TRUNCATE | awk '{count += $8} END {print count}') + +EXPECT "1" echo $truncate_count +EXPECT "1" check_changelog_op ${CHANGELOG_PATH_0} "^ D " + +cleanup; diff --git a/tests/bugs/replicate/bug-1696599-io-hang.t b/tests/bugs/replicate/bug-1696599-io-hang.t new file mode 100755 index 00000000000..869cdb94bda --- /dev/null +++ b/tests/bugs/replicate/bug-1696599-io-hang.t @@ -0,0 +1,47 @@ +#!/bin/bash + +. $(dirname $0)/../../include.rc +. $(dirname $0)/../../volume.rc +. $(dirname $0)/../../fileio.rc + +#Tests that local structures in afr are removed from granted/blocked list of +#locks when inodelk fails on all bricks + +cleanup; + +TEST glusterd +TEST pidof glusterd + +TEST $CLI volume create $V0 replica 3 $H0:$B0/${V0}{1..3} +TEST $CLI volume set $V0 performance.quick-read off +TEST $CLI volume set $V0 performance.write-behind off +TEST $CLI volume set $V0 performance.io-cache off +TEST $CLI volume set $V0 performance.stat-prefetch off +TEST $CLI volume set $V0 performance.client-io-threads off +TEST $CLI volume set $V0 delay-gen locks +TEST $CLI volume set $V0 delay-gen.delay-duration 5000000 +TEST $CLI volume set $V0 delay-gen.delay-percentage 100 +TEST $CLI volume set $V0 delay-gen.enable finodelk + +TEST $CLI volume start $V0 +EXPECT 'Started' volinfo_field $V0 'Status' + +TEST $GFS -s $H0 --volfile-id $V0 $M0 +TEST touch $M0/file +#Trigger write and stop bricks so inodelks fail on all bricks leading to +#lock failure condition +echo abc >> $M0/file & + +TEST $CLI volume stop $V0 +TEST $CLI volume reset $V0 delay-gen +wait +TEST $CLI volume start $V0 +EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_meta $M0 $V0-replicate-0 0 +EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_meta $M0 $V0-replicate-0 1 +EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_meta $M0 $V0-replicate-0 2 +#Test that only one write succeeded, this tests that delay-gen worked as +#expected +echo abc >> $M0/file +EXPECT "abc" cat $M0/file + +cleanup; diff --git a/tests/bugs/replicate/bug-1717819-metadata-split-brain-detection.t b/tests/bugs/replicate/bug-1717819-metadata-split-brain-detection.t new file mode 100644 index 00000000000..76d1f2170f2 --- /dev/null +++ b/tests/bugs/replicate/bug-1717819-metadata-split-brain-detection.t @@ -0,0 +1,136 @@ +#!/bin/bash + +. $(dirname $0)/../../include.rc +. $(dirname $0)/../../volume.rc +. $(dirname $0)/../../afr.rc + +cleanup; + +## Start and create a volume +TEST glusterd; +TEST pidof glusterd; +TEST $CLI volume info; + +TEST $CLI volume create $V0 replica 3 $H0:$B0/${V0}{0,1,2}; +TEST $CLI volume start $V0; +EXPECT 'Started' volinfo_field $V0 'Status'; +TEST $CLI volume heal $V0 disable +TEST $GFS --volfile-id=/$V0 --volfile-server=$H0 $M0 + +############################################################################### +# Case of 2 bricks blaming the third and the third blaming the other two. + +TEST mkdir $M0/dir + +# B0 and B2 must blame B1 +TEST kill_brick $V0 $H0 $B0/$V0"1" +TEST setfattr -n user.metadata -v 1 $M0/dir +EXPECT "00000001" afr_get_specific_changelog_xattr $B0/${V0}0/dir trusted.afr.$V0-client-1 metadata +EXPECT "00000001" afr_get_specific_changelog_xattr $B0/${V0}2/dir trusted.afr.$V0-client-1 metadata +CLIENT_XATTR=$(getfattr -n 'user.metadata' --absolute-names --only-values $M0/dir) + +# B1 must blame B0 and B2 +setfattr -n trusted.afr.$V0-client-0 -v 0x000000000000000100000000 $B0/$V0"1"/dir +setfattr -n trusted.afr.$V0-client-2 -v 0x000000000000000100000000 $B0/$V0"1"/dir + +# Launch heal +TEST $CLI volume start $V0 force +EXPECT_WITHIN $PROCESS_UP_TIMEOUT "^1$" brick_up_status $V0 $H0 $B0/${V0}1 +TEST $CLI volume heal $V0 enable +EXPECT_WITHIN $PROCESS_UP_TIMEOUT "^Y$" glustershd_up_status +EXPECT_WITHIN $CHILD_UP_TIMEOUT "^1$" afr_child_up_status_in_shd $V0 0 +EXPECT_WITHIN $CHILD_UP_TIMEOUT "^1$" afr_child_up_status_in_shd $V0 1 +EXPECT_WITHIN $CHILD_UP_TIMEOUT "^1$" afr_child_up_status_in_shd $V0 2 +TEST $CLI volume heal $V0 +EXPECT_WITHIN $HEAL_TIMEOUT "^0$" get_pending_heal_count $V0 + +B0_XATTR=$(getfattr -n 'user.metadata' --absolute-names --only-values $B0/${V0}0/dir) +B1_XATTR=$(getfattr -n 'user.metadata' --absolute-names --only-values $B0/${V0}1/dir) +B2_XATTR=$(getfattr -n 'user.metadata' --absolute-names --only-values $B0/${V0}2/dir) + +TEST [ "$CLIENT_XATTR" == "$B0_XATTR" ] +TEST [ "$CLIENT_XATTR" == "$B1_XATTR" ] +TEST [ "$CLIENT_XATTR" == "$B2_XATTR" ] +TEST setfattr -x user.metadata $M0/dir + +############################################################################### +# Case of each brick blaming the next one in a cyclic manner + +TEST $CLI volume heal $V0 disable +TEST `echo "hello" >> $M0/dir/file` +# Mark cyclic xattrs and modify metadata directly on the bricks. +setfattr -n trusted.afr.$V0-client-1 -v 0x000000000000000100000000 $B0/$V0"0"/dir/file +setfattr -n trusted.afr.$V0-client-2 -v 0x000000000000000100000000 $B0/$V0"1"/dir/file +setfattr -n trusted.afr.$V0-client-0 -v 0x000000000000000100000000 $B0/$V0"2"/dir/file + +setfattr -n user.metadata -v 1 $B0/$V0"0"/dir/file +setfattr -n user.metadata -v 2 $B0/$V0"1"/dir/file +setfattr -n user.metadata -v 3 $B0/$V0"2"/dir/file + +# Add entry to xattrop dir to trigger index heal. +xattrop_dir0=$(afr_get_index_path $B0/$V0"0") +base_entry_b0=`ls $xattrop_dir0` +gfid_str=$(gf_gfid_xattr_to_str $(gf_get_gfid_xattr $B0/$V0"0"/dir/file)) +ln $xattrop_dir0/$base_entry_b0 $xattrop_dir0/$gfid_str +EXPECT_WITHIN $HEAL_TIMEOUT "^1$" get_pending_heal_count $V0 + +# Launch heal +TEST $CLI volume heal $V0 enable +EXPECT_WITHIN $PROCESS_UP_TIMEOUT "^Y$" glustershd_up_status +EXPECT_WITHIN $CHILD_UP_TIMEOUT "^1$" afr_child_up_status_in_shd $V0 0 +EXPECT_WITHIN $CHILD_UP_TIMEOUT "^1$" afr_child_up_status_in_shd $V0 1 +EXPECT_WITHIN $CHILD_UP_TIMEOUT "^1$" afr_child_up_status_in_shd $V0 2 +TEST $CLI volume heal $V0 +EXPECT_WITHIN $HEAL_TIMEOUT "^0$" get_pending_heal_count $V0 + +B0_XATTR=$(getfattr -n 'user.metadata' --absolute-names --only-values $B0/${V0}0/dir/file) +B1_XATTR=$(getfattr -n 'user.metadata' --absolute-names --only-values $B0/${V0}1/dir/file) +B2_XATTR=$(getfattr -n 'user.metadata' --absolute-names --only-values $B0/${V0}2/dir/file) + +TEST [ "$B0_XATTR" == "$B1_XATTR" ] +TEST [ "$B0_XATTR" == "$B2_XATTR" ] +TEST rm -f $M0/dir/file + +############################################################################### +# Case of 2 bricks having quorum blaming and the other having only one blaming. + +TEST $CLI volume heal $V0 disable +TEST `echo "hello" >> $M0/dir/file` +# B0 and B2 must blame B1 +TEST kill_brick $V0 $H0 $B0/$V0"1" +TEST setfattr -n user.metadata -v 1 $M0/dir/file +EXPECT "00000001" afr_get_specific_changelog_xattr $B0/${V0}0/dir/file trusted.afr.$V0-client-1 metadata +EXPECT "00000001" afr_get_specific_changelog_xattr $B0/${V0}2/dir/file trusted.afr.$V0-client-1 metadata + +# B1 must blame B0 and B2 +setfattr -n trusted.afr.$V0-client-0 -v 0x000000000000000100000000 $B0/$V0"1"/dir/file +setfattr -n trusted.afr.$V0-client-2 -v 0x000000000000000100000000 $B0/$V0"1"/dir/file + +# B0 must blame B2 +setfattr -n trusted.afr.$V0-client-2 -v 0x000000000000000100000000 $B0/$V0"0"/dir/file + +# Modify the metadata directly on the bricks B1 & B2. +setfattr -n user.metadata -v 2 $B0/$V0"1"/dir/file +setfattr -n user.metadata -v 3 $B0/$V0"2"/dir/file + +# Launch heal +TEST $CLI volume start $V0 force +EXPECT_WITHIN $PROCESS_UP_TIMEOUT "^1$" brick_up_status $V0 $H0 $B0/${V0}1 +TEST $CLI volume heal $V0 enable +EXPECT_WITHIN $PROCESS_UP_TIMEOUT "^Y$" glustershd_up_status +EXPECT_WITHIN $CHILD_UP_TIMEOUT "^1$" afr_child_up_status_in_shd $V0 0 +EXPECT_WITHIN $CHILD_UP_TIMEOUT "^1$" afr_child_up_status_in_shd $V0 1 +EXPECT_WITHIN $CHILD_UP_TIMEOUT "^1$" afr_child_up_status_in_shd $V0 2 +TEST $CLI volume heal $V0 +EXPECT_WITHIN $HEAL_TIMEOUT "^0$" get_pending_heal_count $V0 + +B0_XATTR=$(getfattr -n 'user.metadata' --absolute-names --only-values $B0/${V0}0/dir/file) +B1_XATTR=$(getfattr -n 'user.metadata' --absolute-names --only-values $B0/${V0}1/dir/file) +B2_XATTR=$(getfattr -n 'user.metadata' --absolute-names --only-values $B0/${V0}2/dir/file) + +TEST [ "$B0_XATTR" == "$B1_XATTR" ] +TEST [ "$B0_XATTR" == "$B2_XATTR" ] + +############################################################################### + +cleanup diff --git a/tests/bugs/replicate/bug-1722507-type-mismatch-error-handling.t b/tests/bugs/replicate/bug-1722507-type-mismatch-error-handling.t new file mode 100644 index 00000000000..0aeaaafc84c --- /dev/null +++ b/tests/bugs/replicate/bug-1722507-type-mismatch-error-handling.t @@ -0,0 +1,116 @@ +#!/bin/bash + +. $(dirname $0)/../../include.rc +. $(dirname $0)/../../volume.rc +. $(dirname $0)/../../afr.rc + +cleanup; + +## Start and create a volume +TEST glusterd; +TEST pidof glusterd; +TEST $CLI volume info; + +TEST $CLI volume create $V0 replica 3 $H0:$B0/${V0}{0,1,2}; +TEST $CLI volume start $V0; +TEST $CLI volume set $V0 cluster.heal-timeout 5 +TEST $CLI volume heal $V0 disable +EXPECT 'Started' volinfo_field $V0 'Status'; +TEST $GFS --volfile-id=/$V0 --volfile-server=$H0 $M0 + +TEST mkdir $M0/dir + +########################################################################################## +# GFID link file and the GFID is missing on one brick and all the bricks are being blamed. + +TEST touch $M0/dir/file +#TEST kill_brick $V0 $H0 $B0/$V0"1" + +#B0 and B2 must blame B1 +setfattr -n trusted.afr.$V0-client-0 -v 0x000000000000000000000001 $B0/$V0"2"/dir +setfattr -n trusted.afr.$V0-client-1 -v 0x000000000000000000000001 $B0/$V0"0"/dir +setfattr -n trusted.afr.$V0-client-2 -v 0x000000000000000000000001 $B0/$V0"0"/dir + +# Add entry to xattrop dir to trigger index heal. +xattrop_dir0=$(afr_get_index_path $B0/$V0"0") +base_entry_b0=`ls $xattrop_dir0` +gfid_str=$(gf_gfid_xattr_to_str $(gf_get_gfid_xattr $B0/$V0"0"/dir/)) +ln -s $xattrop_dir0/$base_entry_b0 $xattrop_dir0/$gfid_str +EXPECT "^1$" get_pending_heal_count $V0 + +# Remove the gfid xattr and the link file on one brick. +gfid_file=$(gf_get_gfid_xattr $B0/$V0"0"/dir/file) +gfid_str_file=$(gf_gfid_xattr_to_str $gfid_file) +TEST setfattr -x trusted.gfid $B0/${V0}0/dir/file +TEST rm -f $B0/${V0}0/.glusterfs/${gfid_str_file:0:2}/${gfid_str_file:2:2}/$gfid_str_file + +# Launch heal +TEST $CLI volume heal $V0 enable +EXPECT_WITHIN $PROCESS_UP_TIMEOUT "^Y$" glustershd_up_status +EXPECT_WITHIN $CHILD_UP_TIMEOUT "^1$" afr_child_up_status_in_shd $V0 0 +EXPECT_WITHIN $CHILD_UP_TIMEOUT "^1$" afr_child_up_status_in_shd $V0 1 +EXPECT_WITHIN $CHILD_UP_TIMEOUT "^1$" afr_child_up_status_in_shd $V0 2 + +# Wait for 2 second to force posix to consider that this is a valid file but +# without gfid. +sleep 2 +TEST $CLI volume heal $V0 + +# Heal should not fail as the file is missing gfid xattr and the link file, +# which is not actually the gfid or type mismatch. +EXPECT_WITHIN $HEAL_TIMEOUT "^0$" get_pending_heal_count $V0 + +EXPECT "$gfid_file" gf_get_gfid_xattr $B0/${V0}0/dir/file +TEST stat $B0/${V0}0/.glusterfs/${gfid_str_file:0:2}/${gfid_str_file:2:2}/$gfid_str_file +rm -f $M0/dir/file + + +########################################################################################### +# GFID link file and the GFID is missing on two bricks and all the bricks are being blamed. + +TEST $CLI volume heal $V0 disable +TEST touch $M0/dir/file +#TEST kill_brick $V0 $H0 $B0/$V0"1" + +#B0 and B2 must blame B1 +setfattr -n trusted.afr.$V0-client-0 -v 0x000000000000000000000001 $B0/$V0"2"/dir +setfattr -n trusted.afr.$V0-client-1 -v 0x000000000000000000000001 $B0/$V0"0"/dir +setfattr -n trusted.afr.$V0-client-2 -v 0x000000000000000000000001 $B0/$V0"0"/dir + +# Add entry to xattrop dir to trigger index heal. +xattrop_dir0=$(afr_get_index_path $B0/$V0"0") +base_entry_b0=`ls $xattrop_dir0` +gfid_str=$(gf_gfid_xattr_to_str $(gf_get_gfid_xattr $B0/$V0"0"/dir/)) +ln -s $xattrop_dir0/$base_entry_b0 $xattrop_dir0/$gfid_str +EXPECT "^1$" get_pending_heal_count $V0 + +# Remove the gfid xattr and the link file on two bricks. +gfid_file=$(gf_get_gfid_xattr $B0/$V0"0"/dir/file) +gfid_str_file=$(gf_gfid_xattr_to_str $gfid_file) +TEST setfattr -x trusted.gfid $B0/${V0}0/dir/file +TEST rm -f $B0/${V0}0/.glusterfs/${gfid_str_file:0:2}/${gfid_str_file:2:2}/$gfid_str_file +TEST setfattr -x trusted.gfid $B0/${V0}1/dir/file +TEST rm -f $B0/${V0}1/.glusterfs/${gfid_str_file:0:2}/${gfid_str_file:2:2}/$gfid_str_file + +# Launch heal +TEST $CLI volume heal $V0 enable +EXPECT_WITHIN $PROCESS_UP_TIMEOUT "^Y$" glustershd_up_status +EXPECT_WITHIN $CHILD_UP_TIMEOUT "^1$" afr_child_up_status_in_shd $V0 0 +EXPECT_WITHIN $CHILD_UP_TIMEOUT "^1$" afr_child_up_status_in_shd $V0 1 +EXPECT_WITHIN $CHILD_UP_TIMEOUT "^1$" afr_child_up_status_in_shd $V0 2 + +# Wait for 2 second to force posix to consider that this is a valid file but +# without gfid. +sleep 2 +TEST $CLI volume heal $V0 + +# Heal should not fail as the file is missing gfid xattr and the link file, +# which is not actually the gfid or type mismatch. +EXPECT_WITHIN $HEAL_TIMEOUT "^0$" get_pending_heal_count $V0 + +EXPECT "$gfid_file" gf_get_gfid_xattr $B0/${V0}0/dir/file +TEST stat $B0/${V0}0/.glusterfs/${gfid_str_file:0:2}/${gfid_str_file:2:2}/$gfid_str_file +EXPECT "$gfid_file" gf_get_gfid_xattr $B0/${V0}1/dir/file +TEST stat $B0/${V0}1/.glusterfs/${gfid_str_file:0:2}/${gfid_str_file:2:2}/$gfid_str_file + +cleanup diff --git a/tests/bugs/replicate/bug-1728770-pass-xattrs.t b/tests/bugs/replicate/bug-1728770-pass-xattrs.t new file mode 100644 index 00000000000..159c4fcc6a1 --- /dev/null +++ b/tests/bugs/replicate/bug-1728770-pass-xattrs.t @@ -0,0 +1,52 @@ +#!/bin/bash + +. $(dirname $0)/../../include.rc +. $(dirname $0)/../../volume.rc +. $(dirname $0)/../../snapshot.rc + +cleanup; + +function fop_on_bad_disk { + local path=$1 + mkdir $path/dir{1..1000} 2>/dev/null + mv $path/dir1 $path/newdir + touch $path/foo.txt + echo $? +} + +function ls_fop_on_bad_disk { + local path=$1 + ls $path + echo $? +} + +TEST init_n_bricks 6; +TEST setup_lvm 6; + +TEST glusterd; +TEST pidof glusterd; + +TEST $CLI volume create $V0 replica 3 $H0:$L1 $H0:$L2 $H0:$L3 $H0:$L4 $H0:$L5 $H0:$L6; +TEST $CLI volume set $V0 health-check-interval 1000; + +TEST $CLI volume start $V0; + +TEST $GFS --volfile-server=$H0 --volfile-id=$V0 $M0; +#corrupt last disk +dd if=/dev/urandom of=/dev/mapper/patchy_snap_vg_6-brick_lvm bs=512K count=200 status=progress && sync + + +# Test the disk is now returning EIO for touch and ls +EXPECT_WITHIN $DISK_FAIL_TIMEOUT "^1$" fop_on_bad_disk "$L6" +EXPECT_WITHIN $DISK_FAIL_TIMEOUT "^2$" ls_fop_on_bad_disk "$L6" + +TEST touch $M0/foo{1..100} +TEST $CLI volume remove-brick $V0 replica 3 $H0:$L4 $H0:$L5 $H0:$L6 start +EXPECT_WITHIN $REBALANCE_TIMEOUT "completed" remove_brick_status_completed_field "$V0" "$H0:$L4 $H0:$L5 $H0:$L6"; + +#check that remove-brick status should not have any failed or skipped files +var=`$CLI volume remove-brick $V0 $H0:$L4 $H0:$L5 $H0:$L6 status | grep completed` +TEST [ `echo $var | awk '{print $5}'` = "0" ] +TEST [ `echo $var | awk '{print $6}'` = "0" ] + +cleanup; diff --git a/tests/bugs/replicate/bug-1734370-entry-heal-restore-time.t b/tests/bugs/replicate/bug-1734370-entry-heal-restore-time.t new file mode 100644 index 00000000000..14dfae89135 --- /dev/null +++ b/tests/bugs/replicate/bug-1734370-entry-heal-restore-time.t @@ -0,0 +1,102 @@ +#!/bin/bash + +. $(dirname $0)/../../include.rc +. $(dirname $0)/../../volume.rc +. $(dirname $0)/../../afr.rc + +cleanup; + +function time_stamps_match { + path=$1 + mtime_source_b0=$(get_mtime $B0/${V0}0/$path) + atime_source_b0=$(get_atime $B0/${V0}0/$path) + mtime_source_b2=$(get_mtime $B0/${V0}2/$path) + atime_source_b2=$(get_atime $B0/${V0}2/$path) + mtime_sink_b1=$(get_mtime $B0/${V0}1/$path) + atime_sink_b1=$(get_atime $B0/${V0}1/$path) + + #The same brick must be the source of heal for both atime and mtime. + if [[ ( $mtime_source_b0 -eq $mtime_sink_b1 && $atime_source_b0 -eq $atime_sink_b1 ) || \ + ( $mtime_source_b2 -eq $mtime_sink_b1 && $atime_source_b2 -eq $atime_sink_b1 ) ]] + then + echo "Y" + else + echo "Mtimes: $mtime_source_b0:$mtime_sink_b1:$mtime_source_b2 Atimes: $atime_source_b0:$atime_sink_b1:$atime_source_b2" + fi + +} + +function mtimes_match { + path=$1 + mtime_source_b0=$(get_mtime $B0/${V0}0/$path) + mtime_source_b2=$(get_mtime $B0/${V0}2/$path) + mtime_sink_b1=$(get_mtime $B0/${V0}1/$path) + + if [[ ( $mtime_source_b0 -eq $mtime_sink_b1) || \ + ( $mtime_source_b2 -eq $mtime_sink_b1) ]] + then + echo "Y" + else + echo "Mtimes: $mtime_source_b0:$mtime_sink_b1:$mtime_source_b2" + fi + +} + +# Test that the parent dir's timestamps are restored during entry-heal. +GET_MDATA_PATH=$(dirname $0)/../../utils +build_tester $GET_MDATA_PATH/get-mdata-xattr.c + +TEST glusterd; +TEST pidof glusterd; +TEST $CLI volume create $V0 replica 3 $H0:$B0/${V0}{0,1,2}; +TEST $CLI volume start $V0; + +TEST $GFS --volfile-id=/$V0 --volfile-server=$H0 --attribute-timeout=0 --entry-timeout=0 $M0 +EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 0 +EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 1 +EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 2 + +############################################################################### +TEST mkdir $M0/DIR +TEST kill_brick $V0 $H0 $B0/${V0}1 +TEST touch $M0/DIR/FILE + +TEST $CLI volume start $V0 force +EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status $V0 1 +EXPECT_WITHIN $PROCESS_UP_TIMEOUT "Y" glustershd_up_status +EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 0 +EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 1 +EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 2 +TEST $CLI volume heal $V0 +EXPECT_WITHIN $HEAL_TIMEOUT "0" get_pending_heal_count $V0 + +EXPECT "Y" time_stamps_match DIR +ctime_source1=$(get_ctime $B0/${V0}0/$path) +ctime_source2=$(get_ctime $B0/${V0}2/$path) +ctime_sink=$(get_ctime $B0/${V0}1/$path) +TEST [ $ctime_source1 -eq $ctime_sink ] +TEST [ $ctime_source2 -eq $ctime_sink ] + + +############################################################################### +# Repeat the test with ctime feature disabled. +TEST $CLI volume set $V0 features.ctime off +TEST mkdir $M0/DIR2 +TEST kill_brick $V0 $H0 $B0/${V0}1 +TEST touch $M0/DIR2/FILE + +TEST $CLI volume start $V0 force +EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status $V0 0 +EXPECT_WITHIN $PROCESS_UP_TIMEOUT "Y" glustershd_up_status +EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 0 +EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 1 +EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 2 +TEST $CLI volume heal $V0 +#Executing parallel heal may lead to changing atime after heal. So better +#to test just the mtime +EXPECT_WITHIN $HEAL_TIMEOUT "0" get_pending_heal_count $V0 + +EXPECT "Y" mtimes_match DIR2 + +TEST rm $GET_MDATA_PATH/get-mdata-xattr +cleanup; diff --git a/tests/bugs/replicate/bug-1744548-heal-timeout.t b/tests/bugs/replicate/bug-1744548-heal-timeout.t new file mode 100644 index 00000000000..011535066f9 --- /dev/null +++ b/tests/bugs/replicate/bug-1744548-heal-timeout.t @@ -0,0 +1,47 @@ +#!/bin/bash + +. $(dirname $0)/../../include.rc +. $(dirname $0)/../../volume.rc +. $(dirname $0)/../../afr.rc + +function get_cumulative_opendir_count { +#sed command prints content between Cumulative and Interval, this keeps content from Cumulative stats + $CLI volume profile $V0 info |sed -n '/^Cumulative/,/^Interval/p'|grep OPENDIR| awk '{print $8}'|tr -d '\n' +} + +cleanup; + +TEST glusterd; +TEST pidof glusterd; +TEST $CLI volume create $V0 replica 3 $H0:$B0/${V0}{0,1,2} +TEST $CLI volume heal $V0 disable +TEST $CLI volume start $V0 +EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status $V0 $H0 $B0/${V0}0 +EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status $V0 $H0 $B0/${V0}1 +EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status $V0 $H0 $B0/${V0}2 +TEST ! $CLI volume heal $V0 + +# Enable shd and verify that index crawl is triggered immediately. +TEST $CLI volume profile $V0 start +TEST $CLI volume profile $V0 info clear +TEST $CLI volume heal $V0 enable +# Each brick does 4 opendirs, corresponding to dirty, xattrop and entry-changes, anonymous-inode +EXPECT_WITHIN 4 "^444$" get_cumulative_opendir_count + +# Check that a change in heal-timeout is honoured immediately. +TEST $CLI volume set $V0 cluster.heal-timeout 5 +sleep 10 +# Two crawls must have happened. +EXPECT_WITHIN $CHILD_UP_TIMEOUT "^121212$" get_cumulative_opendir_count + +# shd must not heal if it is disabled and heal-timeout is changed. +TEST $CLI volume heal $V0 disable +#Wait for configuration update and any opendir fops to complete +sleep 10 +TEST $CLI volume profile $V0 info clear +TEST $CLI volume set $V0 cluster.heal-timeout 6 +#Better to wait for more than 6 seconds to account for configuration updates +sleep 10 +COUNT=`$CLI volume profile $V0 info incremental |grep OPENDIR|awk '{print $8}'|tr -d '\n'` +TEST [ -z $COUNT ] +cleanup; diff --git a/tests/bugs/replicate/bug-1749322-entry-heal-not-happening.t b/tests/bugs/replicate/bug-1749322-entry-heal-not-happening.t new file mode 100644 index 00000000000..96279084065 --- /dev/null +++ b/tests/bugs/replicate/bug-1749322-entry-heal-not-happening.t @@ -0,0 +1,89 @@ +#!/bin/bash + +. $(dirname $0)/../../include.rc +. $(dirname $0)/../../volume.rc +. $(dirname $0)/../../afr.rc + +cleanup + +function check_gfid_and_link_count +{ + local file=$1 + + file_gfid_b0=$(gf_get_gfid_xattr $B0/${V0}0/$file) + TEST [ ! -z $file_gfid_b0 ] + file_gfid_b1=$(gf_get_gfid_xattr $B0/${V0}1/$file) + file_gfid_b2=$(gf_get_gfid_xattr $B0/${V0}2/$file) + EXPECT $file_gfid_b0 echo $file_gfid_b1 + EXPECT $file_gfid_b0 echo $file_gfid_b2 + + EXPECT "2" stat -c %h $B0/${V0}0/$file + EXPECT "2" stat -c %h $B0/${V0}1/$file + EXPECT "2" stat -c %h $B0/${V0}2/$file +} +TESTS_EXPECTED_IN_LOOP=18 + +################################################################################ +## Start and create a volume +TEST glusterd; +TEST pidof glusterd; +TEST $CLI volume info; + +TEST $CLI volume create $V0 replica 3 $H0:$B0/${V0}{0,1,2}; +TEST $CLI volume start $V0; +TEST $CLI volume set $V0 cluster.heal-timeout 5 +TEST $CLI volume heal $V0 disable +EXPECT 'Started' volinfo_field $V0 'Status'; +TEST $GFS --volfile-id=/$V0 --volfile-server=$H0 $M0 + +TEST mkdir $M0/dir +TEST `echo "File 1 " > $M0/dir/file1` +TEST touch $M0/dir/file{2..4} + +# Remove file2 from 1st & 3rd bricks +TEST rm -f $B0/$V0"0"/dir/file2 +TEST rm -f $B0/$V0"2"/dir/file2 + +# Remove file3 and the .glusterfs hardlink from 1st & 2nd bricks +gfid_file3=$(gf_get_gfid_xattr $B0/$V0"0"/dir/file3) +gfid_str_file3=$(gf_gfid_xattr_to_str $gfid_file3) +TEST rm $B0/$V0"0"/.glusterfs/${gfid_str_file3:0:2}/${gfid_str_file3:2:2}/$gfid_str_file3 +TEST rm $B0/$V0"1"/.glusterfs/${gfid_str_file3:0:2}/${gfid_str_file3:2:2}/$gfid_str_file3 +TEST rm -f $B0/$V0"0"/dir/file3 +TEST rm -f $B0/$V0"1"/dir/file3 + +# Remove the .glusterfs hardlink and the gfid xattr of file4 on 3rd brick +gfid_file4=$(gf_get_gfid_xattr $B0/$V0"0"/dir/file4) +gfid_str_file4=$(gf_gfid_xattr_to_str $gfid_file4) +TEST rm $B0/$V0"2"/.glusterfs/${gfid_str_file4:0:2}/${gfid_str_file4:2:2}/$gfid_str_file4 +TEST setfattr -x trusted.gfid $B0/$V0"2"/dir/file4 + +# B0 and B2 blame each other +setfattr -n trusted.afr.$V0-client-0 -v 0x000000000000000000000001 $B0/$V0"2"/dir +setfattr -n trusted.afr.$V0-client-2 -v 0x000000000000000000000001 $B0/$V0"0"/dir + +# Add entry to xattrop dir on first brick. +xattrop_dir0=$(afr_get_index_path $B0/$V0"0") +base_entry_b0=`ls $xattrop_dir0` +gfid_str=$(gf_gfid_xattr_to_str $(gf_get_gfid_xattr $B0/$V0"0"/dir/)) +TEST ln $xattrop_dir0/$base_entry_b0 $xattrop_dir0/$gfid_str + +EXPECT "^1$" get_pending_heal_count $V0 + +# Launch heal +TEST $CLI volume heal $V0 enable +EXPECT_WITHIN $PROCESS_UP_TIMEOUT "^Y$" glustershd_up_status +EXPECT_WITHIN $CHILD_UP_TIMEOUT "^1$" afr_child_up_status_in_shd $V0 0 +EXPECT_WITHIN $CHILD_UP_TIMEOUT "^1$" afr_child_up_status_in_shd $V0 1 +EXPECT_WITHIN $CHILD_UP_TIMEOUT "^1$" afr_child_up_status_in_shd $V0 2 +TEST $CLI volume heal $V0 +EXPECT_WITHIN $HEAL_TIMEOUT "^0$" get_pending_heal_count $V0 + +# All the files must be present on all the bricks after conservative merge and +# should have the gfid xattr and the .glusterfs hardlink. +check_gfid_and_link_count dir/file1 +check_gfid_and_link_count dir/file2 +check_gfid_and_link_count dir/file3 +check_gfid_and_link_count dir/file4 + +cleanup diff --git a/tests/bugs/replicate/bug-1756938-replica-3-sbrain-cli.t b/tests/bugs/replicate/bug-1756938-replica-3-sbrain-cli.t new file mode 100644 index 00000000000..c1bdf34ee6d --- /dev/null +++ b/tests/bugs/replicate/bug-1756938-replica-3-sbrain-cli.t @@ -0,0 +1,111 @@ +#!/bin/bash + +. $(dirname $0)/../../include.rc +. $(dirname $0)/../../volume.rc +. $(dirname $0)/../../afr.rc + +cleanup; + +TEST glusterd; +TEST pidof glusterd; +TEST $CLI volume create $V0 replica 3 $H0:$B0/${V0}{0,1,2} +TEST $CLI volume set $V0 features.shard enable +TEST $CLI volume set $V0 features.shard-block-size 4MB + +TEST $CLI volume start $V0 +EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status $V0 $H0 $B0/${V0}0 +EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status $V0 $H0 $B0/${V0}1 +EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status $V0 $H0 $B0/${V0}2 +TEST glusterfs --volfile-server=$H0 --volfile-id=/$V0 $M0 +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 $CHILD_UP_TIMEOUT "1" afr_child_up_status $V0 2 + +#Create split-brain by setting afr xattrs/gfids manually. +#file1 is non-sharded and will be in data split-brain. +#file2 will have one shard which will be in data split-brain. +#file3 will have one shard which will be in gfid split-brain. +#file4 will have one shard which will be in data & metadata split-brain. +TEST dd if=/dev/zero of=$M0/file1 bs=1024 count=1024 oflag=direct +TEST dd if=/dev/zero of=$M0/file2 bs=1M count=6 oflag=direct +TEST dd if=/dev/zero of=$M0/file3 bs=1M count=6 oflag=direct +TEST dd if=/dev/zero of=$M0/file4 bs=1M count=6 oflag=direct +EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0 + +#------------------------------------------------------------------------------- +TEST setfattr -n trusted.afr.$V0-client-1 -v 0x000000010000000000000000 $B0/${V0}0/file1 +TEST setfattr -n trusted.afr.$V0-client-2 -v 0x000000010000000000000000 $B0/${V0}0/file1 +TEST setfattr -n trusted.afr.$V0-client-0 -v 0x000000010000000000000000 $B0/${V0}1/file1 +TEST setfattr -n trusted.afr.$V0-client-2 -v 0x000000010000000000000000 $B0/${V0}1/file1 +TEST setfattr -n trusted.afr.$V0-client-0 -v 0x000000010000000000000000 $B0/${V0}2/file1 +TEST setfattr -n trusted.afr.$V0-client-1 -v 0x000000010000000000000000 $B0/${V0}2/file1 + +#------------------------------------------------------------------------------- +gfid_f2=$(gf_gfid_xattr_to_str $(gf_get_gfid_xattr $B0/${V0}0/file2)) +TEST setfattr -n trusted.afr.$V0-client-1 -v 0x000000010000000000000000 $B0/${V0}0/.shard/$gfid_f2.1 +TEST setfattr -n trusted.afr.$V0-client-2 -v 0x000000010000000000000000 $B0/${V0}0/.shard/$gfid_f2.1 +TEST setfattr -n trusted.afr.$V0-client-0 -v 0x000000010000000000000000 $B0/${V0}1/.shard/$gfid_f2.1 +TEST setfattr -n trusted.afr.$V0-client-2 -v 0x000000010000000000000000 $B0/${V0}1/.shard/$gfid_f2.1 +TEST setfattr -n trusted.afr.$V0-client-0 -v 0x000000010000000000000000 $B0/${V0}2/.shard/$gfid_f2.1 +TEST setfattr -n trusted.afr.$V0-client-1 -v 0x000000010000000000000000 $B0/${V0}2/.shard/$gfid_f2.1 + +#------------------------------------------------------------------------------- +TESTS_EXPECTED_IN_LOOP=5 +function assign_new_gfid { + brickpath=$1 + filename=$2 + gfid=$(gf_gfid_xattr_to_str $(gf_get_gfid_xattr $brickpath/$filename)) + gfid_shard=$(gf_gfid_xattr_to_str $(gf_get_gfid_xattr $brickpath/.shard/$gfid.1)) + + TEST rm $brickpath/.glusterfs/${gfid_shard:0:2}/${gfid_shard:2:2}/$gfid_shard + TEST setfattr -x trusted.gfid $brickpath/.shard/$gfid.1 + new_gfid=$(get_random_gfid) + new_gfid_str=$(gf_gfid_xattr_to_str $new_gfid) + TEST setfattr -n trusted.gfid -v $new_gfid $brickpath/.shard/$gfid.1 + TEST mkdir -p $brickpath/.glusterfs/${new_gfid_str:0:2}/${new_gfid_str:2:2} + TEST ln $brickpath/.shard/$gfid.1 $brickpath/.glusterfs/${new_gfid_str:0:2}/${new_gfid_str:2:2}/$new_gfid_str +} +assign_new_gfid $B0/$V0"1" file3 +assign_new_gfid $B0/$V0"2" file3 + +#------------------------------------------------------------------------------- +gfid_f4=$(gf_gfid_xattr_to_str $(gf_get_gfid_xattr $B0/${V0}0/file4)) +TEST setfattr -n trusted.afr.$V0-client-1 -v 0x000000010000000100000000 $B0/${V0}0/.shard/$gfid_f4.1 +TEST setfattr -n trusted.afr.$V0-client-2 -v 0x000000010000000100000000 $B0/${V0}0/.shard/$gfid_f4.1 +TEST setfattr -n trusted.afr.$V0-client-0 -v 0x000000010000000100000000 $B0/${V0}1/.shard/$gfid_f4.1 +TEST setfattr -n trusted.afr.$V0-client-2 -v 0x000000010000000100000000 $B0/${V0}1/.shard/$gfid_f4.1 +TEST setfattr -n trusted.afr.$V0-client-0 -v 0x000000010000000100000000 $B0/${V0}2/.shard/$gfid_f4.1 +TEST setfattr -n trusted.afr.$V0-client-1 -v 0x000000010000000100000000 $B0/${V0}2/.shard/$gfid_f4.1 + +#------------------------------------------------------------------------------- +#Add entry to xattrop dir on first brick and check for split-brain. +xattrop_dir0=$(afr_get_index_path $B0/$V0"0") +base_entry_b0=`ls $xattrop_dir0` + +gfid_f1=$(gf_gfid_xattr_to_str $(gf_get_gfid_xattr $B0/$V0"0"/file1)) +TEST ln $xattrop_dir0/$base_entry_b0 $xattrop_dir0/$gfid_f1 + +gfid_f2_shard1=$(gf_gfid_xattr_to_str $(gf_get_gfid_xattr $B0/$V0"0"/.shard/$gfid_f2.1)) +TEST ln $xattrop_dir0/$base_entry_b0 $xattrop_dir0/$gfid_f2_shard1 + +gfid_f3=$(gf_gfid_xattr_to_str $(gf_get_gfid_xattr $B0/${V0}0/file3)) +gfid_f3_shard1=$(gf_gfid_xattr_to_str $(gf_get_gfid_xattr $B0/$V0"0"/.shard/$gfid_f3.1)) +TEST ln $xattrop_dir0/$base_entry_b0 $xattrop_dir0/$gfid_f3_shard1 + +gfid_f4_shard1=$(gf_gfid_xattr_to_str $(gf_get_gfid_xattr $B0/$V0"0"/.shard/$gfid_f4.1)) +TEST ln $xattrop_dir0/$base_entry_b0 $xattrop_dir0/$gfid_f4_shard1 + +#------------------------------------------------------------------------------- +#gfid split-brain won't show up in split-brain count. +EXPECT "3" afr_get_split_brain_count $V0 +EXPECT_NOT "^0$" get_pending_heal_count $V0 + +#Resolve split-brains +TEST $CLI volume heal $V0 split-brain source-brick $H0:$B0/${V0}1 /file1 +GFIDSTR="gfid:$gfid_f2_shard1" +TEST $CLI volume heal $V0 split-brain source-brick $H0:$B0/${V0}1 $GFIDSTR +TEST $CLI volume heal $V0 split-brain source-brick $H0:$B0/${V0}1 /.shard/$gfid_f3.1 +TEST $CLI volume heal $V0 split-brain source-brick $H0:$B0/${V0}1 /.shard/$gfid_f4.1 +TEST $CLI volume heal $V0 +EXPECT_WITHIN $HEAL_TIMEOUT "^0$" get_pending_heal_count $V0 +cleanup; diff --git a/tests/bugs/replicate/bug-1761531-metadata-heal-restore-time.t b/tests/bugs/replicate/bug-1761531-metadata-heal-restore-time.t new file mode 100644 index 00000000000..7e24eaec03d --- /dev/null +++ b/tests/bugs/replicate/bug-1761531-metadata-heal-restore-time.t @@ -0,0 +1,74 @@ +#!/bin/bash + +. $(dirname $0)/../../include.rc +. $(dirname $0)/../../volume.rc +. $(dirname $0)/../../afr.rc +cleanup + +GET_MDATA_PATH=$(dirname $0)/../../utils +build_tester $GET_MDATA_PATH/get-mdata-xattr.c + +TEST glusterd +TEST pidof glusterd +TEST $CLI volume create $V0 replica 3 $H0:$B0/brick{0..2} +TEST $CLI volume start $V0 +TEST $GFS --volfile-id=/$V0 --volfile-server=$H0 $M0 +EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 0 +EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 1 +EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 2 + +TEST touch $M0/a +sleep 1 +TEST kill_brick $V0 $H0 $B0/brick0 +TEST touch $M0/a + +EXPECT_WITHIN $HEAL_TIMEOUT "^2$" get_pending_heal_count $V0 + +TEST $CLI volume start $V0 force +EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status $V0 1 +EXPECT_WITHIN $PROCESS_UP_TIMEOUT "Y" glustershd_up_status +EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 0 +EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 1 +EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 2 + +EXPECT_WITHIN $HEAL_TIMEOUT "^0$" get_pending_heal_count $V0 + +mtime0=$(get_mtime $B0/brick0/a) +mtime1=$(get_mtime $B0/brick1/a) +TEST [ $mtime0 -eq $mtime1 ] + +ctime0=$(get_ctime $B0/brick0/a) +ctime1=$(get_ctime $B0/brick1/a) +TEST [ $ctime0 -eq $ctime1 ] + +############################################################################### +# Repeat the test with ctime feature disabled. +TEST $CLI volume set $V0 features.ctime off + +TEST touch $M0/b +sleep 1 +TEST kill_brick $V0 $H0 $B0/brick0 +TEST touch $M0/b + +EXPECT_WITHIN $HEAL_TIMEOUT "^2$" get_pending_heal_count $V0 + +TEST $CLI volume start $V0 force +EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status $V0 1 +EXPECT_WITHIN $PROCESS_UP_TIMEOUT "Y" glustershd_up_status +EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 0 +EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 1 +EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 2 + +EXPECT_WITHIN $HEAL_TIMEOUT "^0$" get_pending_heal_count $V0 + +mtime2=$(get_mtime $B0/brick0/b) +mtime3=$(get_mtime $B0/brick1/b) +TEST [ $mtime2 -eq $mtime3 ] + +TEST rm $GET_MDATA_PATH/get-mdata-xattr + +TEST force_umount $M0 +TEST $CLI volume stop $V0 +TEST $CLI volume delete $V0 + +cleanup diff --git a/tests/bugs/replicate/bug-1801624-entry-heal.t b/tests/bugs/replicate/bug-1801624-entry-heal.t new file mode 100644 index 00000000000..94b465181fa --- /dev/null +++ b/tests/bugs/replicate/bug-1801624-entry-heal.t @@ -0,0 +1,58 @@ +#!/bin/bash + +. $(dirname $0)/../../include.rc +. $(dirname $0)/../../volume.rc +cleanup; + +TEST glusterd +TEST pidof glusterd +TEST $CLI volume create $V0 replica 3 $H0:$B0/brick{0,1,2} +TEST $CLI volume set $V0 heal-timeout 5 +TEST $CLI volume start $V0 +EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 0 +EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 1 +EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 2 +TEST $CLI volume heal $V0 granular-entry-heal enable + +TEST glusterfs --volfile-id=/$V0 --volfile-server=$H0 $M0 --attribute-timeout=0 --entry-timeout=0 +EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 0 +EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 1 +EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 2 +echo "Data">$M0/FILE +ret=$? +TEST [ $ret -eq 0 ] + +# Re-create the file when a brick is down. +TEST kill_brick $V0 $H0 $B0/brick1 +TEST rm $M0/FILE +echo "New Data">$M0/FILE +ret=$? +TEST [ $ret -eq 0 ] +EXPECT_WITHIN $HEAL_TIMEOUT "4" get_pending_heal_count $V0 + +# Launching index heal must not reset parent dir afr xattrs or remove granular entry indices. +$CLI volume heal $V0 # CLI will fail but heal is launched anyway. +TEST sleep 5 # give index heal a chance to do one run. +brick0_pending=$(get_hex_xattr trusted.afr.$V0-client-1 $B0/brick0/) +brick2_pending=$(get_hex_xattr trusted.afr.$V0-client-1 $B0/brick2/) +TEST [ $brick0_pending -eq "000000000000000000000002" ] +TEST [ $brick2_pending -eq "000000000000000000000002" ] +EXPECT "FILE" ls $B0/brick0/.glusterfs/indices/entry-changes/00000000-0000-0000-0000-000000000001/ +EXPECT "FILE" ls $B0/brick2/.glusterfs/indices/entry-changes/00000000-0000-0000-0000-000000000001/ + +TEST $CLI volume start $V0 force +EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status $V0 $H0 $B0/brick1 +EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 1 +$CLI volume heal $V0 +EXPECT_WITHIN $HEAL_TIMEOUT "0" get_pending_heal_count $V0 + +# No gfid-split-brain (i.e. EIO) must be seen. Try on fresh mount to avoid cached values. +EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0 +TEST glusterfs --volfile-id=/$V0 --volfile-server=$H0 $M0 --attribute-timeout=0 --entry-timeout=0 +EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 0 +EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 1 +EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 2 +TEST cat $M0/FILE + +EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0 +cleanup; diff --git a/tests/bugs/replicate/bug-830665.t b/tests/bugs/replicate/bug-830665.t index acebe3ec917..68180424803 100755 --- a/tests/bugs/replicate/bug-830665.t +++ b/tests/bugs/replicate/bug-830665.t @@ -4,6 +4,8 @@ . $(dirname $0)/../../nfs.rc . $(dirname $0)/../../volume.rc +#G_TESTDEF_TEST_STATUS_CENTOS6=NFS_TEST + cleanup; function recreate { diff --git a/tests/bugs/replicate/bug-880898.t b/tests/bugs/replicate/bug-880898.t index 123e7e16425..660d34ca25f 100644 --- a/tests/bugs/replicate/bug-880898.t +++ b/tests/bugs/replicate/bug-880898.t @@ -1,12 +1,19 @@ #!/bin/bash . $(dirname $0)/../../include.rc +. $(dirname $0)/../../volume.rc cleanup; TEST glusterd TEST $CLI volume create $V0 replica 2 $H0:$B0/brick1 $H0:$B0/brick2 TEST $CLI volume start $V0 +EXPECT 'Started' volinfo_field $V0 'Status' +EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status $V0 $H0 $B0/brick1 +EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status $V0 $H0 $B0/brick2 +EXPECT_WITHIN $PROCESS_UP_TIMEOUT "Y" glustershd_up_status +EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 0 +EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 1 pkill glusterfs uuid="" for line in $(cat $GLUSTERD_WORKDIR/glusterd.info) diff --git a/tests/bugs/replicate/bug-977797.t b/tests/bugs/replicate/bug-977797.t index fee82054cc3..9a8f36c956c 100755 --- a/tests/bugs/replicate/bug-977797.t +++ b/tests/bugs/replicate/bug-977797.t @@ -26,8 +26,11 @@ TEST $CLI volume set $V0 quick-read off TEST $CLI volume set $V0 read-ahead off TEST $CLI volume set $V0 write-behind off TEST $CLI volume set $V0 io-cache off +TEST $CLI volume set $V0 cluster.data-self-heal on +TEST $CLI volume set $V0 cluster.metadata-self-heal on +TEST $CLI volume set $V0 cluster.entry-self-heal on -TEST glusterfs --volfile-id=/$V0 --volfile-server=$H0 $M0 --attribute-timeout=0 --entry-timeout=0 +TEST $GFS --volfile-id=/$V0 --volfile-server=$H0 $M0 TEST mkdir -p $M0/a @@ -74,7 +77,7 @@ afr_get_specific_changelog_xattr $B0/$V0"2"/a/file trusted.afr.$V0-client-1 "dat EXPECT_WITHIN $HEAL_TIMEOUT "00000000" \ afr_get_specific_changelog_xattr $B0/$V0"1"/a trusted.afr.$V0-client-0 "entry" -EXPECT_WITHIN HEAL_TIMEOUT "00000000" \ +EXPECT_WITHIN $HEAL_TIMEOUT "00000000" \ afr_get_specific_changelog_xattr $B0/$V0"1"/a trusted.afr.$V0-client-1 "entry" EXPECT_WITHIN $HEAL_TIMEOUT "00000000" \ diff --git a/tests/bugs/replicate/issue-1254-prioritize-enospc.t b/tests/bugs/replicate/issue-1254-prioritize-enospc.t new file mode 100644 index 00000000000..fab94b71b27 --- /dev/null +++ b/tests/bugs/replicate/issue-1254-prioritize-enospc.t @@ -0,0 +1,80 @@ +#!/bin/bash + +. $(dirname $0)/../../include.rc +. $(dirname $0)/../../volume.rc + +cleanup + +function create_bricks { + TEST truncate -s 100M $B0/brick0 + TEST truncate -s 100M $B0/brick1 + TEST truncate -s 20M $B0/brick2 + LO1=`SETUP_LOOP $B0/brick0` + TEST [ $? -eq 0 ] + TEST MKFS_LOOP $LO1 + LO2=`SETUP_LOOP $B0/brick1` + TEST [ $? -eq 0 ] + TEST MKFS_LOOP $LO2 + LO3=`SETUP_LOOP $B0/brick2` + TEST [ $? -eq 0 ] + TEST MKFS_LOOP $LO3 + TEST mkdir -p $B0/${V0}0 $B0/${V0}1 $B0/${V0}2 + TEST MOUNT_LOOP $LO1 $B0/${V0}0 + TEST MOUNT_LOOP $LO2 $B0/${V0}1 + TEST MOUNT_LOOP $LO3 $B0/${V0}2 +} + +function create_files { + local i=1 + while (true) + do + touch $M0/file$i + if [ -e $B0/${V0}2/file$i ]; + then + ((i++)) + else + break + fi + done +} + +TESTS_EXPECTED_IN_LOOP=13 + +#Arbiter volume: Check for ENOSPC when arbiter brick becomes full# +TEST glusterd +create_bricks +TEST $CLI volume create $V0 replica 3 arbiter 1 $H0:$B0/${V0}{0,1,2} +TEST $CLI volume start $V0 +TEST $CLI volume set $V0 performance.write-behind off +TEST $GFS --volfile-server=$H0 --volfile-id=$V0 $M0 + +create_files +TEST kill_brick $V0 $H0 $B0/${V0}1 +error1=$(touch $M0/file-1 2>&1) +EXPECT "No space left on device" echo $error1 +error2=$(mkdir $M0/dir-1 2>&1) +EXPECT "No space left on device" echo $error2 +error3=$((echo "Test" > $M0/file-3) 2>&1) +EXPECT "No space left on device" echo $error3 + +cleanup + +#Replica-3 volume: Check for ENOSPC when one of the brick becomes full# +#Keeping the third brick of lower size to simulate disk full scenario# +TEST glusterd +create_bricks +TEST $CLI volume create $V0 replica 3 $H0:$B0/${V0}{0,1,2} +TEST $CLI volume start $V0 +TEST $CLI volume set $V0 performance.write-behind off +TEST $GFS --volfile-server=$H0 --volfile-id=$V0 $M0 + +create_files +TEST kill_brick $V0 $H0 $B0/${V0}1 +error1=$(touch $M0/file-1 2>&1) +EXPECT "No space left on device" echo $error1 +error2=$(mkdir $M0/dir-1 2>&1) +EXPECT "No space left on device" echo $error2 +error3=$((cat /dev/zero > $M0/file1) 2>&1) +EXPECT "No space left on device" echo $error3 + +cleanup diff --git a/tests/bugs/replicate/mdata-heal-no-xattrs.t b/tests/bugs/replicate/mdata-heal-no-xattrs.t new file mode 100644 index 00000000000..d3b0c504c80 --- /dev/null +++ b/tests/bugs/replicate/mdata-heal-no-xattrs.t @@ -0,0 +1,59 @@ +#!/bin/bash + +. $(dirname $0)/../../include.rc +. $(dirname $0)/../../volume.rc +cleanup; + +TEST glusterd +TEST pidof glusterd +TEST $CLI volume create $V0 replica 3 $H0:$B0/${V0}{0,1,2}; +TEST $CLI volume set $V0 cluster.self-heal-daemon off +TEST $CLI volume start $V0 + +TEST glusterfs --volfile-id=/$V0 --volfile-server=$H0 $M0 --attribute-timeout=0 --entry-timeout=0 +EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 0 +EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 1 +EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 2 +echo "Data">$M0/FILE +ret=$? +TEST [ $ret -eq 0 ] + +# Change permission on brick-0: simulates the case where there is metadata +# mismatch but no pending xattrs. This brick will become the source for heal. +TEST chmod +x $B0/$V0"0"/FILE + +# Add gfid to xattrop +xattrop_b0=$(afr_get_index_path $B0/$V0"0") +base_entry_b0=`ls $xattrop_b0` +gfid_str_FILE=$(gf_gfid_xattr_to_str $(gf_get_gfid_xattr $B0/$V0"0"/FILE)) +TEST ln $xattrop_b0/$base_entry_b0 $xattrop_b0/$gfid_str_FILE +EXPECT_WITHIN $HEAL_TIMEOUT "^1$" get_pending_heal_count $V0 + +TEST $CLI volume set $V0 cluster.self-heal-daemon on +EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 0 +EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 1 +EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 2 +TEST $CLI volume heal $V0 +EXPECT_WITHIN $HEAL_TIMEOUT "^0$" get_pending_heal_count $V0 + +# Brick-0 should contain xattrs blaming other 2 bricks. +# The values will be zero because heal is over. +EXPECT "000000000000000000000000" get_hex_xattr trusted.afr.$V0-client-1 $B0/${V0}0/FILE +EXPECT "000000000000000000000000" get_hex_xattr trusted.afr.$V0-client-2 $B0/${V0}0/FILE +TEST ! getfattr -n trusted.afr.$V0-client-0 $B0/${V0}0/FILE + +# Brick-1 and Brick-2 must not contain any afr xattrs. +TEST ! getfattr -n trusted.afr.$V0-client-0 $B0/${V0}1/FILE +TEST ! getfattr -n trusted.afr.$V0-client-1 $B0/${V0}1/FILE +TEST ! getfattr -n trusted.afr.$V0-client-2 $B0/${V0}1/FILE +TEST ! getfattr -n trusted.afr.$V0-client-0 $B0/${V0}2/FILE +TEST ! getfattr -n trusted.afr.$V0-client-1 $B0/${V0}2/FILE +TEST ! getfattr -n trusted.afr.$V0-client-2 $B0/${V0}2/FILE + +# check permission bits. +EXPECT '755' stat -c %a $B0/${V0}0/FILE +EXPECT '755' stat -c %a $B0/${V0}1/FILE +EXPECT '755' stat -c %a $B0/${V0}2/FILE + +EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0 +cleanup; diff --git a/tests/bugs/replicate/ta-inode-refresh-read.t b/tests/bugs/replicate/ta-inode-refresh-read.t new file mode 100644 index 00000000000..6dd6ff7f163 --- /dev/null +++ b/tests/bugs/replicate/ta-inode-refresh-read.t @@ -0,0 +1,40 @@ +#!/bin/bash + +# Test read transaction inode refresh logic for thin-arbiter. + +. $(dirname $0)/../../include.rc +. $(dirname $0)/../../volume.rc +. $(dirname $0)/../../thin-arbiter.rc +cleanup; +TEST ta_create_brick_and_volfile brick0 +TEST ta_create_brick_and_volfile brick1 +TEST ta_create_ta_and_volfile ta +TEST ta_start_brick_process brick0 +TEST ta_start_brick_process brick1 +TEST ta_start_ta_process ta + +TEST ta_create_mount_volfile brick0 brick1 ta +# Set afr xlator options to choose brick0 as read-subvol. +sed -i '/iam-self-heal-daemon/a \ option read-subvolume-index 0' $B0/mount.vol +TEST [ $? -eq 0 ] +sed -i '/iam-self-heal-daemon/a \ option choose-local false' $B0/mount.vol +TEST [ $? -eq 0 ] + +TEST ta_start_mount_process $M0 +EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" ta_up_status $V0 $M0 0 +EXPECT_WITHIN $PROCESS_UP_TIMEOUT "trusted.afr.patchy-ta-2" ls $B0/ta + +TEST touch $M0/FILE +TEST ls $B0/brick0/FILE +TEST ls $B0/brick1/FILE +TEST ! ls $B0/ta/FILE +TEST setfattr -n user.name -v ravi $M0/FILE + +# Remove gfid hardlink from brick0 which is the read-subvol for FILE. +# This triggers inode refresh up on a getfattr and eventually calls +# afr_ta_read_txn(). Without this patch, afr_ta_read_txn() will again query +# brick0 causing getfattr to fail. +TEST rm -f $(gf_get_gfid_backend_file_path $B0/brick0 FILE) +TEST getfattr -n user.name $M0/FILE + +cleanup; diff --git a/tests/bugs/rpc/bug-1043886.t b/tests/bugs/rpc/bug-1043886.t index b18680289ae..c1ea7a71e8b 100755 --- a/tests/bugs/rpc/bug-1043886.t +++ b/tests/bugs/rpc/bug-1043886.t @@ -3,6 +3,8 @@ . $(dirname $0)/../../include.rc . $(dirname $0)/../../nfs.rc +#G_TESTDEF_TEST_STATUS_CENTOS6=NFS_TEST + cleanup; TEST glusterd diff --git a/tests/bugs/rpc/bug-847624.t b/tests/bugs/rpc/bug-847624.t index 31a63b56a34..fe8fc982887 100755 --- a/tests/bugs/rpc/bug-847624.t +++ b/tests/bugs/rpc/bug-847624.t @@ -3,6 +3,9 @@ . $(dirname $0)/../../include.rc . $(dirname $0)/../../nfs.rc . $(dirname $0)/../../volume.rc + +#G_TESTDEF_TEST_STATUS_CENTOS6=NFS_TEST + cleanup #1 diff --git a/tests/bugs/rpc/bug-921072.t b/tests/bugs/rpc/bug-921072.t index 458996b57bf..ae7eb0101bc 100755 --- a/tests/bugs/rpc/bug-921072.t +++ b/tests/bugs/rpc/bug-921072.t @@ -4,6 +4,8 @@ . $(dirname $0)/../../nfs.rc . $(dirname $0)/../../volume.rc +#G_TESTDEF_TEST_STATUS_CENTOS6=NFS_TEST + cleanup; #1 diff --git a/tests/bugs/rpc/bug-954057.t b/tests/bugs/rpc/bug-954057.t index 65af274f09d..40acdc2fdc7 100755 --- a/tests/bugs/rpc/bug-954057.t +++ b/tests/bugs/rpc/bug-954057.t @@ -25,7 +25,15 @@ TEST $GFS --volfile-id=/$V0 --volfile-server=$H0 $M0 TEST mkdir $M0/dir TEST mkdir $M0/nobody -TEST chown nfsnobody:nfsnobody $M0/nobody +grep nfsnobody /etc/passwd > /dev/null +if [ $? -eq 1 ]; then +usr=nobody +grp=nobody +else +usr=nfsnobody +grp=nfsnobody +fi +TEST chown $usr:$grp $M0/nobody TEST `echo "file" >> $M0/file` TEST cp $M0/file $M0/new TEST chmod 700 $M0/new diff --git a/tests/bugs/shard/bug-1272986.t b/tests/bugs/shard/bug-1272986.t index 762887051fa..66e896ad0c4 100644 --- a/tests/bugs/shard/bug-1272986.t +++ b/tests/bugs/shard/bug-1272986.t @@ -16,16 +16,16 @@ TEST glusterfs --volfile-id=$V0 --volfile-server=$H0 $M0 TEST glusterfs --volfile-id=$V0 --volfile-server=$H0 $M1 # Write some data into a file, such that its size crosses the shard block size. -TEST dd if=/dev/zero of=$M1/file bs=1M count=5 conv=notrunc +TEST dd if=/dev/urandom of=$M1/file bs=1M count=5 conv=notrunc oflag=direct md5sum1_reader=$(md5sum $M0/file | awk '{print $1}') EXPECT "$md5sum1_reader" echo `md5sum $M1/file | awk '{print $1}'` # Append some more data into the file. -TEST `echo "abcdefg" >> $M1/file` +TEST dd if=/dev/urandom of=$M1/file bs=256k count=1 conv=notrunc oflag=direct -md5sum2_reader=$(md5sum $M0/file | awk '{print $1}') +md5sum2_reader=$(dd if=$M0/file iflag=direct bs=256k| md5sum | awk '{print $1}') # Test to see if the reader refreshes its cache correctly as part of the reads # triggered through md5sum. If it does, then the md5sum on the reader and writer diff --git a/tests/bugs/shard/bug-1605056-2.t b/tests/bugs/shard/bug-1605056-2.t new file mode 100644 index 00000000000..a9c10fec3ea --- /dev/null +++ b/tests/bugs/shard/bug-1605056-2.t @@ -0,0 +1,34 @@ +#!/bin/bash + +. $(dirname $0)/../../include.rc +. $(dirname $0)/../../volume.rc + +cleanup + +TEST glusterd +TEST pidof glusterd +TEST $CLI volume create $V0 replica 3 $H0:$B0/${V0}{0,1,2} +TEST $CLI volume set $V0 features.shard on +TEST $CLI volume set $V0 features.shard-block-size 4MB +TEST $CLI volume set $V0 features.shard-lru-limit 25 +TEST $CLI volume set $V0 performance.write-behind off + +TEST $CLI volume start $V0 + +TEST $GFS --volfile-id=$V0 --volfile-server=$H0 $M0 + +# Perform a write that would cause 25 shards to be created under .shard +TEST dd if=/dev/zero of=$M0/foo bs=1M count=104 + +# Write into another file bar to ensure all of foo's shards are evicted from lru list of $M0 +TEST dd if=/dev/zero of=$M0/bar bs=1M count=104 + +# Delete foo from $M0. If there's a bug, the mount will crash. +TEST unlink $M0/foo + +EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0 + +TEST $CLI volume stop $V0 +TEST $CLI volume delete $V0 + +cleanup diff --git a/tests/bugs/shard/bug-1605056.t b/tests/bugs/shard/bug-1605056.t new file mode 100644 index 00000000000..c2329ea79f8 --- /dev/null +++ b/tests/bugs/shard/bug-1605056.t @@ -0,0 +1,63 @@ +#!/bin/bash + +. $(dirname $0)/../../include.rc +. $(dirname $0)/../../volume.rc + +SHARD_COUNT_TIME=5 + +cleanup + +TEST glusterd +TEST pidof glusterd +TEST $CLI volume create $V0 replica 3 $H0:$B0/${V0}{0,1,2} +TEST $CLI volume set $V0 features.shard on +TEST $CLI volume set $V0 features.shard-block-size 4MB +TEST $CLI volume set $V0 features.shard-lru-limit 25 +TEST $CLI volume set $V0 performance.write-behind off + +TEST $CLI volume start $V0 + +TEST $GFS --volfile-id=$V0 --volfile-server=$H0 $M0 +TEST $GFS --volfile-id=$V0 --volfile-server=$H0 $M1 + +# Perform a write that would cause 25 shards to be created under .shard +TEST dd if=/dev/zero of=$M0/foo bs=1M count=104 + +# Read the file from $M1, indirectly filling up the lru list. +TEST `cat $M1/foo > /dev/null` +statedump=$(generate_mount_statedump $V0 $M1) +sleep 1 +EXPECT "25" echo $(grep "inode-count" $statedump | cut -f2 -d'=' | tail -1) +rm -f $statedump + +# Delete foo from $M0. +TEST unlink $M0/foo + +# Send stat on foo from $M1 to force $M1 to "forget" inode associated with foo. +# Now the ghost shards associated with "foo" are still in lru list of $M1. +TEST ! stat $M1/foo + +# Let's force the ghost shards of "foo" out of lru list by looking up more shards +# through I/O on a file named "bar" from $M1. This should crash if the base inode +# had been destroyed by now. + +TEST dd if=/dev/zero of=$M1/bar bs=1M count=104 + +############################################### +#### Now for some inode ref-leak tests ... #### +############################################### + +# Expect there to be 29 active inodes - 26 belonging to "bar", 1 for .shard, +# 1 for .shard/remove_me and 1 for '/' +EXPECT_WITHIN $SHARD_COUNT_TIME `expr 26 + 3` get_mount_active_size_value $V0 $M1 + +TEST rm -f $M1/bar +EXPECT_WITHIN $SHARD_COUNT_TIME 3 get_mount_active_size_value $V0 $M1 + +EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0 +EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M1 + +TEST $CLI volume stop $V0 +TEST $CLI volume delete $V0 + +cleanup diff --git a/tests/bugs/shard/bug-1669077.t b/tests/bugs/shard/bug-1669077.t new file mode 100644 index 00000000000..8d3a67a36be --- /dev/null +++ b/tests/bugs/shard/bug-1669077.t @@ -0,0 +1,29 @@ +#!/bin/bash + +. $(dirname $0)/../../include.rc +. $(dirname $0)/../../volume.rc + +SHARD_COUNT_TIME=5 + +cleanup + +TEST glusterd +TEST pidof glusterd +TEST $CLI volume create $V0 replica 3 $H0:$B0/${V0}{0,1,2} +TEST $CLI volume set $V0 features.shard on +TEST $CLI volume set $V0 features.shard-block-size 4MB +TEST $CLI volume set $V0 features.shard-lru-limit 25 + +TEST $CLI volume start $V0 + +TEST $GFS --volfile-id=$V0 --volfile-server=$H0 $M0 + +# If the bug still exists, client should crash during fallocate below +TEST fallocate -l 200M $M0/foo + +EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0 + +TEST $CLI volume stop $V0 +TEST $CLI volume delete $V0 + +cleanup diff --git a/tests/bugs/shard/bug-1696136-lru-limit-equals-deletion-rate.t b/tests/bugs/shard/bug-1696136-lru-limit-equals-deletion-rate.t new file mode 100644 index 00000000000..3e4a65af19a --- /dev/null +++ b/tests/bugs/shard/bug-1696136-lru-limit-equals-deletion-rate.t @@ -0,0 +1,34 @@ +#!/bin/bash + +. $(dirname $0)/../../include.rc +. $(dirname $0)/../../volume.rc +. $(dirname $0)/../../fallocate.rc + +cleanup + +TEST glusterd +TEST pidof glusterd +TEST $CLI volume create $V0 replica 3 $H0:$B0/${V0}{0,1,2} +TEST $CLI volume set $V0 features.shard on +TEST $CLI volume set $V0 features.shard-block-size 4MB +TEST $CLI volume set $V0 features.shard-lru-limit 120 +TEST $CLI volume set $V0 features.shard-deletion-rate 120 +TEST $CLI volume set $V0 performance.write-behind off +TEST $CLI volume start $V0 + +TEST $GFS --volfile-id=$V0 --volfile-server=$H0 $M0 + +TEST build_tester $(dirname $0)/bug-1696136.c -lgfapi -Wall -O2 + +# Create a file +TEST touch $M0/file1 + +# Fallocate a 500M file. This will make sure number of participant shards are > lru-limit +TEST $(dirname $0)/bug-1696136 $H0 $V0 "0" "0" "536870912" /file1 `gluster --print-logdir`/glfs-$V0.log + +EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0 +TEST $CLI volume stop $V0 +TEST $CLI volume delete $V0 +rm -f $(dirname $0)/bug-1696136 + +cleanup diff --git a/tests/bugs/shard/bug-1696136.c b/tests/bugs/shard/bug-1696136.c new file mode 100644 index 00000000000..cb650535b09 --- /dev/null +++ b/tests/bugs/shard/bug-1696136.c @@ -0,0 +1,122 @@ +#define _GNU_SOURCE +#include <fcntl.h> +#include <stdio.h> +#include <stdlib.h> +#include <glusterfs/api/glfs.h> +#include <glusterfs/api/glfs-handles.h> + +enum fallocate_flag { + TEST_FALLOCATE_NONE, + TEST_FALLOCATE_KEEP_SIZE, + TEST_FALLOCATE_ZERO_RANGE, + TEST_FALLOCATE_PUNCH_HOLE, + TEST_FALLOCATE_MAX, +}; + +int +get_fallocate_flag(int opcode) +{ + int ret = 0; + + switch (opcode) { + case TEST_FALLOCATE_NONE: + ret = 0; + break; + case TEST_FALLOCATE_KEEP_SIZE: + ret = FALLOC_FL_KEEP_SIZE; + break; + case TEST_FALLOCATE_ZERO_RANGE: + ret = FALLOC_FL_ZERO_RANGE; + break; + case TEST_FALLOCATE_PUNCH_HOLE: + ret = FALLOC_FL_PUNCH_HOLE; + break; + default: + ret = -1; + break; + } + return ret; +} + +int +main(int argc, char *argv[]) +{ + int ret = 1; + int opcode = -1; + off_t offset = 0; + size_t len = 0; + glfs_t *fs = NULL; + glfs_fd_t *fd = NULL; + + if (argc != 8) { + fprintf(stderr, + "Syntax: %s <host> <volname> <opcode> <offset> <len> " + "<file-path> <log-file>\n", + argv[0]); + return 1; + } + + fs = glfs_new(argv[2]); + if (!fs) { + fprintf(stderr, "glfs_new: returned NULL\n"); + return 1; + } + + ret = glfs_set_volfile_server(fs, "tcp", argv[1], 24007); + if (ret != 0) { + fprintf(stderr, "glfs_set_volfile_server: returned %d\n", ret); + goto out; + } + + ret = glfs_set_logging(fs, argv[7], 7); + if (ret != 0) { + fprintf(stderr, "glfs_set_logging: returned %d\n", ret); + goto out; + } + + ret = glfs_init(fs); + if (ret != 0) { + fprintf(stderr, "glfs_init: returned %d\n", ret); + goto out; + } + + opcode = atoi(argv[3]); + opcode = get_fallocate_flag(opcode); + if (opcode < 0) { + fprintf(stderr, "get_fallocate_flag: invalid flag \n"); + goto out; + } + + /* Note that off_t is signed but size_t isn't. */ + offset = strtol(argv[4], NULL, 10); + len = strtoul(argv[5], NULL, 10); + + fd = glfs_open(fs, argv[6], O_RDWR); + if (fd == NULL) { + fprintf(stderr, "glfs_open: returned NULL\n"); + goto out; + } + + ret = glfs_fallocate(fd, opcode, offset, len); + if (ret < 0) { + fprintf(stderr, "glfs_fallocate: returned %d\n", ret); + goto out; + } + + ret = glfs_unlink(fs, argv[6]); + if (ret < 0) { + fprintf(stderr, "glfs_unlink: returned %d\n", ret); + goto out; + } + /* Sleep for 3s to give enough time for background deletion to complete + * during which if the bug exists, the process will crash. + */ + sleep(3); + ret = 0; + +out: + if (fd) + glfs_close(fd); + glfs_fini(fs); + return ret; +} diff --git a/tests/bugs/shard/bug-1696136.t b/tests/bugs/shard/bug-1696136.t new file mode 100644 index 00000000000..b6dc858f083 --- /dev/null +++ b/tests/bugs/shard/bug-1696136.t @@ -0,0 +1,33 @@ +#!/bin/bash + +. $(dirname $0)/../../include.rc +. $(dirname $0)/../../volume.rc +. $(dirname $0)/../../fallocate.rc + +cleanup + +TEST glusterd +TEST pidof glusterd +TEST $CLI volume create $V0 replica 3 $H0:$B0/${V0}{0,1,2} +TEST $CLI volume set $V0 features.shard on +TEST $CLI volume set $V0 features.shard-block-size 4MB +TEST $CLI volume set $V0 features.shard-lru-limit 120 +TEST $CLI volume set $V0 performance.write-behind off +TEST $CLI volume start $V0 + +TEST $GFS --volfile-id=$V0 --volfile-server=$H0 $M0 + +TEST build_tester $(dirname $0)/bug-1696136.c -lgfapi -Wall -O2 + +# Create a file +TEST touch $M0/file1 + +# Fallocate a 500M file. This will make sure number of participant shards are > lru-limit +TEST $(dirname $0)/bug-1696136 $H0 $V0 "0" "0" "536870912" /file1 `gluster --print-logdir`/glfs-$V0.log + +EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0 +TEST $CLI volume stop $V0 +TEST $CLI volume delete $V0 +rm -f $(dirname $0)/bug-1696136 + +cleanup diff --git a/tests/bugs/shard/bug-1705884.t b/tests/bugs/shard/bug-1705884.t new file mode 100644 index 00000000000..f6e50376a58 --- /dev/null +++ b/tests/bugs/shard/bug-1705884.t @@ -0,0 +1,32 @@ +#!/bin/bash + +. $(dirname $0)/../../include.rc +. $(dirname $0)/../../volume.rc +. $(dirname $0)/../../fallocate.rc + +cleanup + +require_fallocate -l 1m $M0/file + +TEST glusterd +TEST pidof glusterd +TEST $CLI volume create $V0 replica 3 $H0:$B0/${V0}{0,1,2} +TEST $CLI volume set $V0 features.shard on +TEST $CLI volume set $V0 performance.write-behind off +TEST $CLI volume set $V0 performance.stat-prefetch off +TEST $CLI volume start $V0 + +TEST $GFS --volfile-id=$V0 --volfile-server=$H0 $M0 + +TEST fallocate -l 200M $M0/foo +EXPECT `echo "$(( ( 200 * 1024 * 1024 ) / 512 ))"` stat -c %b $M0/foo +TEST truncate -s 0 $M0/foo +EXPECT "0" stat -c %b $M0/foo +TEST fallocate -l 100M $M0/foo +EXPECT `echo "$(( ( 100 * 1024 * 1024 ) / 512 ))"` stat -c %b $M0/foo + +EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0 +TEST $CLI volume stop $V0 +TEST $CLI volume delete $V0 + +cleanup diff --git a/tests/bugs/shard/bug-1738419.t b/tests/bugs/shard/bug-1738419.t new file mode 100644 index 00000000000..8d0a31d9754 --- /dev/null +++ b/tests/bugs/shard/bug-1738419.t @@ -0,0 +1,29 @@ +#!/bin/bash + +. $(dirname $0)/../../include.rc +. $(dirname $0)/../../volume.rc + +cleanup + +TEST glusterd +TEST pidof glusterd +TEST $CLI volume create $V0 replica 3 $H0:$B0/${V0}{0,1,2} +TEST $CLI volume set $V0 features.shard on +TEST $CLI volume set $V0 network.remote-dio off +TEST $CLI volume set $V0 performance.io-cache off +TEST $CLI volume set $V0 performance.quick-read off +TEST $CLI volume set $V0 performance.read-ahead off +TEST $CLI volume set $V0 performance.strict-o-direct on +TEST $CLI volume start $V0 + +TEST $GFS --volfile-id=$V0 --volfile-server=$H0 $M0 + +TEST dd if=/dev/zero of=$M0/metadata bs=501 count=1 + +EXPECT "501" echo $("dd" if=$M0/metadata bs=4096 count=1 of=/dev/null iflag=direct 2>&1 | awk '/bytes/ {print $1}') + +EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0 +TEST $CLI volume stop $V0 +TEST $CLI volume delete $V0 + +cleanup diff --git a/tests/bugs/shard/bug-shard-discard.c b/tests/bugs/shard/bug-shard-discard.c index 645bacf7d83..6fa93fb89d1 100644 --- a/tests/bugs/shard/bug-shard-discard.c +++ b/tests/bugs/shard/bug-shard-discard.c @@ -4,63 +4,67 @@ #include <glusterfs/api/glfs-handles.h> int -main (int argc, char *argv[]) +main(int argc, char *argv[]) { - int ret = 0; - off_t off = 0; - size_t len = 0; - glfs_t *fs = NULL; - glfs_fd_t *fd = NULL; + int ret = 0; + off_t off = 0; + size_t len = 0; + glfs_t *fs = NULL; + glfs_fd_t *fd = NULL; - if (argc != 7) { - fprintf (stderr, "Syntax: %s <host> <volname> <file-path> <off> <len> <log-file>\n", argv[0]); - return 1; - } + if (argc != 7) { + fprintf( + stderr, + "Syntax: %s <host> <volname> <file-path> <off> <len> <log-file>\n", + argv[0]); + return 1; + } - fs = glfs_new (argv[2]); - if (!fs) { - fprintf (stderr, "glfs_new: returned NULL\n"); - return 1; - } + fs = glfs_new(argv[2]); + if (!fs) { + fprintf(stderr, "glfs_new: returned NULL\n"); + return 1; + } - ret = glfs_set_volfile_server (fs, "tcp", argv[1], 24007); - if (ret != 0) { - fprintf (stderr, "glfs_set_volfile_server: retuned %d\n", ret); - goto out; - } + ret = glfs_set_volfile_server(fs, "tcp", argv[1], 24007); + if (ret != 0) { + fprintf(stderr, "glfs_set_volfile_server: returned %d\n", ret); + goto out; + } - ret = glfs_set_logging (fs, argv[6], 7); - if (ret != 0) { - fprintf (stderr, "glfs_set_logging: returned %d\n", ret); - goto out; - } + ret = glfs_set_logging(fs, argv[6], 7); + if (ret != 0) { + fprintf(stderr, "glfs_set_logging: returned %d\n", ret); + goto out; + } - ret = glfs_init (fs); - if (ret != 0) { - fprintf (stderr, "glfs_init: returned %d\n", ret); - goto out; - } + ret = glfs_init(fs); + if (ret != 0) { + fprintf(stderr, "glfs_init: returned %d\n", ret); + goto out; + } - fd = glfs_open (fs, argv[3], O_RDWR); - if (fd == NULL) { - fprintf (stderr, "glfs_open: returned NULL\n"); - goto out; - } + fd = glfs_open(fs, argv[3], O_RDWR); + if (fd == NULL) { + fprintf(stderr, "glfs_open: returned NULL\n"); + goto out; + } - off = atoi (argv[4]); - len = atoi (argv[5]); + /* Note that off_t is signed but size_t isn't. */ + off = strtol(argv[4], NULL, 10); + len = strtoul(argv[5], NULL, 10); - ret = glfs_discard (fd, off, len); - if (ret <= 0) { - fprintf (stderr, "glfs_discard: returned %d\n", ret); - goto out; - } + ret = glfs_discard(fd, off, len); + if (ret <= 0) { + fprintf(stderr, "glfs_discard: returned %d\n", ret); + goto out; + } - ret = 0; + ret = 0; out: - if (fd) - glfs_close (fd); - glfs_fini (fs); - return ret; + if (fd) + glfs_close(fd); + glfs_fini(fs); + return ret; } diff --git a/tests/bugs/shard/bug-shard-zerofill.c b/tests/bugs/shard/bug-shard-zerofill.c index 838a656b3bb..ed4c8c54dc2 100644 --- a/tests/bugs/shard/bug-shard-zerofill.c +++ b/tests/bugs/shard/bug-shard-zerofill.c @@ -3,57 +3,58 @@ #include <glusterfs/api/glfs-handles.h> int -main (int argc, char *argv[]) +main(int argc, char *argv[]) { - glfs_t *fs = NULL; - glfs_fd_t *fd = NULL; - int ret = 1; - - if (argc != 5) { - fprintf (stderr, "Syntax: %s <host> <volname> <file-path> <log-file>\n", argv[0]); - return 1; - } - - fs = glfs_new (argv[2]); - if (!fs) { - fprintf (stderr, "glfs_new: returned NULL\n"); - return 1; - } - - ret = glfs_set_volfile_server (fs, "tcp", argv[1], 24007); - if (ret != 0) { - fprintf (stderr, "glfs_set_volfile_server: retuned %d\n", ret); - goto out; - } - ret = glfs_set_logging (fs, argv[4], 7); - if (ret != 0) { - fprintf (stderr, "glfs_set_logging: returned %d\n", ret); - goto out; - } - ret = glfs_init (fs); - if (ret != 0) { - fprintf (stderr, "glfs_init: returned %d\n", ret); - goto out; - } - - fd = glfs_open (fs, argv[3], O_RDWR); - if (fd == NULL) { - fprintf (stderr, "glfs_open: returned NULL\n"); - goto out; - } - - /* Zero-fill "foo" with 10MB of data */ - ret = glfs_zerofill (fd, 0, 10485760); - if (ret <= 0) { - fprintf (stderr, "glfs_zerofill: returned %d\n", ret); - goto out; - } - - ret = 0; + glfs_t *fs = NULL; + glfs_fd_t *fd = NULL; + int ret = 1; + + if (argc != 5) { + fprintf(stderr, "Syntax: %s <host> <volname> <file-path> <log-file>\n", + argv[0]); + return 1; + } + + fs = glfs_new(argv[2]); + if (!fs) { + fprintf(stderr, "glfs_new: returned NULL\n"); + return 1; + } + + ret = glfs_set_volfile_server(fs, "tcp", argv[1], 24007); + if (ret != 0) { + fprintf(stderr, "glfs_set_volfile_server: returned %d\n", ret); + goto out; + } + ret = glfs_set_logging(fs, argv[4], 7); + if (ret != 0) { + fprintf(stderr, "glfs_set_logging: returned %d\n", ret); + goto out; + } + ret = glfs_init(fs); + if (ret != 0) { + fprintf(stderr, "glfs_init: returned %d\n", ret); + goto out; + } + + fd = glfs_open(fs, argv[3], O_RDWR); + if (fd == NULL) { + fprintf(stderr, "glfs_open: returned NULL\n"); + goto out; + } + + /* Zero-fill "foo" with 10MB of data */ + ret = glfs_zerofill(fd, 0, 10485760); + if (ret <= 0) { + fprintf(stderr, "glfs_zerofill: returned %d\n", ret); + goto out; + } + + ret = 0; out: - if (fd) - glfs_close(fd); - glfs_fini (fs); - return ret; + if (fd) + glfs_close(fd); + glfs_fini(fs); + return ret; } diff --git a/tests/bugs/shard/configure-lru-limit.t b/tests/bugs/shard/configure-lru-limit.t new file mode 100644 index 00000000000..923a4d8d747 --- /dev/null +++ b/tests/bugs/shard/configure-lru-limit.t @@ -0,0 +1,52 @@ +#!/bin/bash + +. $(dirname $0)/../../include.rc +. $(dirname $0)/../../volume.rc +cleanup + +TEST glusterd +TEST pidof glusterd +TEST $CLI volume create $V0 replica 3 $H0:$B0/${V0}{0,1,2} +TEST $CLI volume set $V0 features.shard on +TEST $CLI volume set $V0 features.shard-block-size 4MB +TEST $CLI volume set $V0 features.shard-lru-limit 25 +TEST $CLI volume start $V0 +EXPECT 'Started' volinfo_field $V0 'Status'; +EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status $V0 $H0 $B0/${V0}0 +EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status $V0 $H0 $B0/${V0}1 +EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status $V0 $H0 $B0/${V0}2 + +TEST $GFS --volfile-id=$V0 --volfile-server=$H0 $M0 + +# Perform a write that would cause 25 shards to be created, 24 of them under .shard +TEST dd if=/dev/zero of=$M0/foo bs=1M count=100 + +statedump=$(generate_mount_statedump $V0) +sleep 1 +EXPECT "25" echo $(grep "lru-max-limit" $statedump | cut -f2 -d'=' | tail -1) + +# Base shard is never added to this list. So all other shards should make up for 24 inodes in lru list +EXPECT "24" echo $(grep "inode-count" $statedump | cut -f2 -d'=' | tail -1) + +rm -f $statedump + +# Test to ensure there's no "reconfiguration" of the value once set. +TEST $CLI volume set $V0 features.shard-lru-limit 30 +statedump=$(generate_mount_statedump $V0) +sleep 1 +EXPECT "25" echo $(grep "lru-max-limit" $statedump | cut -f2 -d'=' | tail -1) +rm -f $statedump + +EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0 + +TEST $GFS --volfile-id=$V0 --volfile-server=$H0 $M0 +statedump=$(generate_mount_statedump $V0) +sleep 1 +EXPECT "30" echo $(grep "lru-max-limit" $statedump | cut -f2 -d'=' | tail -1) +rm -f $statedump + +EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0 +TEST $CLI volume stop $V0 +TEST $CLI volume delete $V0 + +cleanup diff --git a/tests/bugs/shard/issue-1243.t b/tests/bugs/shard/issue-1243.t new file mode 100644 index 00000000000..ba22d2b74fe --- /dev/null +++ b/tests/bugs/shard/issue-1243.t @@ -0,0 +1,43 @@ +#!/bin/bash + +. $(dirname $0)/../../include.rc +. $(dirname $0)/../../volume.rc + +cleanup; + +TEST glusterd +TEST pidof glusterd +TEST $CLI volume create $V0 $H0:$B0/${V0}{0,1} +TEST $CLI volume set $V0 features.shard on +TEST $CLI volume set $V0 features.shard-block-size 4MB +TEST $CLI volume set $V0 performance.quick-read off +TEST $CLI volume set $V0 performance.io-cache off +TEST $CLI volume set $V0 performance.read-ahead off +TEST $CLI volume set $V0 performance.strict-o-direct on +TEST $CLI volume start $V0 + +TEST $GFS --volfile-id=$V0 --volfile-server=$H0 $M0 + +TEST $CLI volume set $V0 md-cache-timeout 10 + +# Write data into a file such that its size crosses shard-block-size +TEST dd if=/dev/zero of=$M0/foo bs=1048576 count=8 oflag=direct + +EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0 +TEST $GFS --volfile-id=$V0 --volfile-server=$H0 $M0 + +# Execute a setxattr on the file. +TEST setfattr -n trusted.libvirt -v some-value $M0/foo + +# Size of the file should be the aggregated size, not the shard-block-size +EXPECT '8388608' stat -c %s $M0/foo + +EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0 +TEST $GFS --volfile-id=$V0 --volfile-server=$H0 $M0 + +# Execute a removexattr on the file. +TEST setfattr -x trusted.libvirt $M0/foo + +# Size of the file should be the aggregated size, not the shard-block-size +EXPECT '8388608' stat -c %s $M0/foo +cleanup diff --git a/tests/bugs/shard/issue-1281.t b/tests/bugs/shard/issue-1281.t new file mode 100644 index 00000000000..9704caa8944 --- /dev/null +++ b/tests/bugs/shard/issue-1281.t @@ -0,0 +1,34 @@ +#!/bin/bash + +. $(dirname $0)/../../include.rc + +cleanup; + +TEST glusterd +TEST pidof glusterd +TEST $CLI volume create $V0 $H0:$B0/${V0}{0,1} +TEST $CLI volume set $V0 features.shard on +TEST $CLI volume set $V0 performance.quick-read off +TEST $CLI volume set $V0 performance.io-cache off +TEST $CLI volume set $V0 performance.read-ahead off +TEST $CLI volume set $V0 performance.write-behind off +TEST $CLI volume start $V0 + +TEST $GFS --volfile-id=$V0 --volfile-server=$H0 $M0 + +#Open a file and store descriptor in fd = 5 +exec 5>$M0/foo + +#Unlink the same file which is opened in prev step +TEST unlink $M0/foo + +#Write something on the file using the open fd = 5 +echo "issue-1281" >&5 + +#Write on the descriptor should be succesful +EXPECT 0 echo $? + +#Close the fd = 5 +exec 5>&- + +cleanup diff --git a/tests/bugs/shard/issue-1425.t b/tests/bugs/shard/issue-1425.t new file mode 100644 index 00000000000..bbe82c0e5b2 --- /dev/null +++ b/tests/bugs/shard/issue-1425.t @@ -0,0 +1,45 @@ +#!/bin/bash + +. $(dirname $0)/../../include.rc +. $(dirname $0)/../../volume.rc + +cleanup; + +FILE_COUNT_TIME=5 + +function get_file_count { + ls $1* | wc -l +} + +TEST glusterd +TEST pidof glusterd +TEST $CLI volume create $V0 $H0:$B0/${V0}0 +TEST $CLI volume set $V0 features.shard on +TEST $CLI volume set $V0 features.shard-block-size 4MB +TEST $CLI volume start $V0 +TEST $CLI volume profile $V0 start + +TEST $GFS --volfile-id=$V0 --volfile-server=$H0 $M0 + +TEST fallocate -l 20M $M0/foo +gfid_new=$(get_gfid_string $M0/foo) + +# Check for the base shard +TEST stat $M0/foo +TEST stat $B0/${V0}0/foo + +# There should be 4 associated shards +EXPECT_WITHIN $FILE_COUNT_TIME 4 get_file_count $B0/${V0}0/.shard/$gfid_new + +# There should be 1+4 shards and we expect 4 lookups less than on the build without this patch +EXPECT "21" echo `$CLI volume profile $V0 info incremental | grep -w LOOKUP | awk '{print $8}'` + +# Delete the base shard and check shards get cleaned up +TEST unlink $M0/foo + +TEST ! stat $M0/foo +TEST ! stat $B0/${V0}0/foo + +# There should be no shards now +EXPECT_WITHIN $FILE_COUNT_TIME 0 get_file_count $B0/${V0}0/.shard/$gfid_new +cleanup diff --git a/tests/bugs/shard/shard-append-test.c b/tests/bugs/shard/shard-append-test.c index 92dff3d078d..c7debb2b182 100644 --- a/tests/bugs/shard/shard-append-test.c +++ b/tests/bugs/shard/shard-append-test.c @@ -10,9 +10,10 @@ #include <glusterfs/api/glfs.h> #include <glusterfs/api/glfs-handles.h> -#define LOG_ERR(msg) do { \ - fprintf (stderr, "%s : Error (%s)\n", msg, strerror (errno)); \ - } while (0) +#define LOG_ERR(msg) \ + do { \ + fprintf(stderr, "%s : Error (%s)\n", msg, strerror(errno)); \ + } while (0) /*This test tests that shard xlator handles offset in appending writes * correctly. This test performs writes of 1025 bytes 1025 times, in 5 threads @@ -26,154 +27,157 @@ pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER; int thread_data = '1'; glfs_t * -init_glfs (const char *hostname, const char *volname, - const char *logfile) +init_glfs(const char *hostname, const char *volname, const char *logfile) { - int ret = -1; - glfs_t *fs = NULL; + int ret = -1; + glfs_t *fs = NULL; - fs = glfs_new (volname); - if (!fs) { - LOG_ERR ("glfs_new failed"); - return NULL; - } - - ret = glfs_set_volfile_server (fs, "tcp", hostname, 24007); - if (ret < 0) { - LOG_ERR ("glfs_set_volfile_server failed"); - goto out; - } - - ret = glfs_set_logging (fs, logfile, 7); - if (ret < 0) { - LOG_ERR ("glfs_set_logging failed"); - goto out; - } - - ret = glfs_init (fs); - if (ret < 0) { - LOG_ERR ("glfs_init failed"); - goto out; - } - - ret = 0; + fs = glfs_new(volname); + if (!fs) { + LOG_ERR("glfs_new failed"); + return NULL; + } + + ret = glfs_set_volfile_server(fs, "tcp", hostname, 24007); + if (ret < 0) { + LOG_ERR("glfs_set_volfile_server failed"); + goto out; + } + + ret = glfs_set_logging(fs, logfile, 7); + if (ret < 0) { + LOG_ERR("glfs_set_logging failed"); + goto out; + } + + ret = glfs_init(fs); + if (ret < 0) { + LOG_ERR("glfs_init failed"); + goto out; + } + + ret = 0; out: - if (ret) { - glfs_fini (fs); - fs = NULL; - } + if (ret) { + glfs_fini(fs); + fs = NULL; + } - return fs; + return fs; } -void* -write_data (void *data) +void * +write_data(void *data) { - char buf[1025] = {0}; - glfs_fd_t *glfd = NULL; - glfs_t *fs = data; - int i = 0; - - pthread_mutex_lock (&lock); - { - memset(buf, thread_data, sizeof(buf)); - thread_data++; + char buf[1025] = {0}; + glfs_fd_t *glfd = NULL; + glfs_t *fs = data; + int i = 0; + + pthread_mutex_lock(&lock); + { + memset(buf, thread_data, sizeof(buf)); + thread_data++; + } + pthread_mutex_unlock(&lock); + + for (i = 0; i < 1025; i++) { + glfd = glfs_creat(fs, "parallel-write.txt", O_WRONLY | O_APPEND, + S_IRUSR | S_IWUSR | O_SYNC); + if (!glfd) { + LOG_ERR("Failed to create file"); + exit(1); } - pthread_mutex_unlock (&lock); - - for (i = 0; i < 1025; i++) { - glfd = glfs_creat(fs, "parallel-write.txt", O_WRONLY | O_APPEND, - S_IRUSR | S_IWUSR | O_SYNC); - if (!glfd) { - LOG_ERR ("Failed to create file"); - exit(1); - } - - if (glfs_write (glfd, buf, sizeof(buf), 0) < 0) { - LOG_ERR ("Failed to write to file"); - exit(1); - } - if (glfs_close(glfd) != 0) { - LOG_ERR ("Failed to close file"); - exit(1); - } + + if (glfs_write(glfd, buf, sizeof(buf), 0) < 0) { + LOG_ERR("Failed to write to file"); + exit(1); } - return NULL; + if (glfs_close(glfd) != 0) { + LOG_ERR("Failed to close file"); + exit(1); + } + } + return NULL; } int -main (int argc, char *argv[]) +main(int argc, char *argv[]) { - pthread_t tid[5] = {0}; - char buf[1025] = {0}; - char cmp_buf[1025] = {0}; - int ret = 0; - char *hostname = NULL; - char *volname = NULL; - char *logfile = NULL; - glfs_t *fs = NULL; - glfs_fd_t *glfd = NULL; - ssize_t bytes_read = 0; - ssize_t total_bytes_read = 0; - int i = 0; - - if (argc != 4) { - fprintf (stderr, "Invalid argument\n"); - exit(1); - } - - hostname = argv[1]; - volname = argv[2]; - logfile = argv[3]; - - fs = init_glfs (hostname, volname, logfile); - if (fs == NULL) { - LOG_ERR ("init_glfs failed"); - return -1; - } - - for (i = 0; i < 5; i++) { - pthread_create(&tid[i], NULL, write_data, fs); - } - - for (i = 0; i < 5; i++) { - pthread_join(tid[i], NULL); - } - glfd = glfs_open(fs, "parallel-write.txt", O_RDONLY); - if (!glfd) { - LOG_ERR ("Failed to open file for reading"); - exit(1); + pthread_t tid[5] = {0}; + char buf[1025] = {0}; + char cmp_buf[1025] = {0}; + int ret = 0; + char *hostname = NULL; + char *volname = NULL; + char *logfile = NULL; + glfs_t *fs = NULL; + glfs_fd_t *glfd = NULL; + ssize_t bytes_read = 0; + ssize_t total_bytes_read = 0; + int i = 0; + + if (argc != 4) { + fprintf(stderr, "Invalid argument\n"); + exit(1); + } + + hostname = argv[1]; + volname = argv[2]; + logfile = argv[3]; + + fs = init_glfs(hostname, volname, logfile); + if (fs == NULL) { + LOG_ERR("init_glfs failed"); + return -1; + } + + for (i = 0; i < 5; i++) { + pthread_create(&tid[i], NULL, write_data, fs); + } + + for (i = 0; i < 5; i++) { + pthread_join(tid[i], NULL); + } + glfd = glfs_open(fs, "parallel-write.txt", O_RDONLY); + if (!glfd) { + LOG_ERR("Failed to open file for reading"); + exit(1); + } + + while ((bytes_read = glfs_read(glfd, buf, sizeof(buf), 0)) > 0) { + if (bytes_read != sizeof(buf)) { + fprintf(stderr, + "Didn't read complete data read: %zd " + "expected: %lu", + bytes_read, sizeof(buf)); + exit(1); } - while ((bytes_read = glfs_read (glfd, buf, sizeof(buf), 0)) > 0) { - if (bytes_read != sizeof(buf)) { - fprintf (stderr, "Didn't read complete data read: %zd " - "expected: %lu", bytes_read, sizeof(buf)); - exit(1); - } - - total_bytes_read += bytes_read; - if (buf[0] < '1' || buf[0] >= thread_data) { - fprintf(stderr, "Invalid character found: %c", buf[0]); - exit(1); - } - memset(cmp_buf, buf[0], sizeof(cmp_buf)); - if (memcmp(cmp_buf, buf, sizeof(cmp_buf))) { - LOG_ERR ("Data corrupted"); - exit(1); - } - memset(cmp_buf, 0, sizeof(cmp_buf)); + total_bytes_read += bytes_read; + if (buf[0] < '1' || buf[0] >= thread_data) { + fprintf(stderr, "Invalid character found: %c", buf[0]); + exit(1); } - - if (total_bytes_read != 5*1025*1025) { - fprintf(stderr, "Failed to read what is written, read; %zd, " - "expected %zu", total_bytes_read, 5*1025*1025); - exit(1); - } - - if (glfs_close(glfd) != 0) { - LOG_ERR ("Failed to close"); - exit(1); + memset(cmp_buf, buf[0], sizeof(cmp_buf)); + if (memcmp(cmp_buf, buf, sizeof(cmp_buf))) { + LOG_ERR("Data corrupted"); + exit(1); } - return 0; + memset(cmp_buf, 0, sizeof(cmp_buf)); + } + + if (total_bytes_read != 5 * 1025 * 1025) { + fprintf(stderr, + "Failed to read what is written, read; %zd, " + "expected %zu", + total_bytes_read, 5 * 1025 * 1025); + exit(1); + } + + if (glfs_close(glfd) != 0) { + LOG_ERR("Failed to close"); + exit(1); + } + return 0; } diff --git a/tests/bugs/shard/shard-fallocate.c b/tests/bugs/shard/shard-fallocate.c index e16620964c9..cb0714e8564 100644 --- a/tests/bugs/shard/shard-fallocate.c +++ b/tests/bugs/shard/shard-fallocate.c @@ -6,104 +6,108 @@ #include <glusterfs/api/glfs-handles.h> enum fallocate_flag { - TEST_FALLOCATE_NONE, - TEST_FALLOCATE_KEEP_SIZE, - TEST_FALLOCATE_ZERO_RANGE, - TEST_FALLOCATE_PUNCH_HOLE, - TEST_FALLOCATE_MAX, + TEST_FALLOCATE_NONE, + TEST_FALLOCATE_KEEP_SIZE, + TEST_FALLOCATE_ZERO_RANGE, + TEST_FALLOCATE_PUNCH_HOLE, + TEST_FALLOCATE_MAX, }; int -get_fallocate_flag (int opcode) +get_fallocate_flag(int opcode) { - int ret = 0; + int ret = 0; - switch (opcode) { + switch (opcode) { case TEST_FALLOCATE_NONE: - ret = 0; - break; + ret = 0; + break; case TEST_FALLOCATE_KEEP_SIZE: - ret = FALLOC_FL_KEEP_SIZE; - break; + ret = FALLOC_FL_KEEP_SIZE; + break; case TEST_FALLOCATE_ZERO_RANGE: - ret = FALLOC_FL_ZERO_RANGE; - break; + ret = FALLOC_FL_ZERO_RANGE; + break; case TEST_FALLOCATE_PUNCH_HOLE: - ret = FALLOC_FL_PUNCH_HOLE; - break; + ret = FALLOC_FL_PUNCH_HOLE; + break; default: - ret = -1; - break; - } - return ret; + ret = -1; + break; + } + return ret; } int -main (int argc, char *argv[]) +main(int argc, char *argv[]) { - int ret = 1; - int opcode = -1; - off_t offset = 0; - size_t len = 0; - glfs_t *fs = NULL; - glfs_fd_t *fd = NULL; + int ret = 1; + int opcode = -1; + off_t offset = 0; + size_t len = 0; + glfs_t *fs = NULL; + glfs_fd_t *fd = NULL; - if (argc != 8) { - fprintf (stderr, "Syntax: %s <host> <volname> <opcode> <offset> <len> <file-path> <log-file>\n", argv[0]); - return 1; - } + if (argc != 8) { + fprintf(stderr, + "Syntax: %s <host> <volname> <opcode> <offset> <len> " + "<file-path> <log-file>\n", + argv[0]); + return 1; + } - fs = glfs_new (argv[2]); - if (!fs) { - fprintf (stderr, "glfs_new: returned NULL\n"); - return 1; - } + fs = glfs_new(argv[2]); + if (!fs) { + fprintf(stderr, "glfs_new: returned NULL\n"); + return 1; + } - ret = glfs_set_volfile_server (fs, "tcp", argv[1], 24007); - if (ret != 0) { - fprintf (stderr, "glfs_set_volfile_server: retuned %d\n", ret); - goto out; - } + ret = glfs_set_volfile_server(fs, "tcp", argv[1], 24007); + if (ret != 0) { + fprintf(stderr, "glfs_set_volfile_server: returned %d\n", ret); + goto out; + } - ret = glfs_set_logging (fs, argv[7], 7); - if (ret != 0) { - fprintf (stderr, "glfs_set_logging: returned %d\n", ret); - goto out; - } + ret = glfs_set_logging(fs, argv[7], 7); + if (ret != 0) { + fprintf(stderr, "glfs_set_logging: returned %d\n", ret); + goto out; + } - ret = glfs_init (fs); - if (ret != 0) { - fprintf (stderr, "glfs_init: returned %d\n", ret); - goto out; - } + ret = glfs_init(fs); + if (ret != 0) { + fprintf(stderr, "glfs_init: returned %d\n", ret); + goto out; + } - opcode = atoi (argv[3]); - opcode = get_fallocate_flag (opcode); - if (opcode < 0) { - fprintf (stderr, "get_fallocate_flag: invalid flag \n"); - goto out; - } + opcode = atoi(argv[3]); + opcode = get_fallocate_flag(opcode); + if (opcode < 0) { + fprintf(stderr, "get_fallocate_flag: invalid flag \n"); + goto out; + } - offset = atoi (argv[4]); - len = atoi (argv[5]); + /* Note that off_t is signed but size_t isn't. */ + offset = strtol(argv[4], NULL, 10); + len = strtoul(argv[5], NULL, 10); - fd = glfs_open (fs, argv[6], O_RDWR); - if (fd == NULL) { - fprintf (stderr, "glfs_open: returned NULL\n"); - goto out; - } + fd = glfs_open(fs, argv[6], O_RDWR); + if (fd == NULL) { + fprintf(stderr, "glfs_open: returned NULL\n"); + goto out; + } - ret = glfs_fallocate (fd, opcode, offset, len); - if (ret <= 0) { - fprintf (stderr, "glfs_fallocate: returned %d\n", ret); - goto out; - } + ret = glfs_fallocate(fd, opcode, offset, len); + if (ret < 0) { + fprintf(stderr, "glfs_fallocate: returned %d\n", ret); + goto out; + } - ret = 0; + ret = 0; out: - if (fd) - glfs_close(fd); - glfs_fini (fs); - return ret; + if (fd) + glfs_close(fd); + glfs_fini(fs); + return ret; } diff --git a/tests/bugs/shard/shard-inode-refcount-test.t b/tests/bugs/shard/shard-inode-refcount-test.t index 087c8ba7815..3fd181be690 100644 --- a/tests/bugs/shard/shard-inode-refcount-test.t +++ b/tests/bugs/shard/shard-inode-refcount-test.t @@ -21,7 +21,7 @@ TEST dd if=/dev/zero conv=fsync of=$M0/one-plus-five-shards bs=1M count=23 ACTIVE_INODES_BEFORE=$(get_mount_active_size_value $V0) TEST rm -f $M0/one-plus-five-shards # Expect 5 inodes less. But one inode more than before because .remove_me would be created. -EXPECT_WITHIN $SHARD_COUNT_TIME `expr $ACTIVE_INODES_BEFORE - 5 + 1` get_mount_active_size_value $V0 +EXPECT_WITHIN $SHARD_COUNT_TIME `expr $ACTIVE_INODES_BEFORE - 5 + 1` get_mount_active_size_value $V0 $M0 EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0 TEST $CLI volume stop $V0 diff --git a/tests/bugs/shard/unlinks-and-renames.t b/tests/bugs/shard/unlinks-and-renames.t index 6e5164f0b28..990ca69a8b1 100644 --- a/tests/bugs/shard/unlinks-and-renames.t +++ b/tests/bugs/shard/unlinks-and-renames.t @@ -31,9 +31,10 @@ TEST mkdir $M0/dir TEST touch $M0/dir/foo TEST touch $M0/dir/new -###################################### -##### Unlink with /.shard absent ##### -###################################### +########################################## +##### 01. Unlink with /.shard absent ##### +########################################## + TEST truncate -s 5M $M0/dir/foo TEST ! stat $B0/${V0}0/.shard TEST ! stat $B0/${V0}1/.shard @@ -45,9 +46,10 @@ TEST stat $B0/${V0}1/.shard/.remove_me EXPECT_WITHIN $FILE_COUNT_TIME 0 get_file_count $B0/${V0}0/.shard/.remove_me/$gfid_foo EXPECT_WITHIN $FILE_COUNT_TIME 0 get_file_count $B0/${V0}1/.shard/.remove_me/$gfid_foo -################################################## -##### Unlink of a sharded file without holes ##### -################################################## +###################################################### +##### 02. Unlink of a sharded file without holes ##### +###################################################### + # Create a 9M sharded file TEST dd if=/dev/zero of=$M0/dir/new bs=1024 count=9216 gfid_new=$(get_gfid_string $M0/dir/new) @@ -65,9 +67,10 @@ TEST ! stat $B0/${V0}1/dir/new EXPECT_WITHIN $FILE_COUNT_TIME 0 get_file_count $B0/${V0}0/.shard/.remove_me/$gfid_new EXPECT_WITHIN $FILE_COUNT_TIME 0 get_file_count $B0/${V0}1/.shard/.remove_me/$gfid_new -####################################### -##### Unlink with /.shard present ##### -####################################### +########################################### +##### 03. Unlink with /.shard present ##### +########################################### + TEST truncate -s 5M $M0/dir/foo gfid_foo=$(get_gfid_string $M0/dir/foo) # Ensure its shards are absent. @@ -81,9 +84,10 @@ TEST ! stat $M0/dir/foo EXPECT_WITHIN $FILE_COUNT_TIME 0 get_file_count $B0/${V0}0/.shard/.remove_me/$gfid_foo EXPECT_WITHIN $FILE_COUNT_TIME 0 get_file_count $B0/${V0}1/.shard/.remove_me/$gfid_foo -############################################################# -##### Unlink of a file with only one block (the zeroth) ##### -############################################################# +################################################################# +##### 04. Unlink of a file with only one block (the zeroth) ##### +################################################################# + TEST touch $M0/dir/foo gfid_foo=$(get_gfid_string $M0/dir/foo) TEST dd if=/dev/zero of=$M0/dir/foo bs=1024 count=1024 @@ -95,9 +99,10 @@ TEST ! stat $M0/dir/foo EXPECT_WITHIN $FILE_COUNT_TIME 0 get_file_count $B0/${V0}0/.shard/.remove_me/$gfid_foo EXPECT_WITHIN $FILE_COUNT_TIME 0 get_file_count $B0/${V0}1/.shard/.remove_me/$gfid_foo -#################################################### -##### Unlink of a sharded file with hard-links ##### -#################################################### +######################################################## +##### 05. Unlink of a sharded file with hard-links ##### +######################################################## + # Create a 9M sharded file TEST dd if=/dev/zero of=$M0/dir/original bs=1024 count=9216 gfid_original=$(get_gfid_string $M0/dir/original) @@ -154,9 +159,10 @@ TEST mkdir $M0/dir TEST touch $M0/dir/src TEST touch $M0/dir/dst -###################################### -##### Rename with /.shard absent ##### -###################################### +########################################## +##### 06. Rename with /.shard absent ##### +########################################## + TEST truncate -s 5M $M0/dir/dst gfid_dst=$(get_gfid_string $M0/dir/dst) TEST ! stat $B0/${V0}0/.shard @@ -172,9 +178,10 @@ TEST stat $B0/${V0}1/dir/dst EXPECT_WITHIN $FILE_COUNT_TIME 0 get_file_count $B0/${V0}0/.shard/.remove_me/$gfid_dst EXPECT_WITHIN $FILE_COUNT_TIME 0 get_file_count $B0/${V0}1/.shard/.remove_me/$gfid_dst -################################################## -##### Rename to a sharded file without holes ##### -################################################## +###################################################### +##### 07. Rename to a sharded file without holes ##### +###################################################### + TEST unlink $M0/dir/dst TEST touch $M0/dir/src # Create a 9M sharded file @@ -197,9 +204,10 @@ TEST stat $B0/${V0}1/dir/dst EXPECT_WITHIN $FILE_COUNT_TIME 0 get_file_count $B0/${V0}0/.shard/.remove_me/$gfid_dst EXPECT_WITHIN $FILE_COUNT_TIME 0 get_file_count $B0/${V0}1/.shard/.remove_me/$gfid_dst -################################################### -##### Rename of dst file with /.shard present ##### -################################################### +####################################################### +##### 08. Rename of dst file with /.shard present ##### +####################################################### + TEST unlink $M0/dir/dst TEST touch $M0/dir/src TEST truncate -s 5M $M0/dir/dst @@ -215,9 +223,10 @@ TEST stat $B0/${V0}1/dir/dst EXPECT_WITHIN $FILE_COUNT_TIME 0 get_file_count $B0/${V0}0/.shard/.remove_me/$gfid_dst EXPECT_WITHIN $FILE_COUNT_TIME 0 get_file_count $B0/${V0}1/.shard/.remove_me/$gfid_dst -############################################################### -##### Rename of dst file with only one block (the zeroth) ##### -############################################################### +################################################################### +##### 09. Rename of dst file with only one block (the zeroth) ##### +################################################################### + TEST unlink $M0/dir/dst TEST touch $M0/dir/src TEST dd if=/dev/zero of=$M0/dir/dst bs=1024 count=1024 @@ -233,9 +242,10 @@ TEST stat $B0/${V0}1/dir/dst EXPECT_WITHIN $FILE_COUNT_TIME 0 get_file_count $B0/${V0}0/.shard/.remove_me/$gfid_dst EXPECT_WITHIN $FILE_COUNT_TIME 0 get_file_count $B0/${V0}1/.shard/.remove_me/$gfid_dst -######################################################## -##### Rename to a dst sharded file with hard-links ##### -######################################################## +############################################################ +##### 10. Rename to a dst sharded file with hard-links ##### +############################################################ + TEST unlink $M0/dir/dst TEST touch $M0/dir/src # Create a 9M sharded file @@ -276,7 +286,10 @@ TEST ! stat $B0/${V0}1/dir/src2 EXPECT_WITHIN $FILE_COUNT_TIME 0 get_file_count $B0/${V0}0/.shard/.remove_me/$gfid_dst EXPECT_WITHIN $FILE_COUNT_TIME 0 get_file_count $B0/${V0}1/.shard/.remove_me/$gfid_dst -# Rename with non-existent dst and a sharded src +############################################################## +##### 11. Rename with non-existent dst and a sharded src ##### +##############################################################l + TEST touch $M0/dir/src TEST dd if=/dev/zero of=$M0/dir/src bs=1024 count=9216 gfid_src=$(get_gfid_string $M0/dir/src) @@ -286,7 +299,7 @@ TEST stat $B0/${V0}1/.shard/$gfid_src.1 TEST stat $B0/${V0}0/.shard/$gfid_src.2 TEST stat $B0/${V0}1/.shard/$gfid_src.2 # Now rename src to the dst. -TEST mv $M0/dir/src $M0/dir/dst +TEST mv $M0/dir/src $M0/dir/dst2 TEST stat $B0/${V0}0/.shard/$gfid_src.1 TEST stat $B0/${V0}1/.shard/$gfid_src.1 @@ -295,23 +308,26 @@ TEST stat $B0/${V0}1/.shard/$gfid_src.2 TEST ! stat $M0/dir/src TEST ! stat $B0/${V0}0/dir/src TEST ! stat $B0/${V0}1/dir/src -TEST stat $M0/dir/dst -TEST stat $B0/${V0}0/dir/dst -TEST stat $B0/${V0}1/dir/dst +TEST stat $M0/dir/dst2 +TEST stat $B0/${V0}0/dir/dst2 +TEST stat $B0/${V0}1/dir/dst2 + +############################################################################# +##### 12. Rename with non-existent dst and a sharded src with no shards ##### +############################################################################# -# Rename with non-existent dst and a sharded src with no shards TEST touch $M0/dir/src TEST dd if=/dev/zero of=$M0/dir/src bs=1024 count=1024 gfid_src=$(get_gfid_string $M0/dir/src) TEST ! stat $B0/${V0}0/.shard/$gfid_src.1 TEST ! stat $B0/${V0}1/.shard/$gfid_src.1 # Now rename src to the dst. -TEST mv $M0/dir/src $M0/dir/dst +TEST mv $M0/dir/src $M0/dir/dst1 TEST ! stat $M0/dir/src TEST ! stat $B0/${V0}0/dir/src TEST ! stat $B0/${V0}1/dir/src -TEST stat $M0/dir/dst -TEST stat $B0/${V0}0/dir/dst -TEST stat $B0/${V0}1/dir/dst +TEST stat $M0/dir/dst1 +TEST stat $B0/${V0}0/dir/dst1 +TEST stat $B0/${V0}1/dir/dst1 cleanup diff --git a/tests/bugs/shard/zero-flag.t b/tests/bugs/shard/zero-flag.t index 84cb9635a1b..1f39787ab9f 100644 --- a/tests/bugs/shard/zero-flag.t +++ b/tests/bugs/shard/zero-flag.t @@ -14,6 +14,7 @@ TEST glusterd TEST pidof glusterd TEST $CLI volume create $V0 replica 2 $H0:$B0/${V0}{0,1,2,3} TEST $CLI volume set $V0 features.shard on +TEST $CLI volume set $V0 features.shard-block-size 4MB TEST $CLI volume start $V0 TEST $GFS --volfile-id=$V0 --volfile-server=$H0 $M0 diff --git a/tests/bugs/snapshot/bug-1109889.t b/tests/bugs/snapshot/bug-1109889.t index 6b29cdd9eb1..5fdc7dc9506 100644 --- a/tests/bugs/snapshot/bug-1109889.t +++ b/tests/bugs/snapshot/bug-1109889.t @@ -19,9 +19,9 @@ TEST $CLI volume create $V0 $H0:$L1 $H0:$L2 $H0:$L3; TEST $CLI volume start $V0; -TEST glusterfs --volfile-server=$H0 --volfile-id=$V0 $M0; +TEST $GFS --volfile-server=$H0 --volfile-id=$V0 $M0; -MOUNT_PID=`ps ax |grep "glusterfs --volfile-sever $H0 --volfile-id=$V0 $M0" | grep -v grep | awk '{print $1}' | head -1` +MOUNT_PID=$(get_mount_process_pid $V0 $M0) for i in {1..10} ; do echo "file" > $M0/file$i ; done diff --git a/tests/bugs/snapshot/bug-1111041.t b/tests/bugs/snapshot/bug-1111041.t index f771d64f2a3..efda9688d8b 100755 --- a/tests/bugs/snapshot/bug-1111041.t +++ b/tests/bugs/snapshot/bug-1111041.t @@ -11,6 +11,10 @@ function is_snapd_running { $CLI volume status $1 | grep "Snapshot Daemon" | wc -l; } +function snapd_pid { + $CLI volume status $V0 | grep "Snapshot Daemon" | awk {'print $8'} +} + TEST glusterd; TEST pidof glusterd; @@ -25,14 +29,12 @@ TEST $CLI volume set $V0 features.uss enable; EXPECT "1" is_snapd_running $V0 -SNAPD_PID=$($CLI volume status $V0 | grep "Snapshot Daemon" | awk {'print $8'}); +SNAPD_PID=$(snapd_pid); TEST [ $SNAPD_PID -gt 0 ] kill -9 $SNAPD_PID -SNAPD_PID=$($CLI volume status $V0 | grep "Snapshot Daemon" | awk {'print $8'}); - -TEST [ $SNAPD_PID = 'N/A' ] +EXPECT_WITHIN $PROCESS_DOWN_TIMEOUT "^N/A$" snapd_pid cleanup ; diff --git a/tests/bugs/snapshot/bug-1140162-file-snapshot-features-encrypt-opts-validation.t b/tests/bugs/snapshot/bug-1140162-file-snapshot-features-encrypt-opts-validation.t deleted file mode 100644 index c536c8261e4..00000000000 --- a/tests/bugs/snapshot/bug-1140162-file-snapshot-features-encrypt-opts-validation.t +++ /dev/null @@ -1,43 +0,0 @@ -#!/bin/bash - -## Test case for BZ-1140160 Volume option set <vol> <file-snapshot> and -## <features.encryption> <value> command input should validate correctly. - -. $(dirname $0)/../../include.rc -. $(dirname $0)/../../volume.rc - -cleanup; - -## Start glusterd -TEST glusterd; -TEST pidof glusterd; - -## Lets create and start volume -TEST $CLI volume create $V0 $H0:$B0/${V0}{1,2}; -TEST $CLI volume start $V0 - -## Set features.file-snapshot and features.encryption option with non-boolean -## value. These options should fail. -TEST ! $CLI volume set $V0 features.file-snapshot abcd -TEST ! $CLI volume set $V0 features.encryption redhat - -## Set other options with valid value. These options should succeed. -TEST $CLI volume set $V0 barrier enable -TEST $CLI volume set $V0 ping-timeout 60 - -## Set features.file-snapshot and features.encryption option with valid boolean -## value. These options should succeed. -TEST $CLI volume set $V0 features.file-snapshot on - -## Before setting the crypt xlator on, it is required to create master key -## Otherwise glusterfs client process will fail to start -echo "0000111122223333444455556666777788889999aaaabbbbccccddddeeeeffff" > $GLUSTERD_WORKDIR/$V0-master-key - -## Specify location of master key -TEST $CLI volume set $V0 encryption.master-key $GLUSTERD_WORKDIR/$V0-master-key - -TEST $CLI volume set $V0 features.encryption on - -cleanup; -#G_TESTDEF_TEST_STATUS_NETBSD7=BAD_TEST,BUG=000000 -#G_TESTDEF_TEST_STATUS_CENTOS6=BAD_TEST,BUG=000000 diff --git a/tests/bugs/snapshot/bug-1166197.t b/tests/bugs/snapshot/bug-1166197.t index 7350acfa9ed..b070ae271ba 100755 --- a/tests/bugs/snapshot/bug-1166197.t +++ b/tests/bugs/snapshot/bug-1166197.t @@ -5,6 +5,8 @@ . $(dirname $0)/../../volume.rc . $(dirname $0)/../../nfs.rc +#G_TESTDEF_TEST_STATUS_CENTOS6=NFS_TEST + cleanup; CURDIR=`pwd` diff --git a/tests/bugs/snapshot/bug-1167580-set-proper-uid-and-gid-during-nfs-access.t b/tests/bugs/snapshot/bug-1167580-set-proper-uid-and-gid-during-nfs-access.t index 3776451c158..52a7a790b97 100644 --- a/tests/bugs/snapshot/bug-1167580-set-proper-uid-and-gid-during-nfs-access.t +++ b/tests/bugs/snapshot/bug-1167580-set-proper-uid-and-gid-during-nfs-access.t @@ -4,6 +4,8 @@ . $(dirname $0)/../../volume.rc . $(dirname $0)/../../snapshot.rc +#G_TESTDEF_TEST_STATUS_CENTOS6=NFS_TEST + # This function returns a value "Y" if user can execute # the given command. Else it will return "N" # @arg-1 : Name of the user @@ -199,3 +201,5 @@ TEST $CLI snapshot delete all cleanup; +#G_TESTDEF_TEST_STATUS_NETBSD7=BAD_TEST,BUG=000000 +#G_TESTDEF_TEST_STATUS_CENTOS6=BAD_TEST,BUG=000000 diff --git a/tests/bugs/snapshot/bug-1227646.t b/tests/bugs/snapshot/bug-1227646.t index a16a8c270da..9b73dfdb32f 100644 --- a/tests/bugs/snapshot/bug-1227646.t +++ b/tests/bugs/snapshot/bug-1227646.t @@ -20,7 +20,6 @@ TEST $CLI snapshot create snap1 $V0 no-timestamp; TEST $CLI volume stop $V0 TEST $CLI snapshot restore snap1; TEST $CLI volume start $V0 -TEST $CLI volume tier $V0 attach $H0:$L1 $H0:$L2 TEST pkill gluster TEST glusterd diff --git a/tests/bugs/snapshot/bug-1260848.t b/tests/bugs/snapshot/bug-1260848.t index 7eae3982e43..6455d8297b2 100644 --- a/tests/bugs/snapshot/bug-1260848.t +++ b/tests/bugs/snapshot/bug-1260848.t @@ -4,6 +4,8 @@ . $(dirname $0)/../../nfs.rc . $(dirname $0)/../../volume.rc +#G_TESTDEF_TEST_STATUS_CENTOS6=NFS_TEST + cleanup; ## Start and create a volume diff --git a/tests/bugs/snapshot/bug-1279327.t b/tests/bugs/snapshot/bug-1279327.t index de1b3885a1c..4e4be6eeea6 100644 --- a/tests/bugs/snapshot/bug-1279327.t +++ b/tests/bugs/snapshot/bug-1279327.t @@ -15,7 +15,6 @@ TEST setup_lvm 3 TEST $CLI volume create $V0 $H0:$L1 TEST $CLI volume start $V0 TEST $CLI volume quota $V0 enable -TEST $CLI volume tier $V0 attach replica 2 $H0:$L2 $H0:$L3 TEST $CLI snapshot create snap1 $V0 no-timestamp TEST $CLI snapshot activate snap1 diff --git a/tests/bugs/snapshot/bug-1482023-snpashot-issue-with-other-processes-accessing-mounted-path.t b/tests/bugs/snapshot/bug-1482023-snpashot-issue-with-other-processes-accessing-mounted-path.t index 22f98d2b5a7..04a85db0c1a 100644 --- a/tests/bugs/snapshot/bug-1482023-snpashot-issue-with-other-processes-accessing-mounted-path.t +++ b/tests/bugs/snapshot/bug-1482023-snpashot-issue-with-other-processes-accessing-mounted-path.t @@ -111,6 +111,10 @@ EXPECT_WITHIN $PROBE_TIMEOUT 2 peer_count; EXPECT_WITHIN $PROCESS_UP_TIMEOUT "0" mounted_snaps ${V0} EXPECT_WITHIN $PROCESS_UP_TIMEOUT "0" mounted_snaps ${V1} +# It might be possible that the import snap synctask is still updating the data, +# we need to allow a buffer time to be on the safer side +sleep 2 + kill_glusterd 2 activate_snapshots EXPECT 'Started' snapshot_status ${V0}_snap; @@ -125,3 +129,5 @@ EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" mounted_snaps ${V0} EXPECT_WITHIN $PROCESS_UP_TIMEOUT "2" mounted_snaps ${V1} cleanup; +# run first! +#G_TESTDEF_TEST_STATUS_CENTOS6=BRICK_MUX_BAD_TEST,BUG=1743069 diff --git a/tests/bugs/snapshot/bug-1512451-snapshot-creation-failed-after-brick-reset.t b/tests/bugs/snapshot/bug-1512451-snapshot-creation-failed-after-brick-reset.t index 0624a5db977..53b274e8819 100644 --- a/tests/bugs/snapshot/bug-1512451-snapshot-creation-failed-after-brick-reset.t +++ b/tests/bugs/snapshot/bug-1512451-snapshot-creation-failed-after-brick-reset.t @@ -28,7 +28,7 @@ TEST ! snapshot_exists 1 ${V0}_snap1 TEST $CLI_1 volume reset-brick $V0 $H1:$L1/B1 start TEST $CLI_1 volume reset-brick $V0 $H1:$L1/B1 $H1:$L1/B1 commit force -EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status_1 $V0 $H1 $L1/B1 +EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" cluster_brick_up_status 1 $V0 $H1 $L1/B1 TEST $CLI_1 snapshot create ${V0}_snap1 ${V0} no-timestamp TEST snapshot_exists 1 ${V0}_snap1 diff --git a/tests/bugs/snapshot/bug-1597662.t b/tests/bugs/snapshot/bug-1597662.t new file mode 100644 index 00000000000..f582930476a --- /dev/null +++ b/tests/bugs/snapshot/bug-1597662.t @@ -0,0 +1,58 @@ +#!/bin/bash + +. $(dirname $0)/../../include.rc +. $(dirname $0)/../../volume.rc +. $(dirname $0)/../../snapshot.rc + +cleanup; + +TEST init_n_bricks 3; +TEST setup_lvm 3; +TEST glusterd; +TEST pidof glusterd; + +TEST $CLI volume create $V0 $H0:$L1 $H0:$L2 $H0:$L3; +TEST $CLI volume start $V0; + +snap_path=/var/run/gluster/snaps + +TEST $CLI snapshot create snap1 $V0 no-timestamp; + +$CLI snapshot activate snap1; + +EXPECT 'Started' snapshot_status snap1; + +# This Function will check for entry /var/run/gluster/snaps/<snap-name> +# against snap-name + +function is_snap_path +{ + echo `ls $snap_path | grep snap1 | wc -l` +} + +# snap is active so snap_path should exist +EXPECT "1" is_snap_path + +$CLI snapshot deactivate snap1; +EXPECT_WITHIN ${PROCESS_DOWN_TIMEOUT} 'Stopped' snapshot_status snap1 +# snap is deactivated so snap_path should not exist +EXPECT "0" is_snap_path + +# activate snap again +$CLI snapshot activate snap1; +EXPECT_WITHIN ${PROCESS_UP_TIMEOUT} 'Started' snapshot_status snap1 + +# snap is active so snap_path should exist +EXPECT "1" is_snap_path + +# delete snap now +TEST $CLI snapshot delete snap1; + +# snap is deleted so snap_path should not exist +EXPECT "0" is_snap_path + +TEST $CLI volume stop $V0; +TEST $CLI volume delete $V0; + +cleanup; + diff --git a/tests/bugs/snapshot/bug-1618004-fix-memory-corruption-in-snap-import.t b/tests/bugs/snapshot/bug-1618004-fix-memory-corruption-in-snap-import.t new file mode 100644 index 00000000000..a2c004e435e --- /dev/null +++ b/tests/bugs/snapshot/bug-1618004-fix-memory-corruption-in-snap-import.t @@ -0,0 +1,48 @@ +#!/bin/bash + +. $(dirname $0)/../../include.rc +. $(dirname $0)/../../volume.rc +. $(dirname $0)/../../snapshot.rc +. $(dirname $0)/../../cluster.rc + +function get_volume_info () +{ + local var=$1 + $CLI_1 volume info $V0 | grep "^$var" | sed 's/.*: //' +} + +cleanup; + +TEST verify_lvm_version +TEST launch_cluster 2 +TEST setup_lvm 2 + +TEST $CLI_1 peer probe $H2; +EXPECT_WITHIN $PROBE_TIMEOUT 1 peer_count; + +TEST $CLI_1 volume create $V0 $H1:$L1 $H2:$L2 +EXPECT "$V0" get_volume_info 'Volume Name'; +EXPECT 'Created' get_volume_info 'Status'; + +TEST $CLI_1 volume start $V0 +EXPECT 'Started' get_volume_info 'Status'; + + +# Setting system limit +TEST $CLI_1 snapshot config activate-on-create enable + +TEST $CLI_1 snapshot create snap1 $V0 no-timestamp description "test" +TEST kill_glusterd 1 +#deactivate snapshot for changing snap version, so that handshake will +#happen when glusterd is restarted +TEST $CLI_2 snapshot deactivate snap1 +TEST start_glusterd 1 + +#Wait till handshake complete +EXPECT_WITHIN ${PROCESS_UP_TIMEOUT} 'Stopped' snapshot_status snap1 + +#Delete the snapshot, without this fix, delete will lead to assertion failure +$CLI_1 snapshot delete all +EXPECT '0' get_snap_count CLI_1; +cleanup; + diff --git a/tests/bugs/tier/bug-1205545-CTR-and-trash-integration.t b/tests/bugs/tier/bug-1205545-CTR-and-trash-integration.t deleted file mode 100644 index b2d382a2ce5..00000000000 --- a/tests/bugs/tier/bug-1205545-CTR-and-trash-integration.t +++ /dev/null @@ -1,72 +0,0 @@ -#!/bin/bash - -. $(dirname $0)/../../include.rc -. $(dirname $0)/../../volume.rc - -LAST_BRICK=3 -CACHE_BRICK_FIRST=4 -CACHE_BRICK_LAST=5 - -cleanup - -# Start glusterd [1-2] -TEST glusterd -TEST pidof glusterd - -# Set-up tier cluster [3-4] -TEST $CLI volume create $V0 replica 2 $H0:$B0/${V0}{0..$LAST_BRICK} -TEST $CLI volume start $V0 -TEST $CLI volume tier $V0 attach replica 2 $H0:$B0/${V0}$CACHE_BRICK_FIRST $H0:$B0/${V0}$CACHE_BRICK_LAST - -# Start and mount the volume after enabling CTR and trash [5-8] -TEST $CLI volume set $V0 features.ctr-enabled on -TEST $CLI volume set $V0 features.trash on -TEST $GFS --volfile-id=/$V0 --volfile-server=$H0 $M0; - -# Create an empty file -touch $M0/foo - -# gf_file_tb and gf_flink_tb should contain one entry each [9] -ENTRY_COUNT=$(echo "select * from gf_file_tb; select * from gf_flink_tb;" | \ - sqlite3 $B0/${V0}5/.glusterfs/${V0}5.db | wc -l ) -TEST [ $ENTRY_COUNT -eq 2 ] - -# Create two hard links -ln $M0/foo $M0/lnk1 -ln $M0/foo $M0/lnk2 - -# Now gf_flink_tb should contain 3 entries [10] -ENTRY_COUNT=$(echo "select * from gf_flink_tb;" | \ - sqlite3 $B0/${V0}5/.glusterfs/${V0}5.db | wc -l ) -TEST [ $ENTRY_COUNT -eq 3 ] - -# Delete the hard link -rm -rf $M0/lnk1 - -# Corresponding hard link entry must be removed from gf_flink_tb -# but gf_file_tb should still contain the file entry [11] -ENTRY_COUNT=$(echo "select * from gf_file_tb; select * from gf_flink_tb;" | \ - sqlite3 $B0/${V0}5/.glusterfs/${V0}5.db | wc -l ) -TEST [ $ENTRY_COUNT -eq 3 ] - -# Remove the file -rm -rf $M0/foo - -# Another hardlink removed [12] -ENTRY_COUNT=$(echo "select * from gf_file_tb; select * from gf_flink_tb;" | \ - sqlite3 $B0/${V0}5/.glusterfs/${V0}5.db | wc -l ) -TEST [ $ENTRY_COUNT -eq 2 ] - -# Remove the last hardlink -rm -rf $M0/lnk2 - -# All entried must be removed from gf_flink_tb and gf_file_tb [13] -ENTRY_COUNT=$(echo "select * from gf_file_tb; select * from gf_flink_tb;" | \ - sqlite3 $B0/${V0}5/.glusterfs/${V0}5.db | wc -l ) -TEST [ $ENTRY_COUNT -eq 0 ] - -cleanup - - - -#G_TESTDEF_TEST_STATUS_NETBSD7=KNOWN_ISSUE,BUG=000000 diff --git a/tests/bugs/tier/bug-1279376-rename-demoted-file.t b/tests/bugs/tier/bug-1279376-rename-demoted-file.t deleted file mode 100755 index c4a50d9d9f7..00000000000 --- a/tests/bugs/tier/bug-1279376-rename-demoted-file.t +++ /dev/null @@ -1,93 +0,0 @@ -#!/bin/bash - -. $(dirname $0)/../../include.rc -. $(dirname $0)/../../volume.rc -. $(dirname $0)/../../tier.rc - - -NUM_BRICKS=2 -DEMOTE_FREQ=15 -DEMOTE_TIMEOUT=10 -PROMOTE_FREQ=500 - - -#Both src and dst files must hash to the same hot tier subvol -SRC_FILE="file1.txt" -DST_FILE="newfile1.txt" - - -# Creates a tiered volume with pure distribute hot and cold tiers -# Both hot and cold tiers will have an equal number of bricks. - -function create_dist_tier_vol () { - mkdir $B0/cold - mkdir $B0/hot - TEST $CLI volume create $V0 $H0:$B0/cold/${V0}{0..$1} - TEST $CLI volume set $V0 performance.quick-read off - TEST $CLI volume set $V0 performance.io-cache off - TEST $CLI volume start $V0 - TEST $CLI volume tier $V0 attach $H0:$B0/hot/${V0}{0..$1} - TEST $CLI volume set $V0 cluster.tier-demote-frequency $DEMOTE_FREQ - TEST $CLI volume set $V0 cluster.tier-promote-frequency $PROMOTE_FREQ - TEST $CLI volume set $V0 cluster.tier-mode test - -#We do not want any files to be promoted during this test - TEST $CLI volume set $V0 features.record-counters on - TEST $CLI volume set $V0 cluster.read-freq-threshold 50 - TEST $CLI volume set $V0 cluster.write-freq-threshold 50 -} - - -cleanup; - -#Basic checks -TEST glusterd -TEST pidof glusterd -TEST $CLI volume info - - -#Create and start a tiered volume -create_dist_tier_vol $NUM_BRICKS - -# Mount FUSE -TEST glusterfs -s $H0 --volfile-id $V0 $M0 - - -# The file will be created on the hot tier - -TEST touch "$M0/$SRC_FILE" - -# Get the path of the file on the hot tier -HPATH=`find $B0/hot/ -name "$SRC_FILE"` -echo "File path on hot tier: "$HPATH - - -EXPECT "yes" exists_and_regular_file $HPATH - -# Wait for the tier process to demote the file -sleep $DEMOTE_FREQ - -# Get the path of the file on the cold tier -CPATH=`find $B0/cold/ -name "$SRC_FILE"` -echo "File path on cold tier: "$CPATH - -EXPECT_WITHIN $DEMOTE_TIMEOUT "yes" exists_and_regular_file $CPATH - -#We don't want $DST_FILE to get demoted -TEST $CLI volume set $V0 cluster.tier-demote-frequency $PROMOTE_FREQ - -#This will be created on the hot tier - -touch "$M0/$DST_FILE" -HPATH=`find $B0/hot/ -name "$DST_FILE"` -echo "File path on hot tier: "$HPATH - -TEST mv $M0/$SRC_FILE $M0/$DST_FILE - -# We expect a single file to exist at this point -# when viewed on the mountpoint -EXPECT 1 echo $(ls -l $M0 | grep $DST_FILE | wc -l) - -cleanup; - -#G_TESTDEF_TEST_STATUS_NETBSD7=KNOWN_ISSUE,BUG=000000 diff --git a/tests/bugs/transport/bug-873367.t b/tests/bugs/transport/bug-873367.t index d4c07024ed0..8070bc1b83c 100755 --- a/tests/bugs/transport/bug-873367.t +++ b/tests/bugs/transport/bug-873367.t @@ -13,7 +13,7 @@ rm -f $SSL_BASE/glusterfs.* mkdir -p $B0/1 mkdir -p $M0 -TEST openssl genrsa -out $SSL_KEY 1024 +TEST openssl genrsa -out $SSL_KEY 2048 TEST openssl req -new -x509 -key $SSL_KEY -subj /CN=Anyone -out $SSL_CERT ln $SSL_CERT $SSL_CA diff --git a/tests/bugs/write-behind/bug-1058663.c b/tests/bugs/write-behind/bug-1058663.c index 5e522e98048..aedf97d7487 100644 --- a/tests/bugs/write-behind/bug-1058663.c +++ b/tests/bugs/write-behind/bug-1058663.c @@ -19,101 +19,105 @@ static int sigbus_received; /* test for truncate()/seek()/write()/mmap() * There should ne no SIGBUS triggered. */ -void seek_write(char *filename) +void +seek_write(char *filename) { - int fd; - uint8_t *map; - int i; - - fd = open(filename, O_RDWR|O_CREAT|O_TRUNC, 0600); - lseek(fd, FILE_SIZE - 1, SEEK_SET); - write(fd, "\xff", 1); - - map = mmap(NULL, FILE_SIZE, PROT_READ, MAP_PRIVATE, fd, 0); - for (i = 0; i < (FILE_SIZE - 1); i++) { - if (map[i] != 0) /* should never be true */ - abort(); - } - munmap(map, FILE_SIZE); - - close(fd); + int fd; + uint8_t *map; + int i; + + fd = open(filename, O_RDWR | O_CREAT | O_TRUNC, 0600); + lseek(fd, FILE_SIZE - 1, SEEK_SET); + write(fd, "\xff", 1); + + map = mmap(NULL, FILE_SIZE, PROT_READ, MAP_PRIVATE, fd, 0); + for (i = 0; i < (FILE_SIZE - 1); i++) { + if (map[i] != 0) /* should never be true */ + abort(); + } + munmap(map, FILE_SIZE); + + close(fd); } -int read_after_eof(char *filename) +int +read_after_eof(char *filename) { - int ret = 0; - int fd; - char *data; - uint8_t *map; - - fd = open(filename, O_RDWR|O_CREAT|O_TRUNC, 0600); - lseek(fd, FILE_SIZE - 1, SEEK_SET); - write(fd, "\xff", 1); - - /* trigger verify that reading after EOF fails */ - ret = read(fd, data, FILE_SIZE / 2); - if (ret != 0) - return 1; - - /* map an area of 1 byte after FILE_SIZE */ - map = mmap(NULL, 1, PROT_READ, MAP_PRIVATE, fd, FILE_SIZE); - /* map[0] is an access after EOF, it should trigger SIGBUS */ - if (map[0] != 0) - /* it is expected that we exit before we get here */ - if (!sigbus_received) - return 1; - munmap(map, FILE_SIZE); - - close(fd); - - return ret; + int ret = 0; + int fd; + char *data; + uint8_t *map; + + fd = open(filename, O_RDWR | O_CREAT | O_TRUNC, 0600); + lseek(fd, FILE_SIZE - 1, SEEK_SET); + write(fd, "\xff", 1); + + /* trigger verify that reading after EOF fails */ + ret = read(fd, data, FILE_SIZE / 2); + if (ret != 0) + return 1; + + /* map an area of 1 byte after FILE_SIZE */ + map = mmap(NULL, 1, PROT_READ, MAP_PRIVATE, fd, FILE_SIZE); + /* map[0] is an access after EOF, it should trigger SIGBUS */ + if (map[0] != 0) + /* it is expected that we exit before we get here */ + if (!sigbus_received) + return 1; + munmap(map, FILE_SIZE); + + close(fd); + + return ret; } /* signal handler for SIGBUS */ -void catch_sigbus(int signum) +void +catch_sigbus(int signum) { - switch (signum) { + switch (signum) { #ifdef __NetBSD__ - /* Depending on architecture, we can get SIGSEGV */ - case SIGSEGV: /* FALLTHROUGH */ + /* Depending on architecture, we can get SIGSEGV */ + case SIGSEGV: /* FALLTHROUGH */ #endif - case SIGBUS: - sigbus_received++; - if (!expect_sigbus) - exit(EXIT_FAILURE); - if (sigbus_received >= MAX_SIGBUS) - exit(EXIT_SUCCESS); - break; - default: - printf("Unexpected signal received: %d\n", signum); - } + case SIGBUS: + sigbus_received++; + if (!expect_sigbus) + exit(EXIT_FAILURE); + if (sigbus_received >= MAX_SIGBUS) + exit(EXIT_SUCCESS); + break; + default: + printf("Unexpected signal received: %d\n", signum); + } } -int main(int argc, char **argv) +int +main(int argc, char **argv) { - int i = 0; + int i = 0; - if (argc == 1) { - printf("Usage: %s <filename>\n", argv[0]); - return EXIT_FAILURE; - } + if (argc == 1) { + printf("Usage: %s <filename>\n", argv[0]); + return EXIT_FAILURE; + } #ifdef __NetBSD__ - /* Depending on architecture, we can get SIGSEGV */ - signal(SIGSEGV, catch_sigbus); + /* Depending on architecture, we can get SIGSEGV */ + signal(SIGSEGV, catch_sigbus); #endif - signal(SIGBUS, catch_sigbus); + signal(SIGBUS, catch_sigbus); - /* the next test should not trigger SIGBUS */ - expect_sigbus = 0; - for (i = 0; i < RUN_LOOP; i++) { - seek_write(argv[1]); - } + /* the next test should not trigger SIGBUS */ + expect_sigbus = 0; + for (i = 0; i < RUN_LOOP; i++) { + seek_write(argv[1]); + } - /* the next test should trigger SIGBUS */ - expect_sigbus = 1; - if (read_after_eof(argv[1])) - return EXIT_FAILURE; + /* the next test should trigger SIGBUS */ + expect_sigbus = 1; + if (read_after_eof(argv[1])) + return EXIT_FAILURE; - return EXIT_SUCCESS; + return EXIT_SUCCESS; } diff --git a/tests/bugs/write-behind/bug-1279730.c b/tests/bugs/write-behind/bug-1279730.c index 535d289c582..706ae67b102 100644 --- a/tests/bugs/write-behind/bug-1279730.c +++ b/tests/bugs/write-behind/bug-1279730.c @@ -8,124 +8,142 @@ #include <assert.h> int -main (int argc, char *argv[]) +main(int argc, char *argv[]) { - int fd = -1, ret = -1, len = 0; - char *path = NULL, buf[128] = {0, }, *cmd = NULL; - struct stat stbuf = {0, }; - int write_to_child[2] = {0, }, write_to_parent[2] = {0, }; + int fd = -1, ret = -1, len = 0; + char *path = NULL, + buf[128] = + { + 0, + }, + *cmd = NULL; + struct stat stbuf = { + 0, + }; + int write_to_child[2] = + { + 0, + }, + write_to_parent[2] = { + 0, + }; + + path = argv[1]; + cmd = argv[2]; + + assert(argc == 3); + + ret = pipe(write_to_child); + if (ret < 0) { + fprintf(stderr, + "creation of write-to-child pipe failed " + "(%s)\n", + strerror(errno)); + goto out; + } + + ret = pipe(write_to_parent); + if (ret < 0) { + fprintf(stderr, + "creation of write-to-parent pipe failed " + "(%s)\n", + strerror(errno)); + goto out; + } + + ret = fork(); + switch (ret) { + case 0: + close(write_to_child[1]); + close(write_to_parent[0]); + + /* child, wait for instructions to execute command */ + ret = read(write_to_child[0], buf, 128); + if (ret < 0) { + fprintf(stderr, "child: read on pipe failed (%s)\n", + strerror(errno)); + goto out; + } - path = argv[1]; - cmd = argv[2]; + system(cmd); + + ret = write(write_to_parent[1], "1", 2); + if (ret < 0) { + fprintf(stderr, "child: write to pipe failed (%s)\n", + strerror(errno)); + goto out; + } + break; - assert (argc == 3); + case -1: + fprintf(stderr, "fork failed (%s)\n", strerror(errno)); + goto out; + + default: + close(write_to_parent[1]); + close(write_to_child[0]); - ret = pipe (write_to_child); - if (ret < 0) { - fprintf (stderr, "creation of write-to-child pipe failed " - "(%s)\n", strerror (errno)); + fd = open(path, O_CREAT | O_RDWR | O_APPEND, S_IRWXU); + if (fd < 0) { + fprintf(stderr, "open failed (%s)\n", strerror(errno)); goto out; - } + } + + len = strlen("test-content") + 1; + ret = write(fd, "test-content", len); + + if (ret < len) { + fprintf(stderr, "write failed %d (%s)\n", ret, strerror(errno)); + } + + ret = pread(fd, buf, 128, 0); + if ((ret == len) && (strcmp(buf, "test-content") == 0)) { + fprintf(stderr, + "read should've failed as previous " + "write would've failed with EDQUOT, but its " + "successful"); + ret = -1; + goto out; + } - ret = pipe (write_to_parent); - if (ret < 0) { - fprintf (stderr, "creation of write-to-parent pipe failed " - "(%s)\n", strerror (errno)); + ret = write(write_to_child[1], "1", 2); + if (ret < 0) { + fprintf(stderr, "parent: write to pipe failed (%s)\n", + strerror(errno)); goto out; - } + } - ret = fork (); - switch (ret) { - case 0: - close (write_to_child[1]); - close (write_to_parent[0]); - - /* child, wait for instructions to execute command */ - ret = read (write_to_child[0], buf, 128); - if (ret < 0) { - fprintf (stderr, "child: read on pipe failed (%s)\n", - strerror (errno)); - goto out; - } - - system (cmd); - - ret = write (write_to_parent[1], "1", 2); - if (ret < 0) { - fprintf (stderr, "child: write to pipe failed (%s)\n", - strerror (errno)); - goto out; - } - break; + ret = read(write_to_parent[0], buf, 128); + if (ret < 0) { + fprintf(stderr, "parent: read from pipe failed (%s)\n", + strerror(errno)); + goto out; + } + + /* this will force a sync on cached-write and now that quota + limit is increased, sync will be successful. ignore return + value as fstat would fail with EDQUOT (picked up from + cached-write because of previous sync failure. + */ + fstat(fd, &stbuf); + + ret = pread(fd, buf, 128, 0); + if (ret != len) { + fprintf(stderr, + "post cmd read failed %d (data:%s) " + "(error:%s)\n", + ret, buf, strerror(errno)); + goto out; + } - case -1: - fprintf (stderr, "fork failed (%s)\n", strerror (errno)); + if (strcmp(buf, "test-content")) { + fprintf(stderr, "wrong data (%s)\n", buf); goto out; + } + } - default: - close (write_to_parent[1]); - close (write_to_child[0]); - - fd = open (path, O_CREAT | O_RDWR | O_APPEND, S_IRWXU); - if (fd < 0) { - fprintf (stderr, "open failed (%s)\n", - strerror (errno)); - goto out; - } - - len = strlen ("test-content") + 1; - ret = write (fd, "test-content", len); - - if (ret < len) { - fprintf (stderr, "write failed %d (%s)\n", ret, - strerror (errno)); - } - - ret = pread (fd, buf, 128, 0); - if ((ret == len) && (strcmp (buf, "test-content") == 0)) { - fprintf (stderr, "read should've failed as previous " - "write would've failed with EDQUOT, but its " - "successful"); - ret = -1; - goto out; - } - - ret = write (write_to_child[1], "1", 2); - if (ret < 0) { - fprintf (stderr, "parent: write to pipe failed (%s)\n", - strerror (errno)); - goto out; - } - - ret = read (write_to_parent[0], buf, 128); - if (ret < 0) { - fprintf (stderr, "parent: read from pipe failed (%s)\n", - strerror (errno)); - goto out; - } - - /* this will force a sync on cached-write and now that quota - limit is increased, sync will be successful. ignore return - value as fstat would fail with EDQUOT (picked up from - cached-write because of previous sync failure. - */ - fstat (fd, &stbuf); - - ret = pread (fd, buf, 128, 0); - if (ret != len) { - fprintf (stderr, "post cmd read failed %d (data:%s) " - "(error:%s)\n", ret, buf, strerror (errno)); - goto out; - } - - if (strcmp (buf, "test-content")) { - fprintf (stderr, "wrong data (%s)\n", buf); - goto out; - } - } - - ret = 0; + ret = 0; out: - return ret; + return ret; } diff --git a/tests/bugs/write-behind/issue-884.c b/tests/bugs/write-behind/issue-884.c new file mode 100644 index 00000000000..e9c33b351ad --- /dev/null +++ b/tests/bugs/write-behind/issue-884.c @@ -0,0 +1,267 @@ + +#define _GNU_SOURCE + +#include <stdlib.h> +#include <stdio.h> +#include <string.h> +#include <time.h> +#include <assert.h> +#include <errno.h> +#include <sys/types.h> +#include <sys/stat.h> +#include <pthread.h> + +#include <glusterfs/api/glfs.h> + +/* Based on a reproducer by Stefan Ring. It seems to be quite sensible to any + * timing modification, so the code has been maintained as is, only with minor + * changes. */ + +struct glfs *glfs; + +pthread_mutex_t the_mutex = PTHREAD_MUTEX_INITIALIZER; +pthread_cond_t the_cond = PTHREAD_COND_INITIALIZER; + +typedef struct _my_aiocb { + int64_t size; + volatile int64_t seq; + int which; +} my_aiocb; + +typedef struct _worker_data { + my_aiocb cb; + struct iovec iov; + int64_t offset; +} worker_data; + +typedef struct { + worker_data wdata[2]; + + volatile unsigned busy; +} all_data_t; + +all_data_t all_data; + +static void +completion_fnc(struct glfs_fd *fd, ssize_t ret, struct glfs_stat *pre, + struct glfs_stat *post, void *arg) +{ + void *the_thread; + my_aiocb *cb = (my_aiocb *)arg; + long seq = cb->seq; + + assert(ret == cb->size); + + pthread_mutex_lock(&the_mutex); + pthread_cond_broadcast(&the_cond); + + all_data.busy &= ~(1 << cb->which); + cb->seq = -1; + + the_thread = (void *)pthread_self(); + printf("worker %d is done from thread %p, seq %ld!\n", cb->which, + the_thread, seq); + + pthread_mutex_unlock(&the_mutex); +} + +static void +init_wdata(worker_data *data, int which) +{ + data->cb.which = which; + data->cb.seq = -1; + + data->iov.iov_base = malloc(1024 * 1024); + memset(data->iov.iov_base, 6, + 1024 * 1024); /* tail part never overwritten */ +} + +static void +init() +{ + all_data.busy = 0; + + init_wdata(&all_data.wdata[0], 0); + init_wdata(&all_data.wdata[1], 1); +} + +static void +do_write(struct glfs_fd *fd, int content, int size, int64_t seq, + worker_data *wdata, const char *name) +{ + int ret; + + wdata->cb.size = size; + wdata->cb.seq = seq; + + if (content >= 0) + memset(wdata->iov.iov_base, content, size); + wdata->iov.iov_len = size; + + pthread_mutex_lock(&the_mutex); + printf("(%d) dispatching write \"%s\", offset %lx, len %x, seq %ld\n", + wdata->cb.which, name, (long)wdata->offset, size, (long)seq); + pthread_mutex_unlock(&the_mutex); + ret = glfs_pwritev_async(fd, &wdata->iov, 1, wdata->offset, 0, + completion_fnc, &wdata->cb); + assert(ret >= 0); +} + +#define IDLE 0 // both workers must be idle +#define ANY 1 // use any worker, other one may be busy + +int +get_worker(int waitfor, int64_t excl_seq) +{ + int which; + + pthread_mutex_lock(&the_mutex); + + while (waitfor == IDLE && (all_data.busy & 3) != 0 || + waitfor == ANY && + ((all_data.busy & 3) == 3 || + excl_seq >= 0 && (all_data.wdata[0].cb.seq == excl_seq || + all_data.wdata[1].cb.seq == excl_seq))) + pthread_cond_wait(&the_cond, &the_mutex); + + if (!(all_data.busy & 1)) + which = 0; + else + which = 1; + + all_data.busy |= (1 << which); + + pthread_mutex_unlock(&the_mutex); + + return which; +} + +static int +doit(struct glfs_fd *fd) +{ + int ret; + int64_t seq = 0; + int64_t offset = 0; // position in file, in blocks + int64_t base = 0x1000; // where to place the data, in blocks + + int async_mode = ANY; + + init(); + + for (;;) { + int which; + worker_data *wdata; + + // for growing to the first offset + for (;;) { + int gap = base + 0x42 - offset; + if (!gap) + break; + if (gap > 80) + gap = 80; + + which = get_worker(IDLE, -1); + wdata = &all_data.wdata[which]; + + wdata->offset = offset << 9; + do_write(fd, 0, gap << 9, seq++, wdata, "gap-filling"); + + offset += gap; + } + + // 8700 + which = get_worker(IDLE, -1); + wdata = &all_data.wdata[which]; + + wdata->offset = (base + 0x42) << 9; + do_write(fd, 1, 62 << 9, seq++, wdata, "!8700"); + + // 8701 + which = get_worker(IDLE, -1); + wdata = &all_data.wdata[which]; + + wdata->offset = (base + 0x42) << 9; + do_write(fd, 2, 55 << 9, seq++, wdata, "!8701"); + + // 8702 + which = get_worker(async_mode, -1); + wdata = &all_data.wdata[which]; + + wdata->offset = (base + 0x79) << 9; + do_write(fd, 3, 54 << 9, seq++, wdata, "!8702"); + + // 8703 + which = get_worker(async_mode, -1); + wdata = &all_data.wdata[which]; + + wdata->offset = (base + 0xaf) << 9; + do_write(fd, 4, 81 << 9, seq++, wdata, "!8703"); + + // 8704 + // this writes both 5s and 6s + // the range of 5s is the one that overwrites 8703 + + which = get_worker(async_mode, seq - 1); + wdata = &all_data.wdata[which]; + + memset(wdata->iov.iov_base, 5, 81 << 9); + wdata->offset = (base + 0xaf) << 9; + do_write(fd, -1, 1623 << 9, seq++, wdata, "!8704"); + + offset = base + 0x706; + base += 0x1000; + if (base >= 0x100000) + break; + } + + printf("done!\n"); + fflush(stdout); + + pthread_mutex_lock(&the_mutex); + + while ((all_data.busy & 3) != 0) + pthread_cond_wait(&the_cond, &the_mutex); + + pthread_mutex_unlock(&the_mutex); + + ret = glfs_close(fd); + assert(ret >= 0); + /* + ret = glfs_fini(glfs); + assert(ret >= 0); + */ + return 0; +} + +int +main(int argc, char *argv[]) +{ + int ret; + int open_flags = O_RDWR | O_DIRECT | O_TRUNC; + struct glfs_fd *fd; + + glfs = glfs_new(argv[1]); + if (!glfs) { + printf("glfs_new!\n"); + goto out; + } + ret = glfs_set_volfile_server(glfs, "tcp", "localhost", 24007); + if (ret < 0) { + printf("set_volfile!\n"); + goto out; + } + ret = glfs_init(glfs); + if (ret) { + printf("init!\n"); + goto out; + } + fd = glfs_open(glfs, argv[2], open_flags); + if (!fd) { + printf("open!\n"); + goto out; + } + srand(time(NULL)); + return doit(fd); +out: + return 1; +} diff --git a/tests/bugs/write-behind/issue-884.t b/tests/bugs/write-behind/issue-884.t new file mode 100755 index 00000000000..2bcf7d15265 --- /dev/null +++ b/tests/bugs/write-behind/issue-884.t @@ -0,0 +1,40 @@ +#!/bin/bash + +. $(dirname $0)/../../include.rc +. $(dirname $0)/../../volume.rc + +# This test tries to detect a race condition in write-behind. It's based on a +# reproducer written by Stefan Ring that is able to hit it sometimes. On my +# system, it happened around 10% of the runs. This means that if this bug +# appears again, this test will fail once every 10 runs. Most probably this +# failure will be hidden by the automatic test retry of the testing framework. +# +# Please, if this test fails, it needs to be analyzed in detail. + +function run() { + "${@}" >/dev/null +} + +cleanup + +TEST glusterd +TEST pidof glusterd + +TEST $CLI volume create $V0 $H0:$B0/$V0 +# This makes it easier to hit the issue +TEST $CLI volume set $V0 client-log-level TRACE +TEST $CLI volume start $V0 + +TEST $GFS --volfile-server=$H0 --volfile-id=$V0 $M0 + +build_tester $(dirname $0)/issue-884.c -lgfapi + +TEST touch $M0/testfile + +# This program generates a file of 535694336 bytes with a fixed pattern +TEST run $(dirname $0)/issue-884 $V0 testfile + +# This is the md5sum of the expected pattern without corruption +EXPECT "ad105f9349345a70fc697632cbb5eec8" echo "$(md5sum $B0/$V0/testfile | awk '{ print $1; }')" + +cleanup |
