diff options
author | Raghavendra Bhat <raghavendrabhat@gluster.com> | 2012-05-11 18:11:31 +0530 |
---|---|---|
committer | Vijay Bellur <vijay@gluster.com> | 2012-05-17 03:49:55 -0700 |
commit | 07c9a96627932ad3fc8c99193f8cfdae522ca9c1 (patch) | |
tree | a170c481afc65c60ea0d8bf451fec508af3d519c | |
parent | cbcf82aa58058fe05dbd9a8d8879ca0364e5df95 (diff) |
libglusterfs/fd: while dumping the fd_ctx use fd->xl_count
While dumping the fd_ctx when statedump is issued fd->xl_count should be
used to determine the number of xlators instead of using latest graph's count,
since while creating the fd only those many slots would have been allocated
as the number of xlators in the graph at that instant. Then the graph would have
changed, thus the xl count.
All the above things should happen before any operation is done on fd, otherwise
fd_ctx_set will allocate the extra slots for the new xlators present in the
graph.
Also added the program which can be used to reproduce the bug.
Change-Id: I11fe75d71ef5d37e29e2958d53752aa31098c313
BUG: 820887
Signed-off-by: Raghavendra Bhat <raghavendrabhat@gluster.com>
Reviewed-on: http://review.gluster.com/3335
Tested-by: Gluster Build System <jenkins@build.gluster.com>
Reviewed-by: Vijay Bellur <vijay@gluster.com>
-rw-r--r-- | extras/test/open-fd-tests.c | 64 | ||||
-rw-r--r-- | libglusterfs/src/fd.c | 8 |
2 files changed, 67 insertions, 5 deletions
diff --git a/extras/test/open-fd-tests.c b/extras/test/open-fd-tests.c new file mode 100644 index 00000000000..4184079d043 --- /dev/null +++ b/extras/test/open-fd-tests.c @@ -0,0 +1,64 @@ + +#include <stdio.h> +#include <fcntl.h> +#include <unistd.h> +#include <sys/types.h> +#include <sys/stat.h> +#include <attr/xattr.h> +#include <errno.h> +#include <string.h> + +int +main (int argc, char *argv[]) +{ + int ret = -1; + int fd = 0; + char *filename = NULL; + int loop = 0; + struct stat stbuf = {0,}; + char string[1024] = {0,}; + + if (argc > 1) + filename = argv[1]; + + if (!filename) + filename = "temp-fd-test-file"; + + fd = open (filename, O_RDWR|O_CREAT|O_TRUNC); + if (fd < 0) { + fd = 0; + fprintf (stderr, "open failed : %s\n", strerror (errno)); + goto out; + } + + while (loop < 1000) { + /* Use it as a mechanism to test time delays */ + memset (string, 0, 1024); + scanf ("%s", string); + + ret = write (fd, string, strlen (string)); + if (ret != strlen (string)) { + fprintf (stderr, "write failed : %s (%s %d)\n", + strerror (errno), string, loop); + goto out; + } + + ret = write (fd, "\n", 1); + if (ret != 1) { + fprintf (stderr, "write failed : %s (%d)\n", + strerror (errno), loop); + goto out; + } + + loop++; + } + + fprintf (stdout, "finishing the test after %d loops\n", loop); + + ret = 0; +out: + if (fd) + close (fd); + + return ret; +} diff --git a/libglusterfs/src/fd.c b/libglusterfs/src/fd.c index db92ee00ad1..3a7a592786c 100644 --- a/libglusterfs/src/fd.c +++ b/libglusterfs/src/fd.c @@ -1030,15 +1030,13 @@ fd_ctx_dump (fd_t *fd, char *prefix) LOCK (&fd->lock); { if (fd->_ctx != NULL) { - fd_ctx = GF_CALLOC (fd->inode->table->xl->graph->xl_count, - sizeof (*fd_ctx), + fd_ctx = GF_CALLOC (fd->xl_count, sizeof (*fd_ctx), gf_common_mt_fd_ctx); if (fd_ctx == NULL) { goto unlock; } - for (i = 0; i < fd->inode->table->xl->graph->xl_count; - i++) { + for (i = 0; i < fd->xl_count; i++) { fd_ctx[i] = fd->_ctx[i]; } } @@ -1050,7 +1048,7 @@ unlock: goto out; } - for (i = 0; i < fd->inode->table->xl->graph->xl_count; i++) { + for (i = 0; i < fd->xl_count; i++) { if (fd_ctx[i].xl_key) { xl = (xlator_t *)(long)fd_ctx[i].xl_key; if (xl->dumpops && xl->dumpops->fdctx) |