diff options
| -rw-r--r-- | libglusterfs/src/stack.h | 8 | ||||
| -rw-r--r-- | tests/bugs/io-cache/bug-read-hang.c | 125 | ||||
| -rwxr-xr-x | tests/bugs/io-cache/bug-read-hang.t | 30 | 
3 files changed, 160 insertions, 3 deletions
diff --git a/libglusterfs/src/stack.h b/libglusterfs/src/stack.h index 2899be9bf2f..393fdac8e73 100644 --- a/libglusterfs/src/stack.h +++ b/libglusterfs/src/stack.h @@ -275,17 +275,19 @@ STACK_RESET (call_stack_t *stack)  #define STACK_WIND_TAIL(frame, obj, fn, params ...)                     \          do {                                                            \                  xlator_t     *old_THIS = NULL;                          \ +                xlator_t     *next_xl = obj;                            \ +                typeof(fn)    next_xl_fn = fn;                          \                                                                          \ -                frame->this = obj;                                      \ +                frame->this = next_xl;                                  \                  frame->wind_to = #fn;                                   \                  old_THIS = THIS;                                        \ -                THIS = obj;                                             \ +                THIS = next_xl;                                         \                  gf_msg_trace ("stack-trace", 0,                         \                                "stack-address: %p, "                     \                                "winding from %s to %s",                  \                                frame->root, old_THIS->name,              \                                THIS->name);                              \ -                fn (frame, obj, params);                                \ +                next_xl_fn (frame, next_xl, params);                    \                  THIS = old_THIS;                                        \          } while (0) diff --git a/tests/bugs/io-cache/bug-read-hang.c b/tests/bugs/io-cache/bug-read-hang.c new file mode 100644 index 00000000000..74dfddd7a6e --- /dev/null +++ b/tests/bugs/io-cache/bug-read-hang.c @@ -0,0 +1,125 @@ +#include <glusterfs/api/glfs.h> +#include <glusterfs/api/glfs-handles.h> +#include <errno.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> + +#define NO_INIT 1 + +int count = 0; +void +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; +        } + +out: +        return fs; +error: +        return NULL; +} + +int +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); +        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/io-cache/bug-read-hang.t b/tests/bugs/io-cache/bug-read-hang.t new file mode 100755 index 00000000000..fb20c2c5515 --- /dev/null +++ b/tests/bugs/io-cache/bug-read-hang.t @@ -0,0 +1,30 @@ +#!/bin/bash + +. $(dirname $0)/../../include.rc +#. $(dirname $0)/../../volume.rc + +cleanup; + +#Basic checks +TEST glusterd +TEST pidof glusterd +TEST $CLI volume info + +TEST $CLI volume create $V0 replica 2 $H0:$B0/${V0}{1..2}; + +TEST $CLI volume set $V0 performance.md-cache-timeout 60 +TEST $CLI volume set $V0 open-behind off + +logdir=`gluster --print-logdir` + +TEST $CLI volume start $V0 + +TEST glusterfs --volfile-id=/$V0 --volfile-server=$H0 $M0 +echo "Hello" > $M0/test + +TEST build_tester $(dirname $0)/bug-read-hang.c -lgfapi +TEST $(dirname $0)/bug-read-hang $H0 $V0 $logdir/bug-read-hang.log + +cleanup_tester $(dirname $0)/bug-read-hang + +cleanup;  | 
