You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
115 lines
4.0 KiB
115 lines
4.0 KiB
3 years ago
|
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
|
||
|
|