summaryrefslogtreecommitdiffstats
path: root/xlators/cluster/afr
diff options
context:
space:
mode:
authorSheetal Pamecha <sheetal.pamecha08@gmail.com>2018-11-30 19:49:59 +0530
committerAmar Tumballi <amarts@redhat.com>2019-01-21 04:24:27 +0000
commitcd16967a77d04a8d0c5d5c3ab5346ccdd1df89cb (patch)
tree65160812f14ea9c2f450bb389f1824f4fabcb2b3 /xlators/cluster/afr
parent55b40dfbb2551b1507d532a03bdf199acb37bf6a (diff)
afr: Splitbrain with size as policy must not resolve for directory
In automatic Splitbrain resolution when favorite child policy is set as size, split brain resolution must not work for directories. Currently, if a directory is in split brain with both copies having same size, the source is selected arbitrarily and healed. fixes: bz#1655050 Change-Id: I5739498639c17c89874cc577362e543adab55f5d Signed-off-by: Sheetal Pamecha <sheetal.pamecha08@gmail.com>
Diffstat (limited to 'xlators/cluster/afr')
-rw-r--r--xlators/cluster/afr/src/afr-self-heal-common.c14
1 files changed, 12 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 3caa6897424..ccbaca37784 100644
--- a/xlators/cluster/afr/src/afr-self-heal-common.c
+++ b/xlators/cluster/afr/src/afr-self-heal-common.c
@@ -1174,13 +1174,20 @@ afr_sh_fav_by_size(xlator_t *this, struct afr_reply *replies, inode_t *inode)
uint64_t cmp_sz = 0;
priv = this->private;
-
for (i = 0; i < priv->child_count; i++) {
if (replies[i].valid == 1) {
gf_msg_debug(this->name, 0,
"Child:%s file size = %" PRIu64 " for gfid %s",
priv->children[i]->name, replies[i].poststat.ia_size,
uuid_utoa(inode->gfid));
+ if (replies[i].poststat.ia_type == IA_IFDIR) {
+ gf_msg(this->name, GF_LOG_ERROR, 0,
+ AFR_MSG_SBRAIN_FAV_CHILD_POLICY,
+ "Cannot perform selfheal on %s. "
+ "Size policy is not applicable to directories.",
+ uuid_utoa(inode->gfid));
+ break;
+ }
if (replies[i].poststat.ia_size > cmp_sz) {
cmp_sz = replies[i].poststat.ia_size;
fav_child = i;
@@ -1252,7 +1259,10 @@ afr_mark_split_brain_source_sinks_by_policy(
priv = this->private;
fav_child = afr_sh_get_fav_by_policy(this, replies, inode, &policy_str);
- if (fav_child > priv->child_count - 1) {
+ if (fav_child == -1) {
+ gf_msg(this->name, GF_LOG_ERROR, 0, AFR_MSG_SBRAIN_FAV_CHILD_POLICY,
+ "No child selected by favorite-child policy.");
+ } else if (fav_child > priv->child_count - 1) {
gf_msg(this->name, GF_LOG_ERROR, 0, AFR_MSG_SBRAIN_FAV_CHILD_POLICY,
"Invalid child (%d) "
"selected by policy %s.",