diff options
author | Pranith Kumar K <pranithk@gluster.com> | 2011-09-02 08:50:48 +0530 |
---|---|---|
committer | Anand Avati <avati@gluster.com> | 2011-09-08 20:33:55 -0700 |
commit | 550148f3bb3505335909cde9e937c2362a1e67e3 (patch) | |
tree | c84f99aef6ab39f2d8c3fad8a6ae11e90fdd8014 /xlators/cluster/afr/src/afr-inode-write.c | |
parent | 4d2afaae2f3c42b710acf8c7ebdb4b50d502b813 (diff) |
cluster/afr: Make data selfheal trigger to be configurable.
By default, lookup triggers data self-heal but that is not the preferred way
of operating replicated volumes. We would like the data self heals to be
triggered in open instead.
Number of back-ground self-heals allowed is 16 and lookups block until
self-heal is completed. We want to prevent blocking in fops. We can not make
lookups independent of self-heal frames because when there are gfid conflicts
the decision of which file is correct is determined in self-heal phase.
So in afr, lookup self-heal is going to guarantee name space consistency
and open/fd fops will take responsibility for data consistency, these
are non blocking. The user needs to set the option cluster.data-self-heal
"open" for this behavior.
Change-Id: If9463cdb9ebac114708558ec13bbca0270acd659
BUG: 3503
Reviewed-on: http://review.gluster.com/334
Tested-by: Gluster Build System <jenkins@build.gluster.com>
Reviewed-by: Anand Avati <avati@gluster.com>
Diffstat (limited to 'xlators/cluster/afr/src/afr-inode-write.c')
-rw-r--r-- | xlators/cluster/afr/src/afr-inode-write.c | 22 |
1 files changed, 10 insertions, 12 deletions
diff --git a/xlators/cluster/afr/src/afr-inode-write.c b/xlators/cluster/afr/src/afr-inode-write.c index b40af1b069f..c6d7b5f2219 100644 --- a/xlators/cluster/afr/src/afr-inode-write.c +++ b/xlators/cluster/afr/src/afr-inode-write.c @@ -325,22 +325,20 @@ afr_trigger_open_fd_self_heal (call_frame_t *frame, xlator_t *this) { afr_local_t *local = NULL; afr_self_heal_t *sh = NULL; - char sh_type_str[256] = {0}; + inode_t *inode = NULL; + char *reason = NULL; local = frame->local; sh = &local->self_heal; + inode = local->fd->inode; - sh->need_missing_entry_self_heal = _gf_true; - sh->need_gfid_self_heal = _gf_true; - sh->need_data_self_heal = _gf_true; - afr_self_heal_type_str_get(&local->self_heal, sh_type_str, - sizeof(sh_type_str)); - gf_log (this->name, GF_LOG_INFO, "%s self-heal triggered. " - "path: %s, reason: Replicate up down flush, data lock " - "is held", sh_type_str, local->loc.path); - - afr_launch_self_heal (frame, this, local->fd->inode, _gf_true, - local->fd->inode->ia_type, NULL, NULL); + sh->do_missing_entry_self_heal = _gf_true; + sh->do_gfid_self_heal = _gf_true; + sh->do_data_self_heal = _gf_true; + + reason = "subvolume came online"; + afr_launch_self_heal (frame, this, inode, _gf_true, inode->ia_type, + reason, NULL, NULL); } int |