From c7b933bc460bf47a8d4404055bf1a52225a138cb Mon Sep 17 00:00:00 2001 From: Ravishankar N Date: Thu, 11 Oct 2018 06:31:40 +0530 Subject: afr: prevent winding inodelks twice for arbiter volumes Backport of https://review.gluster.org/#/c/glusterfs/+/21380/ Problem: In an arbiter volume, if there is a pending data heal of a file only on arbiter brick, self-heal takes inodelks twice due to a code-bug but unlocks it only once, leaving behind a stale lock on the brick. This causes the next write to the file to hang. Fix: Fix the code-bug to take lock only once. This bug was introduced master with commit eb472d82a083883335bc494b87ea175ac43471ff Thanks to Pranith Kumar K for finding the RCA. fixes: bz#1638159 Change-Id: I15ad969e10a6a3c4bd255e2948b6be6dcddc61e1 Signed-off-by: Ravishankar N --- xlators/cluster/afr/src/afr-self-heal-data.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'xlators/cluster') diff --git a/xlators/cluster/afr/src/afr-self-heal-data.c b/xlators/cluster/afr/src/afr-self-heal-data.c index f1b9eddf21c..be4e693b3a4 100644 --- a/xlators/cluster/afr/src/afr-self-heal-data.c +++ b/xlators/cluster/afr/src/afr-self-heal-data.c @@ -731,7 +731,7 @@ restore_time: afr_selfheal_restore_time(frame, this, fd->inode, source, healed_sinks, locked_replies); - if (!is_arbiter_the_only_sink || !empty_file) { + if (!is_arbiter_the_only_sink && !empty_file) { ret = afr_selfheal_inodelk(frame, this, fd->inode, this->name, 0, 0, data_lock); if (ret < priv->child_count) { -- cgit