summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRavishankar N <ravishankar@redhat.com>2017-09-15 14:49:50 +0530
committerShyamsundar Ranganathan <srangana@redhat.com>2017-09-17 13:37:32 +0000
commitd3b0205dbd299ff69883133ce22ca9d0623e87e2 (patch)
treeb9cf14264e55fc9910b04a5e0764df42f3c1d256
parentd31c45e659d0fd0b740ecfb98b3b92dc8dcca039 (diff)
afr: heal metadata in discover code path
****************************************************** Backport of: https://review.gluster.org/18202 Also added loc_is_nameless() to libglusterfs since the patch that introduced it in master was not backported to release-3.10. Note: 18202 is a squash of 17850 and 18187 in master. ****************************************************** During graph switch, if fuse sends nameless (gfid) lookups, afr takes the discover code path to serve it. If there are pending metadata heals, they do not happen unless an inode refresh happens as a part of discover (which is not guaranteed to happen always). This patch fixes it by attempting metadata heal as a part of discover, just like how it is done in lookup code path. Change-Id: I87c493045b9225741cad173bf3f645848697032e BUG: 1492010 Signed-off-by: Ravishankar N <ravishankar@redhat.com> Reviewed-on: https://review.gluster.org/18304 Smoke: Gluster Build System <jenkins@build.gluster.org> Reviewed-by: Pranith Kumar Karampuri <pkarampu@redhat.com> CentOS-regression: Gluster Build System <jenkins@build.gluster.org> Reviewed-by: Shyamsundar Ranganathan <srangana@redhat.com>
-rw-r--r--libglusterfs/src/xlator.c13
-rw-r--r--libglusterfs/src/xlator.h1
-rw-r--r--xlators/cluster/afr/src/afr-common.c59
-rw-r--r--xlators/cluster/afr/src/afr-self-heal.h4
4 files changed, 60 insertions, 17 deletions
diff --git a/libglusterfs/src/xlator.c b/libglusterfs/src/xlator.c
index 0d09b3fbc82..16da028dc09 100644
--- a/libglusterfs/src/xlator.c
+++ b/libglusterfs/src/xlator.c
@@ -1025,6 +1025,19 @@ out:
return ret;
}
+gf_boolean_t
+loc_is_nameless (loc_t *loc)
+{
+ gf_boolean_t ret = _gf_false;
+
+ GF_VALIDATE_OR_GOTO ("xlator", loc, out);
+
+ if ((!loc->parent && gf_uuid_is_null (loc->pargfid)) || !loc->name)
+ ret = _gf_true;
+out:
+ return ret;
+}
+
int
xlator_destroy (xlator_t *xl)
{
diff --git a/libglusterfs/src/xlator.h b/libglusterfs/src/xlator.h
index c2959efbd95..5fb26547d56 100644
--- a/libglusterfs/src/xlator.h
+++ b/libglusterfs/src/xlator.h
@@ -1029,6 +1029,7 @@ void loc_pargfid (loc_t *loc, uuid_t pargfid);
char* loc_gfid_utoa (loc_t *loc);
gf_boolean_t loc_is_root (loc_t *loc);
int32_t loc_build_child (loc_t *child, loc_t *parent, char *name);
+gf_boolean_t loc_is_nameless (loc_t *loc);
int xlator_mem_acct_init (xlator_t *xl, int num_types);
int is_gf_log_command (xlator_t *trans, const char *name, char *value);
int glusterd_check_log_level (const char *value);
diff --git a/xlators/cluster/afr/src/afr-common.c b/xlators/cluster/afr/src/afr-common.c
index bd8acb6abb7..73550befc23 100644
--- a/xlators/cluster/afr/src/afr-common.c
+++ b/xlators/cluster/afr/src/afr-common.c
@@ -60,6 +60,9 @@ int
afr_fav_child_reset_sink_xattrs_cbk (int ret, call_frame_t *frame,
void *opaque);
+static void
+afr_discover_done (call_frame_t *frame, xlator_t *this);
+
gf_boolean_t
afr_is_consistent_io_possible (afr_local_t *local, afr_private_t *priv,
int32_t *op_errno)
@@ -1037,7 +1040,7 @@ int
afr_refresh_selfheal_done (int ret, call_frame_t *heal, void *opaque)
{
if (heal)
- STACK_DESTROY (heal->root);
+ AFR_STACK_DESTROY (heal);
return 0;
}
@@ -2421,13 +2424,25 @@ afr_lookup_sh_metadata_wrap (void *opaque)
"Unable to set link-count in dict ");
}
- inode = afr_selfheal_unlocked_lookup_on (frame, local->loc.parent,
- local->loc.name, local->replies,
- local->child_up, dict);
+ if (loc_is_nameless (&local->loc)) {
+ ret = afr_selfheal_unlocked_discover_on (frame, local->inode,
+ local->loc.gfid,
+ local->replies,
+ local->child_up);
+ } else {
+ inode = afr_selfheal_unlocked_lookup_on (frame,
+ local->loc.parent,
+ local->loc.name,
+ local->replies,
+ local->child_up, dict);
+ }
if (inode)
inode_unref (inode);
out:
- afr_lookup_done (frame, this);
+ if (loc_is_nameless (&local->loc))
+ afr_discover_done (frame, this);
+ else
+ afr_lookup_done (frame, this);
if (dict)
dict_unref (dict);
@@ -2492,21 +2507,29 @@ afr_lookup_metadata_heal_check (call_frame_t *frame, xlator_t *this)
{
call_frame_t *heal = NULL;
+ afr_local_t *local = NULL;
int ret = 0;
+ local = frame->local;
if (!afr_can_start_metadata_self_heal (frame, this))
goto out;
- heal = copy_frame (frame);
- if (heal)
- heal->root->pid = GF_CLIENT_PID_SELF_HEALD;
+ heal = afr_frame_create (this);
+ if (!heal)
+ goto out;
+
ret = synctask_new (this->ctx->env, afr_lookup_sh_metadata_wrap,
afr_refresh_selfheal_done, heal, frame);
- if(ret)
+ if (ret)
goto out;
return ret;
out:
- afr_lookup_done (frame, this);
+ if (loc_is_nameless (&local->loc))
+ afr_discover_done (frame, this);
+ else
+ afr_lookup_done (frame, this);
+ if (heal)
+ AFR_STACK_DESTROY (heal);
return ret;
}
@@ -2587,13 +2610,15 @@ afr_lookup_entry_heal (call_frame_t *frame, xlator_t *this)
}
if (need_heal) {
- heal = copy_frame (frame);
- if (heal)
- heal->root->pid = GF_CLIENT_PID_SELF_HEALD;
+ heal = afr_frame_create (this);
+ if (!heal)
+ goto metadata_heal;
ret = synctask_new (this->ctx->env, afr_lookup_selfheal_wrap,
afr_refresh_selfheal_done, heal, frame);
- if (ret)
+ if (ret) {
+ AFR_STACK_DESTROY (heal);
goto metadata_heal;
+ }
return ret;
}
metadata_heal:
@@ -2755,8 +2780,8 @@ afr_discover_cbk (call_frame_t *frame, void *cookie, xlator_t *this,
call_count = afr_frame_return (frame);
if (call_count == 0) {
- afr_set_need_heal (this, local);
- afr_discover_done (frame, this);
+ afr_set_need_heal (this, local);
+ afr_lookup_metadata_heal_check (frame, this);
}
return 0;
@@ -2969,7 +2994,7 @@ afr_lookup (call_frame_t *frame, xlator_t *this, loc_t *loc, dict_t *xattr_req)
void *gfid_req = NULL;
int ret = 0;
- if (!loc->parent && gf_uuid_is_null (loc->pargfid)) {
+ if (loc_is_nameless (loc)) {
if (xattr_req)
dict_del (xattr_req, "gfid-req");
afr_discover (frame, this, loc, xattr_req);
diff --git a/xlators/cluster/afr/src/afr-self-heal.h b/xlators/cluster/afr/src/afr-self-heal.h
index 04463cccfc9..ded4903a4c7 100644
--- a/xlators/cluster/afr/src/afr-self-heal.h
+++ b/xlators/cluster/afr/src/afr-self-heal.h
@@ -145,6 +145,10 @@ int
afr_selfheal_unlocked_discover (call_frame_t *frame, inode_t *inode,
uuid_t gfid, struct afr_reply *replies);
+int
+afr_selfheal_unlocked_discover_on (call_frame_t *frame, inode_t *inode,
+ uuid_t gfid, struct afr_reply *replies,
+ unsigned char *discover_on);
inode_t *
afr_selfheal_unlocked_lookup_on (call_frame_t *frame, inode_t *parent,
const char *name, struct afr_reply *replies,