diff options
author | Raghavendra G <raghavendra@gluster.com> | 2012-11-20 12:30:13 +0530 |
---|---|---|
committer | Vijay Bellur <vbellur@redhat.com> | 2012-11-27 22:45:02 -0800 |
commit | dbc0968db04f09a57b3a2165803f8103c98c9acb (patch) | |
tree | 6badab3f4fcd73346e7d23bc008be12ec3ef8493 | |
parent | 228f0ea02b259b2a80edc9f92c2508635085f871 (diff) |
mount/fuse: add test cases for lock migration
Change-Id: I1a48c63387c7803b36584070fd8f3684ccb696b1
BUG: 808400
Signed-off-by: Raghavendra G <raghavendra@gluster.com>
Reviewed-on: http://review.gluster.org/4209
Tested-by: Gluster Build System <jenkins@build.gluster.com>
Reviewed-by: Vijay Bellur <vbellur@redhat.com>
-rwxr-xr-x | tests/bugs/bug-808400-dist.t | 57 | ||||
-rw-r--r-- | tests/bugs/bug-808400-fcntl.c | 113 | ||||
-rw-r--r-- | tests/bugs/bug-808400-flock.c | 92 | ||||
-rwxr-xr-x | tests/bugs/bug-808400-repl.t | 57 | ||||
-rwxr-xr-x | tests/bugs/bug-808400-stripe.t | 57 | ||||
-rwxr-xr-x | tests/bugs/bug-808400.t | 57 |
6 files changed, 433 insertions, 0 deletions
diff --git a/tests/bugs/bug-808400-dist.t b/tests/bugs/bug-808400-dist.t new file mode 100755 index 00000000000..7bbca18daef --- /dev/null +++ b/tests/bugs/bug-808400-dist.t @@ -0,0 +1,57 @@ +#!/bin/bash + +. $(dirname $0)/../include.rc + +cleanup; + +TEST glusterd +TEST pidof glusterd +TEST $CLI volume info; + +function volinfo_field() +{ + local vol=$1; + local field=$2; + + $CLI volume info $vol | grep "^$field: " | sed 's/.*: //'; +} + +TEST $CLI volume create $V0 $H0:$B0/brick1 $H0:$B0/brick2; +EXPECT 'Created' volinfo_field $V0 'Status'; + +TEST $CLI volume start $V0; +EXPECT 'Started' volinfo_field $V0 'Status'; + +#mount on a random dir +TEST MOUNTDIR="/tmp/$RANDOM" +TEST mkdir $MOUNTDIR +TEST glusterfs --entry-timeout=0 --attribute-timeout=0 --volfile-server=$H0 --volfile-id=$V0 $MOUNTDIR; + +function cleanup_tester () +{ + local exe=$1 + rm -f $exe +} + +function build_tester () +{ + local cfile=$1 + local fname=$(basename "$cfile") + local ext="${fname##*.}" + local execname="${fname%.*}" + gcc -g -o $(dirname $cfile)/$execname $cfile +} + +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 + +TEST umount $MOUNTDIR -l +TEST rm -rf $MOUNTDIR + +cleanup;
\ No newline at end of file diff --git a/tests/bugs/bug-808400-fcntl.c b/tests/bugs/bug-808400-fcntl.c new file mode 100644 index 00000000000..36e6cf035eb --- /dev/null +++ b/tests/bugs/bug-808400-fcntl.c @@ -0,0 +1,113 @@ +#include <sys/file.h> +#include <stdio.h> +#include <string.h> +#include <errno.h> +#include <sys/types.h> +#include <sys/stat.h> +#include <fcntl.h> +#include <sys/wait.h> + +int +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; +out: + return ret; +} + +int +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 = fstat (fd, &stbuf); + if (ret < 0) { + fprintf (stderr, "fstat 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 { + ret = 0; + } + } + +out: + return ret; +} diff --git a/tests/bugs/bug-808400-flock.c b/tests/bugs/bug-808400-flock.c new file mode 100644 index 00000000000..3a30a1d4b72 --- /dev/null +++ b/tests/bugs/bug-808400-flock.c @@ -0,0 +1,92 @@ +#include <sys/file.h> +#include <stdio.h> +#include <string.h> +#include <errno.h> +#include <sys/types.h> +#include <sys/stat.h> +#include <fcntl.h> +#include <sys/wait.h> + +int +run_child (char *filename) +{ + int fd = -1, ret = -1; + + 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 = 0; +out: + return ret; +} + +int +main (int argc, char *argv[]) +{ + 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; + } + + 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; + } + + ret = flock (fd, LOCK_EX); + if (ret < 0) { + fprintf (stderr, "flock failed (%s)\n", strerror (errno)); + goto out; + } + + system (cmd); + + /* wait till graph switch completes */ + ret = fstat (fd, &stbuf); + if (ret < 0) { + fprintf (stderr, "fstat 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 { + ret = 0; + } + } + +out: + return ret; +} diff --git a/tests/bugs/bug-808400-repl.t b/tests/bugs/bug-808400-repl.t new file mode 100755 index 00000000000..f7c368405b9 --- /dev/null +++ b/tests/bugs/bug-808400-repl.t @@ -0,0 +1,57 @@ +#!/bin/bash + +. $(dirname $0)/../include.rc + +cleanup; + +TEST glusterd +TEST pidof glusterd +TEST $CLI volume info; + +function volinfo_field() +{ + local vol=$1; + local field=$2; + + $CLI volume info $vol | grep "^$field: " | sed 's/.*: //'; +} + +TEST $CLI volume create $V0 replica 2 $H0:$B0/brick1 $H0:$B0/brick2; +EXPECT 'Created' volinfo_field $V0 'Status'; + +TEST $CLI volume start $V0; +EXPECT 'Started' volinfo_field $V0 'Status'; + +#mount on a random dir +TEST MOUNTDIR="/tmp/$RANDOM" +TEST mkdir $MOUNTDIR +TEST glusterfs --entry-timeout=0 --attribute-timeout=0 --volfile-server=$H0 --volfile-id=$V0 $MOUNTDIR; + +function cleanup_tester () +{ + local exe=$1 + rm -f $exe +} + +function build_tester () +{ + local cfile=$1 + local fname=$(basename "$cfile") + local ext="${fname##*.}" + local execname="${fname%.*}" + gcc -g -o $(dirname $cfile)/$execname $cfile +} + +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 + +TEST umount $MOUNTDIR -l +TEST rm -rf $MOUNTDIR + +cleanup;
\ No newline at end of file diff --git a/tests/bugs/bug-808400-stripe.t b/tests/bugs/bug-808400-stripe.t new file mode 100755 index 00000000000..3870ef76703 --- /dev/null +++ b/tests/bugs/bug-808400-stripe.t @@ -0,0 +1,57 @@ +#!/bin/bash + +. $(dirname $0)/../include.rc + +cleanup; + +TEST glusterd +TEST pidof glusterd +TEST $CLI volume info; + +function volinfo_field() +{ + local vol=$1; + local field=$2; + + $CLI volume info $vol | grep "^$field: " | sed 's/.*: //'; +} + +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'; + +#mount on a random dir +TEST MOUNTDIR="/tmp/$RANDOM" +TEST mkdir $MOUNTDIR +TEST glusterfs --entry-timeout=0 --attribute-timeout=0 --volfile-server=$H0 --volfile-id=$V0 $MOUNTDIR; + +function cleanup_tester () +{ + local exe=$1 + rm -f $exe +} + +function build_tester () +{ + local cfile=$1 + local fname=$(basename "$cfile") + local ext="${fname##*.}" + local execname="${fname%.*}" + gcc -g -o $(dirname $cfile)/$execname $cfile +} + +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 + +TEST umount $MOUNTDIR -l +TEST rm -rf $MOUNTDIR + +cleanup;
\ No newline at end of file diff --git a/tests/bugs/bug-808400.t b/tests/bugs/bug-808400.t new file mode 100755 index 00000000000..de6cb602e4b --- /dev/null +++ b/tests/bugs/bug-808400.t @@ -0,0 +1,57 @@ +#!/bin/bash + +. $(dirname $0)/../include.rc + +cleanup; + +TEST glusterd +TEST pidof glusterd +TEST $CLI volume info; + +function volinfo_field() +{ + local vol=$1; + local field=$2; + + $CLI volume info $vol | grep "^$field: " | sed 's/.*: //'; +} + +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'; + +#mount on a random dir +TEST MOUNTDIR="/tmp/$RANDOM" +TEST mkdir $MOUNTDIR +TEST glusterfs --entry-timeout=0 --attribute-timeout=0 --volfile-server=$H0 --volfile-id=$V0 $MOUNTDIR; + +function cleanup_tester () +{ + local exe=$1 + rm -f $exe +} + +function build_tester () +{ + local cfile=$1 + local fname=$(basename "$cfile") + local ext="${fname##*.}" + local execname="${fname%.*}" + gcc -g -o $(dirname $cfile)/$execname $cfile +} + +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 + +TEST umount $MOUNTDIR -l +TEST rm -rf $MOUNTDIR + +cleanup;
\ No newline at end of file |