From dda1b36b3be97170224c8f4e4f25a1362d288f02 Mon Sep 17 00:00:00 2001 From: Pranith Kumar K Date: Tue, 13 Mar 2012 10:00:44 +0530 Subject: cluster/afr: Mark zero size file as sink in absense of xattrs. Change-Id: Ic9381f9caa7021a629afb7401e51a29686880bfe BUG: 802637 Signed-off-by: Pranith Kumar K Reviewed-on: http://review.gluster.com/2931 Tested-by: Gluster Build System Reviewed-by: Vijay Bellur --- xlators/cluster/afr/src/afr-self-heal-common.c | 53 +++++++++++++++++++++++++- 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 f1fc0ff1f..5342e2231 100644 --- a/xlators/cluster/afr/src/afr-self-heal-common.c +++ b/xlators/cluster/afr/src/afr-self-heal-common.c @@ -544,6 +544,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) { @@ -712,11 +752,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 4aa5b9e86..7d2c86eed 100644 --- a/xlators/cluster/afr/src/afr-self-heal-data.c +++ b/xlators/cluster/afr/src/afr-self-heal-data.c @@ -596,7 +596,7 @@ afr_sh_data_fix (call_frame_t *frame, xlator_t *this) nsources = afr_build_sources (this, sh->xattr, sh->buf, sh->pending_matrix, sh->sources, sh->child_success, - AFR_DATA_TRANSACTION, NULL, _gf_false); + AFR_DATA_TRANSACTION, NULL, _gf_true); if (nsources == 0) { gf_log (this->name, GF_LOG_DEBUG, -- cgit