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