summaryrefslogtreecommitdiffstats
path: root/xlators/cluster/afr/src/afr-common.c
diff options
context:
space:
mode:
authorKrutika Dhananjay <kdhananj@redhat.com>2016-02-01 11:46:08 +0530
committerPranith Kumar Karampuri <pkarampu@redhat.com>2016-02-03 22:58:37 -0800
commitb8106d1127f034ffa88b5dd322c23a10e023b9b6 (patch)
treec6eb05975dc788c409044ca795bb962f5d764f24 /xlators/cluster/afr/src/afr-common.c
parent11202e6c726f79ddf0e461338d7dce158733122e (diff)
cluster/afr: Fix heal-info slow response while IO is in progress
Now heal-info does an open() on the file being examined so that the client at some point sees open-fd count being > 1 and releases the eager-lock so that heal-info doesn't remain blocked forever until IO completes. Change-Id: Icc478098e2bc7234408728b54d8185102b3540dc BUG: 1297695 Signed-off-by: Krutika Dhananjay <kdhananj@redhat.com> Reviewed-on: http://review.gluster.org/13326 Reviewed-by: Ravishankar N <ravishankar@redhat.com> Smoke: Gluster Build System <jenkins@build.gluster.com> Reviewed-by: Pranith Kumar Karampuri <pkarampu@redhat.com> Tested-by: Pranith Kumar Karampuri <pkarampu@redhat.com> NetBSD-regression: NetBSD Build System <jenkins@build.gluster.org> CentOS-regression: Gluster Build System <jenkins@build.gluster.com>
Diffstat (limited to 'xlators/cluster/afr/src/afr-common.c')
-rw-r--r--xlators/cluster/afr/src/afr-common.c17
1 files changed, 16 insertions, 1 deletions
diff --git a/xlators/cluster/afr/src/afr-common.c b/xlators/cluster/afr/src/afr-common.c
index f33e00a76a0..457f7865cec 100644
--- a/xlators/cluster/afr/src/afr-common.c
+++ b/xlators/cluster/afr/src/afr-common.c
@@ -4513,12 +4513,13 @@ afr_selfheal_locked_data_inspect (call_frame_t *frame, xlator_t *this,
gf_boolean_t *pflag)
{
int ret = -1;
- afr_private_t *priv = NULL;
unsigned char *locked_on = NULL;
unsigned char *data_lock = NULL;
unsigned char *sources = NULL;
unsigned char *sinks = NULL;
unsigned char *healed_sinks = NULL;
+ afr_private_t *priv = NULL;
+ fd_t *fd = NULL;
struct afr_reply *locked_replies = NULL;
priv = this->private;
@@ -4528,6 +4529,18 @@ afr_selfheal_locked_data_inspect (call_frame_t *frame, xlator_t *this,
sinks = alloca0 (priv->child_count);
healed_sinks = alloca0 (priv->child_count);
+ /* Heal-info does an open() on the file being examined so that the
+ * current eager-lock holding client, if present, at some point sees
+ * open-fd count being > 1 and releases the eager-lock so that heal-info
+ * doesn't remain blocked forever until IO completes.
+ */
+ ret = afr_selfheal_data_open (this, inode, &fd);
+ if (ret < 0) {
+ gf_msg_debug (this->name, -ret, "%s: Failed to open",
+ uuid_utoa (inode->gfid));
+ goto out;
+ }
+
locked_replies = alloca0 (sizeof (*locked_replies) * priv->child_count);
ret = afr_selfheal_tryinodelk (frame, this, inode, priv->sh_domain,
@@ -4565,6 +4578,8 @@ unlock:
out:
if (locked_replies)
afr_replies_wipe (locked_replies, priv->child_count);
+ if (fd)
+ fd_unref (fd);
return ret;
}