diff options
author | Pranith Kumar K <pkarampu@redhat.com> | 2014-11-14 14:23:31 +0530 |
---|---|---|
committer | Niels de Vos <ndevos@redhat.com> | 2015-02-11 02:14:21 -0800 |
commit | 069bc07126d32bc6319d587ff91aa0006ba5fac8 (patch) | |
tree | c8441317c39a97d26aa070c23449a657c095e3ff /xlators/features/locks/src/inodelk.c | |
parent | 72e84c17240bc46c1a040cb585c4a3c89c58903d (diff) |
features/locks: Add lk-owner checks in entrylk
Backport of http://review.gluster.com/9125
Problem:
entry self-heal in 3.6 and above, takes full lock on the directory only for the
duration of figuring out the xattrs of the directories where as 3.5 takes locks
through out the entry-self-heal. If the cluster is heterogeneous then there is
a chance that 3.6 self-heal is triggered and then 3.5 self-heal will also
triggered and both the self-heal daemons of 3.5 and 3.6 do self-heal.
Fix in 3.6.2 and above:
3.6.2 and above gets an entry lock on a very long name before entry self-heal
begins so that 3.5 entry self-heal will not get locks until 3.6.x entry
self-heal completes. Make 3.5 locks accept nested locks from same lk-owner,
client.
BUG: 1177339
Change-Id: I65d4c3732d1e074720422533f85f6e13f933ecad
Signed-off-by: Pranith Kumar K <pkarampu@redhat.com>
Reviewed-on: http://review.gluster.org/9352
Reviewed-by: Krutika Dhananjay <kdhananj@redhat.com>
Tested-by: Gluster Build System <jenkins@build.gluster.com>
Reviewed-by: Niels de Vos <ndevos@redhat.com>
Diffstat (limited to 'xlators/features/locks/src/inodelk.c')
-rw-r--r-- | xlators/features/locks/src/inodelk.c | 12 |
1 files changed, 12 insertions, 0 deletions
diff --git a/xlators/features/locks/src/inodelk.c b/xlators/features/locks/src/inodelk.c index 8866cf759dc..d6f17db14d8 100644 --- a/xlators/features/locks/src/inodelk.c +++ b/xlators/features/locks/src/inodelk.c @@ -224,6 +224,18 @@ __lock_inodelk (xlator_t *this, pl_inode_t *pl_inode, pl_inode_lock_t *lock, goto out; } + /* To prevent blocked locks starvation, check if there are any blocked + * locks thay may conflict with this lock. If there is then don't grant + * the lock. BUT grant the lock if the owner already has lock to allow + * nested locks. + * Example: + * SHD from Machine1 takes (gfid, 0-infinity) and is granted. + * SHD from machine2 takes (gfid, 0-infinity) and is blocked. + * When SHD from Machine1 takes (gfid, 0-128KB) it + * needs to be granted, without which the earlier lock on 0-infinity + * will not be unlocked by SHD from Machine1. + * TODO: Find why 'owner_has_lock' is checked even for blocked locks. + */ if (__blocked_lock_conflict (dom, lock) && !(__owner_has_lock (dom, lock))) { ret = -EAGAIN; if (can_block == 0) |