diff options
author | Pranith Kumar K <pkarampu@redhat.com> | 2014-11-14 14:23:31 +0530 |
---|---|---|
committer | Pranith Kumar Karampuri <pkarampu@redhat.com> | 2014-12-26 23:20:30 -0800 |
commit | 02b2172d9bc1557b3459388969077c75b659da82 (patch) | |
tree | 2e32ea4cdbb0decaff9f8012209cd8a05b68190a /xlators/features/locks/src/inodelk.c | |
parent | 7926fe6f7df664bbe5e050a8e66240dd67155eec (diff) |
features/locks: Add lk-owner checks in entrylk
For backward compatibility of entry-self-heal we need
entrylks to be accepted by same lk-owner and same client.
This patch introduces these changes.
Change-Id: I67004cc5e657ba5ac09ceefbea823afdf06929e0
BUG: 1168189
Signed-off-by: Pranith Kumar K <pkarampu@redhat.com>
Reviewed-on: http://review.gluster.org/9125
Reviewed-by: Krutika Dhananjay <kdhananj@redhat.com>
Tested-by: Gluster Build System <jenkins@build.gluster.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 ef06531cfde..9860e9f9079 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) |