diff options
author | Pranith Kumar K <pranithk@gluster.com> | 2012-04-01 15:48:26 +0530 |
---|---|---|
committer | Anand Avati <avati@redhat.com> | 2012-04-04 16:22:38 -0700 |
commit | 42a0889d93450e6f1f3472ec0818e678412346c2 (patch) | |
tree | bf016743dadee60295d4caf31f7244b5e5a48844 /xlators/cluster/afr/src/afr-self-heal-data.c | |
parent | 69f70038171862daedcbbccf0eaba3d1f8d885f5 (diff) |
cluster/afr: Handle self-heal of files with holes
Change-Id: I6c04fe3022f234455d52620f42b9add80fc6abe4
BUG: 765424
Signed-off-by: Pranith Kumar K <pranithk@gluster.com>
Reviewed-on: http://review.gluster.com/3065
Tested-by: Gluster Build System <jenkins@build.gluster.com>
Reviewed-by: Anand Avati <avati@redhat.com>
Diffstat (limited to 'xlators/cluster/afr/src/afr-self-heal-data.c')
-rw-r--r-- | xlators/cluster/afr/src/afr-self-heal-data.c | 16 |
1 files changed, 9 insertions, 7 deletions
diff --git a/xlators/cluster/afr/src/afr-self-heal-data.c b/xlators/cluster/afr/src/afr-self-heal-data.c index bf37729fe82..d362d5add6f 100644 --- a/xlators/cluster/afr/src/afr-self-heal-data.c +++ b/xlators/cluster/afr/src/afr-self-heal-data.c @@ -492,12 +492,16 @@ sh_algo_from_name (xlator_t *this, char *name) static int -sh_zero_byte_files_exist (afr_self_heal_t *sh, int child_count) +sh_zero_byte_files_exist (afr_local_t *local, int child_count) { - int i; - int ret = 0; + int i = 0; + int ret = 0; + afr_self_heal_t *sh = NULL; + sh = &local->self_heal; for (i = 0; i < child_count; i++) { + if (!local->child_up[i] || sh->child_errno[i]) + continue; if (sh->buf[i].ia_size == 0) { ret = 1; break; @@ -524,8 +528,7 @@ afr_sh_data_pick_algo (call_frame_t *frame, xlator_t *this) if (algo == NULL) { /* option not set, so fall back on heuristics */ - if ((local->enoent_count != 0) - || sh_zero_byte_files_exist (sh, priv->child_count) + if (sh_zero_byte_files_exist (local, priv->child_count) || (sh->file_size <= (priv->data_self_heal_window_size * this->ctx->page_size))) { @@ -568,6 +571,7 @@ afr_sh_data_sync_prepare (call_frame_t *frame, xlator_t *this) sh_algo = afr_sh_data_pick_algo (frame, this); + sh->algo = sh_algo; sh_algo->fn (frame, this); return 0; @@ -944,8 +948,6 @@ afr_sh_data_fstat (call_frame_t *frame, xlator_t *this) local->call_count = call_count; afr_reset_children (sh->success_children, priv->child_count); - memset (sh->child_errno, 0, - sizeof (*sh->child_errno) * priv->child_count); sh->success_count = 0; for (i = 0; i < priv->child_count; i++) { child = fstat_children[i]; |