233933
From ff8a74250209f4279f67dd89c3e57b2289a1b7d1 Mon Sep 17 00:00:00 2001
233933
From: Xavi Hernandez <xhernandez@redhat.com>
233933
Date: Thu, 9 May 2019 11:07:18 +0200
233933
Subject: [PATCH 144/169] cluster/ec: honor contention notifications for
233933
 partially acquired locks
233933
233933
EC was ignoring lock contention notifications received while a lock was
233933
being acquired. When a lock is partially acquired (some bricks have
233933
granted the lock but some others not yet) we can receive notifications
233933
from acquired bricks, which should be honored, since we may not receive
233933
more notifications after that.
233933
233933
Since EC was ignoring them, once the lock was acquired, it was not
233933
released until the eager-lock timeout, causing unnecessary delays on
233933
other clients.
233933
233933
This fix takes into consideration the notifications received before
233933
having completed the full lock acquisition. After that, the lock will
233933
be releaed as soon as possible.
233933
233933
Upstream patch:
233933
> BUG: 1708156
233933
> Upstream patch link: https://review.gluster.org/c/glusterfs/+/22690
233933
> Change-Id: I2a306dbdb29fb557dcab7788a258bd75d826cc12
233933
> Signed-off-by: Xavi Hernandez <xhernandez@redhat.com>
233933
233933
Fixes: bz#1703455
233933
Change-Id: I2a306dbdb29fb557dcab7788a258bd75d826cc12
233933
Signed-off-by: Xavi Hernandez <xhernandez@redhat.com>
233933
Reviewed-on: https://code.engineering.redhat.com/gerrit/171525
233933
Tested-by: RHGS Build Bot <nigelb@redhat.com>
233933
Reviewed-by: Sunil Kumar Heggodu Gopala Acharya <sheggodu@redhat.com>
233933
---
233933
 ...or-inodelk-contention-notify-on-partial-locks.t | 54 ++++++++++++++++++++++
233933
 xlators/cluster/ec/src/ec-common.c                 |  2 +-
233933
 2 files changed, 55 insertions(+), 1 deletion(-)
233933
 create mode 100644 tests/bugs/ec/bug-1708156-honor-inodelk-contention-notify-on-partial-locks.t
233933
233933
diff --git a/tests/bugs/ec/bug-1708156-honor-inodelk-contention-notify-on-partial-locks.t b/tests/bugs/ec/bug-1708156-honor-inodelk-contention-notify-on-partial-locks.t
233933
new file mode 100644
233933
index 0000000..67fdb18
233933
--- /dev/null
233933
+++ b/tests/bugs/ec/bug-1708156-honor-inodelk-contention-notify-on-partial-locks.t
233933
@@ -0,0 +1,54 @@
233933
+#!/bin/bash
233933
+
233933
+. $(dirname $0)/../../include.rc
233933
+. $(dirname $0)/../../volume.rc
233933
+
233933
+function do_ls() {
233933
+    local dir="${1}"
233933
+    local i
233933
+
233933
+    for i in {1..50}; do
233933
+        ls -l $M0/${dir} >/dev/null &
233933
+        ls -l $M1/${dir} >/dev/null &
233933
+        ls -l $M2/${dir} >/dev/null &
233933
+        ls -l $M3/${dir} >/dev/null &
233933
+    done
233933
+    wait
233933
+}
233933
+
233933
+function measure_time() {
233933
+    {
233933
+        LC_ALL=C
233933
+        time -p "${@}"
233933
+    } 2>&1 | awk '/^real/ { print $2 * 1000 }'
233933
+}
233933
+
233933
+cleanup
233933
+
233933
+TEST glusterd
233933
+TEST pidof glusterd
233933
+TEST $CLI volume create $V0 disperse 6 redundancy 2 $H0:$B0/${V0}{0..5}
233933
+
233933
+TEST $CLI volume set $V0 disperse.eager-lock on
233933
+TEST $CLI volume set $V0 disperse.other-eager-lock on
233933
+TEST $CLI volume set $V0 features.locks-notify-contention on
233933
+TEST $CLI volume set $V0 disperse.eager-lock-timeout 10
233933
+TEST $CLI volume set $V0 disperse.other-eager-lock-timeout 10
233933
+
233933
+TEST $CLI volume start $V0
233933
+TEST $GFS --volfile-id=/$V0 --volfile-server=$H0 $M0
233933
+TEST $GFS --volfile-id=/$V0 --volfile-server=$H0 $M1
233933
+TEST $GFS --volfile-id=/$V0 --volfile-server=$H0 $M2
233933
+TEST $GFS --volfile-id=/$V0 --volfile-server=$H0 $M3
233933
+EXPECT_WITHIN $CHILD_UP_TIMEOUT "6" ec_child_up_count $V0 0 $M0
233933
+EXPECT_WITHIN $CHILD_UP_TIMEOUT "6" ec_child_up_count $V0 0 $M1
233933
+EXPECT_WITHIN $CHILD_UP_TIMEOUT "6" ec_child_up_count $V0 0 $M2
233933
+EXPECT_WITHIN $CHILD_UP_TIMEOUT "6" ec_child_up_count $V0 0 $M3
233933
+TEST mkdir $M0/dir
233933
+TEST touch $M0/dir/file.{1..10}
233933
+
233933
+# Run multiple 'ls' concurrently from multiple clients so that they collide and
233933
+# cause partial locks.
233933
+TEST [[ $(measure_time do_ls dir) -lt 10000 ]]
233933
+
233933
+cleanup
233933
diff --git a/xlators/cluster/ec/src/ec-common.c b/xlators/cluster/ec/src/ec-common.c
233933
index b1ba5e9..e85aa8b 100644
233933
--- a/xlators/cluster/ec/src/ec-common.c
233933
+++ b/xlators/cluster/ec/src/ec-common.c
233933
@@ -2497,7 +2497,7 @@ ec_lock_release(ec_t *ec, inode_t *inode)
233933
         goto done;
233933
     }
233933
     lock = ctx->inode_lock;
233933
-    if ((lock == NULL) || !lock->acquired || lock->release) {
233933
+    if ((lock == NULL) || lock->release) {
233933
         goto done;
233933
     }
233933
 
233933
-- 
233933
1.8.3.1
233933