diff options
| -rw-r--r-- | libglusterfs/src/fd.c | 17 | ||||
| -rw-r--r-- | libglusterfs/src/fd.h | 3 | ||||
| -rw-r--r-- | tests/bugs/bug-966018.t | 33 | ||||
| -rw-r--r-- | xlators/cluster/afr/src/afr-transaction.c | 3 | 
4 files changed, 56 insertions, 0 deletions
| diff --git a/libglusterfs/src/fd.c b/libglusterfs/src/fd.c index 2f4afc5e87a..36cc4d0561f 100644 --- a/libglusterfs/src/fd.c +++ b/libglusterfs/src/fd.c @@ -780,6 +780,23 @@ fd_anonymous (inode_t *inode)          return fd;  } +fd_t* +fd_lookup_anonymous (inode_t *inode) +{ +        fd_t *fd = NULL; + +        if (!inode) { +                gf_log_callingfn ("fd", GF_LOG_WARNING, "!inode"); +                return NULL; +        } + +        LOCK (&inode->lock); +        { +                fd = __fd_lookup_anonymous (inode); +        } +        UNLOCK (&inode->lock); +        return fd; +}  gf_boolean_t  fd_is_anonymous (fd_t *fd) diff --git a/libglusterfs/src/fd.h b/libglusterfs/src/fd.h index 54290b1980b..c1b9157d882 100644 --- a/libglusterfs/src/fd.h +++ b/libglusterfs/src/fd.h @@ -134,6 +134,9 @@ fd_lookup (struct _inode *inode, pid_t pid);  fd_t *  fd_lookup_uint64 (struct _inode *inode, uint64_t pid); +fd_t* +fd_lookup_anonymous (inode_t *inode); +  fd_t *  fd_anonymous (inode_t *inode); diff --git a/tests/bugs/bug-966018.t b/tests/bugs/bug-966018.t new file mode 100644 index 00000000000..f29690a1a03 --- /dev/null +++ b/tests/bugs/bug-966018.t @@ -0,0 +1,33 @@ +#!/bin/bash + +. $(dirname $0)/../include.rc +. $(dirname $0)/../volume.rc + +#This tests if eager-lock blocks metadata operations on nfs/fuse mounts. +#If it is not woken up, INODELK from the next command waits +#for post-op-delay secs. + +cleanup; +TEST glusterd +TEST pidof glusterd + +TEST $CLI volume create $V0 replica 2 $H0:$B0/r2_0 $H0:$B0/r2_1 +TEST $CLI volume set $V0 cluster.eager-lock on +TEST $CLI volume set $V0 cluster.post-op-delay-secs 3 + +TEST $CLI volume start $V0 +TEST $CLI volume profile $V0 start +sleep 5 +TEST mount -t nfs -o vers=3,nolock $H0:/$V0 $N0; +TEST glusterfs --entry-timeout=0 --attribute-timeout=0 -s $H0 --volfile-id=$V0 $M0 +echo 1 > $N0/1 && chmod +x $N0/1 +echo 1 > $M0/1 && chmod +x $M0/1 + +#Check that INODELK MAX latency is not in the order of seconds +#Test if the MAX INODELK fop latency is of the order of seconds. +inodelk_max_latency=$($CLI volume profile $V0 info | grep INODELK | awk 'BEGIN {max = 0} {if ($6 > max) max=$6;} END {print max}' | cut -d. -f 1 | egrep "[0-9]{7,}") + +TEST [ -z $inodelk_max_latency ] +TEST umount $N0 + +cleanup; diff --git a/xlators/cluster/afr/src/afr-transaction.c b/xlators/cluster/afr/src/afr-transaction.c index d20928d151d..a39eac9a204 100644 --- a/xlators/cluster/afr/src/afr-transaction.c +++ b/xlators/cluster/afr/src/afr-transaction.c @@ -1471,6 +1471,9 @@ afr_transaction (call_frame_t *frame, xlator_t *this, afr_transaction_type type)          if (!local->transaction.eager_lock_on && local->loc.inode) {                  fd = fd_lookup (local->loc.inode, frame->root->pid); +                if (fd == NULL) +                        fd = fd_lookup_anonymous (local->loc.inode); +                  if (fd) {                          afr_delayed_changelog_wake_up (this, fd);                          fd_unref (fd); | 
