diff options
author | Xavier Hernandez <xhernandez@datalab.es> | 2015-01-30 11:47:11 +0100 |
---|---|---|
committer | Raghavendra Bhat <raghavendra@redhat.com> | 2015-03-30 00:22:32 -0700 |
commit | 3d76e803e7c7197c49bfcb7fdba9cd8f0a6cb542 (patch) | |
tree | 1a464fdc5586049dad11085e2ef1b5ce64ffeafa | |
parent | bd7f4451aef70c4c968d3ca4e5996ffc96cf64fa (diff) |
ec: Special handling of anonymous fdv3.6.3beta2
Anonymous file descriptors need to be handled specially because
they can be used in some non standard ways (i.e. an anonymous fd
can be used without having been opened).
This caused NFS to fail on some operations because ec always
expected to have a previous successful opendir call (from patch
http://review.gluster.org/9098/).
This patch treats all anonymous fd as opened on all subvolumes.
This is a backport of http://review.gluster.org/9513/
Change-Id: I09dbbce2ffc1ae3a5bcbb328bed55b84f4f0b9f8
BUG: 1187526
Signed-off-by: Xavier Hernandez <xhernandez@datalab.es>
Reviewed-on: http://review.gluster.org/9596
Reviewed-by: Pranith Kumar Karampuri <pkarampu@redhat.com>
Tested-by: Pranith Kumar Karampuri <pkarampu@redhat.com>
Reviewed-by: Dan Lambright <dlambrig@redhat.com>
Tested-by: Gluster Build System <jenkins@build.gluster.com>
Reviewed-by: Raghavendra Bhat <raghavendra@redhat.com>
-rw-r--r-- | tests/bugs/bug-1187474.t | 40 | ||||
-rw-r--r-- | xlators/cluster/ec/src/ec-helpers.c | 22 |
2 files changed, 51 insertions, 11 deletions
diff --git a/tests/bugs/bug-1187474.t b/tests/bugs/bug-1187474.t new file mode 100644 index 00000000000..27608125554 --- /dev/null +++ b/tests/bugs/bug-1187474.t @@ -0,0 +1,40 @@ +#!/bin/bash + +. $(dirname $0)/../include.rc +. $(dirname $0)/../volume.rc +. $(dirname $0)/../nfs.rc + +function check_dir() +{ + local count + + count=`ls $1 | grep "dir.[0-9]*" | wc -l` + if [[ $count -eq 100 ]]; then + echo "Y" + else + echo "N" + fi +} + +cleanup + +TEST glusterd +TEST pidof glusterd +TEST $CLI volume create $V0 redundancy 2 $H0:$B0/${V0}{0..5} +EXPECT "Created" volinfo_field $V0 'Status' +TEST $CLI volume start $V0 +EXPECT_WITHIN $PROCESS_UP_TIMEOUT "Started" volinfo_field $V0 'Status' +EXPECT_WITHIN $NFS_EXPORT_TIMEOUT "1" is_nfs_export_available +TEST mount_nfs $H0:/$V0 $N0 +TEST glusterfs --entry-timeout=0 --attribute-timeout=0 --volfile-id=/$V0 --volfile-server=$H0 $M0 +EXPECT_WITHIN $CHILD_UP_TIMEOUT "6" ec_child_up_count $V0 0 + +TEST mkdir $M0/dir.{1..100} + +sleep 2 + +EXPECT "Y" check_dir $N0 + +EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" umount_nfs $N0 + +cleanup diff --git a/xlators/cluster/ec/src/ec-helpers.c b/xlators/cluster/ec/src/ec-helpers.c index 5965c1045a6..11e0b00f2eb 100644 --- a/xlators/cluster/ec/src/ec-helpers.c +++ b/xlators/cluster/ec/src/ec-helpers.c @@ -630,11 +630,6 @@ ec_fd_t * __ec_fd_get(fd_t * fd, xlator_t * xl) ec_fd_t * ctx = NULL; uint64_t value = 0; - if (fd->anonymous) - { - return NULL; - } - if ((__fd_ctx_get(fd, xl, &value) != 0) || (value == 0)) { ctx = GF_MALLOC(sizeof(*ctx), ec_mt_ec_fd_t); @@ -656,6 +651,14 @@ ec_fd_t * __ec_fd_get(fd_t * fd, xlator_t * xl) ctx = (ec_fd_t *)(uintptr_t)value; } + /* Treat anonymous fd specially */ + if (fd->anonymous) { + /* Mark the fd open for all subvolumes. */ + ctx->open = -1; + /* Try to populate ctx->loc with fd->inode information. */ + ec_loc_update(xl, &ctx->loc, fd->inode, NULL); + } + return ctx; } @@ -663,14 +666,11 @@ ec_fd_t * ec_fd_get(fd_t * fd, xlator_t * xl) { ec_fd_t * ctx = NULL; - if (!fd->anonymous) - { - LOCK(&fd->lock); + LOCK(&fd->lock); - ctx = __ec_fd_get(fd, xl); + ctx = __ec_fd_get(fd, xl); - UNLOCK(&fd->lock); - } + UNLOCK(&fd->lock); return ctx; } |