diff options
author | Pranith Kumar K <pranithk@gluster.com> | 2012-04-05 14:26:22 +0530 |
---|---|---|
committer | Anand Avati <avati@redhat.com> | 2012-05-18 20:12:24 -0700 |
commit | 2a07f4fc090fe1f5cccff4d25e66cdc942ee5444 (patch) | |
tree | 9c01056082c7eea5ef6bc34c93a7b41b7dee94b5 | |
parent | de5f112a08fc5993ed34cfdca687652aa3fc9ae5 (diff) |
cluster/afr: Mark zero size file as sink in absense of xattrs.
Change-Id: I4500f39a49ee16e6e88451dcf147d9f49b1d749e
BUG: 765587
Signed-off-by: Pranith Kumar K <pranithk@gluster.com>
Reviewed-on: http://review.gluster.com/3089
Tested-by: Gluster Build System <jenkins@build.gluster.com>
Reviewed-by: Jeff Darcy <jdarcy@redhat.com>
Reviewed-by: Anand Avati <avati@redhat.com>
-rw-r--r-- | xlators/cluster/afr/src/afr-self-heal-common.c | 53 | ||||
-rw-r--r-- | xlators/cluster/afr/src/afr-self-heal-data.c | 2 |
2 files changed, 53 insertions, 2 deletions
diff --git a/xlators/cluster/afr/src/afr-self-heal-common.c b/xlators/cluster/afr/src/afr-self-heal-common.c index 0f6b00b4fb4..f45d9c76fa9 100644 --- a/xlators/cluster/afr/src/afr-self-heal-common.c +++ b/xlators/cluster/afr/src/afr-self-heal-common.c @@ -541,6 +541,46 @@ out: return nsources; } +int +afr_sh_mark_zero_size_file_as_sink (struct iatt *bufs, int32_t *success_children, + int child_count, int32_t *sources) +{ + int nsources = 0; + int i = 0; + int child = 0; + gf_boolean_t sink_exists = _gf_false; + gf_boolean_t source_exists = _gf_false; + + for (i = 0; i < child_count; i++) { + child = success_children[i]; + if (child < 0) + break; + if (bufs[child].ia_size) + source_exists = _gf_true; + if (!bufs[child].ia_size) + sink_exists = _gf_true; + } + if (!source_exists && !sink_exists) { + nsources = -1; + goto out; + } + + if (!source_exists || !sink_exists) + goto out; + + for (i = 0; i < child_count; i++) { + child = success_children[i]; + if (child < 0) + break; + if (bufs[child].ia_size) { + sources[child] = 1; + nsources++; + } + } +out: + return nsources; +} + char * afr_get_character_str (afr_node_type type) { @@ -706,11 +746,22 @@ afr_mark_sources (xlator_t *this, int32_t *sources, int32_t **pending_matrix, afr_find_character_types (characters, pending_matrix, success_children, child_count); if (afr_sh_all_nodes_innocent (characters, child_count)) { - if (type == AFR_SELF_HEAL_METADATA) + switch (type) { + case AFR_SELF_HEAL_METADATA: nsources = afr_sh_mark_lowest_uid_as_source (bufs, success_children, child_count, sources); + break; + case AFR_SELF_HEAL_DATA: + nsources = afr_sh_mark_zero_size_file_as_sink (bufs, + success_children, + child_count, + sources); + break; + default: + break; + } goto out; } diff --git a/xlators/cluster/afr/src/afr-self-heal-data.c b/xlators/cluster/afr/src/afr-self-heal-data.c index df8e2ca7af7..044d412d822 100644 --- a/xlators/cluster/afr/src/afr-self-heal-data.c +++ b/xlators/cluster/afr/src/afr-self-heal-data.c @@ -736,7 +736,7 @@ afr_sh_data_fxattrop_fstat_done (call_frame_t *frame, xlator_t *this) nsources = afr_build_sources (this, sh->xattr, sh->buf, sh->pending_matrix, sh->sources, sh->success_children, - AFR_DATA_TRANSACTION, NULL, _gf_false); + AFR_DATA_TRANSACTION, NULL, _gf_true); if ((nsources == 0) && !sh->sync_done) { gf_log (this->name, GF_LOG_DEBUG, "No self-heal needed for %s", |