diff options
author | Poornima G <pgurusid@redhat.com> | 2016-03-19 04:38:47 -0400 |
---|---|---|
committer | Niels de Vos <ndevos@redhat.com> | 2016-03-30 07:22:40 -0700 |
commit | 450a853f0059a7ed076253caa982913b08d0485b (patch) | |
tree | 05ad49dc01493084dddd3f2449fb0f3285dc9836 /tests | |
parent | 71d988919c75e1294eb417a92f0a495cf388002e (diff) |
gfapi: Fix the crashes caused by global_xlator and THIS
Issue: http://thread.gmane.org/gmane.comp.file-systems.gluster.devel/10922
The right fix for this is elaborate and intrusive, until it is in place,
this patch provides a temperory fix. This fix is necessary, as without this
libgfapi applications like qemu, samba, NFS ganesha are prone to crashes.
This patch will be reverted completely, once the actual fix gets accepted.
Credits: Rajesh Joseph, Raghavendra Talur, Anoop CS
Back-port of: http://review.gluster.org/#/c/13784/
Change-Id: I8a8a0572bea0eec94ece6aa0d7afcf2f459b4a43
BUG: 1319989
Signed-off-by: Poornima G <pgurusid@redhat.com>
Reviewed-on: http://review.gluster.org/13803
Smoke: Gluster Build System <jenkins@build.gluster.com>
NetBSD-regression: NetBSD Build System <jenkins@build.gluster.org>
CentOS-regression: Gluster Build System <jenkins@build.gluster.com>
Reviewed-by: Anoop C S <anoopcs@redhat.com>
Reviewed-by: Niels de Vos <ndevos@redhat.com>
Diffstat (limited to 'tests')
-rwxr-xr-x | tests/bugs/libgfapi/bug-1319374-THIS-crash.sh | 27 | ||||
-rw-r--r-- | tests/bugs/libgfapi/bug-1319374.c | 128 |
2 files changed, 155 insertions, 0 deletions
diff --git a/tests/bugs/libgfapi/bug-1319374-THIS-crash.sh b/tests/bugs/libgfapi/bug-1319374-THIS-crash.sh new file mode 100755 index 00000000000..9aea739377b --- /dev/null +++ b/tests/bugs/libgfapi/bug-1319374-THIS-crash.sh @@ -0,0 +1,27 @@ +#!/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 $H0:$B0/brick1 $H0:$B0/brick2; +EXPECT 'Created' volinfo_field $V0 'Status'; + +TEST $CLI volume start $V0; +EXPECT 'Started' volinfo_field $V0 'Status'; + +TEST $CLI volume set $V0 diagnostics.client-log-flush-timeout 30 + +logdir=`gluster --print-logdir` + +build_tester $(dirname $0)/bug-1319374.c -lgfapi +TEST $(dirname $0)/bug-1319374 $V0 $logdir/bug-1319374.log + +cleanup_tester $(dirname $0)/bug-1319374 + +cleanup; diff --git a/tests/bugs/libgfapi/bug-1319374.c b/tests/bugs/libgfapi/bug-1319374.c new file mode 100644 index 00000000000..878d897dde6 --- /dev/null +++ b/tests/bugs/libgfapi/bug-1319374.c @@ -0,0 +1,128 @@ +#include <glusterfs/api/glfs.h> +#include <glusterfs/api/glfs-handles.h> +#include <errno.h> +#include <stdio.h> +#include <stdlib.h> + +#define NO_INIT 1 + +glfs_t * +setup_new_client(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", "localhost", 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; +error: + return NULL; +} + +int +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; + + if (argc != 3) { + fprintf (stderr, + "Expect following args %s <Vol> <log file location>\n" + , argv[0]); + return -1; + } + + volname = argv[1]; + log_file = argv[2]; + + fs1 = setup_new_client (volname, log_file, NO_INIT); + if (!fs1) { + fprintf (stderr, "\nsetup_new_client: returned NULL (%s)\n", + strerror (errno)); + goto error; + } + + fs2 = setup_new_client (volname, log_file, 0); + if (!fs2) { + fprintf (stderr, "\nsetup_new_client: returned NULL (%s)\n", + strerror (errno)); + goto error; + } + + fs3 = setup_new_client (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; +} |