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.
114 lines
4.0 KiB
114 lines
4.0 KiB
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 |
|
|
|
|