summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--heal/src/glfs-heal.c42
1 files changed, 27 insertions, 15 deletions
diff --git a/heal/src/glfs-heal.c b/heal/src/glfs-heal.c
index dacdb5bc99b..8240e7b7569 100644
--- a/heal/src/glfs-heal.c
+++ b/heal/src/glfs-heal.c
@@ -393,30 +393,40 @@ out:
return;
}
+static gf_boolean_t
+_is_afr_an_ancestor (xlator_t *xl)
+{
+ xlator_t *parent = NULL;
+
+ if (!xl->parents)
+ return _gf_false;
+
+ for (parent = xl->parents->xlator; parent->parents;
+ parent = parent->parents->xlator) {
+ if (!strcmp (parent->type, "cluster/replicate"))
+ return _gf_true;
+ }
+
+ return _gf_false;
+}
+
static int
glfsh_validate_replicate_volume (xlator_t *xl)
{
- gf_boolean_t valid_replicate = _gf_false;
- gf_boolean_t has_client = _gf_false;
while (xl->next)
xl = xl->next;
while (xl) {
- if (strcmp (xl->type, "protocol/client") == 0) {
- has_client = _gf_true;
- if (strcmp (xl->parents->xlator->type,
- "cluster/replicate") != 0) {
- valid_replicate = _gf_false;
- goto out;
+ /* Check if atleast one client xlator has AFR in its parent
+ * ancestry */
+ if (!strcmp (xl->type, "protocol/client")) {
+ if (_is_afr_an_ancestor(xl)) {
+ return 1;
}
}
-
xl = xl->prev;
}
- valid_replicate = _gf_true;
-out:
- if (has_client && valid_replicate)
- return 0;
+
return -1;
}
@@ -497,8 +507,10 @@ main (int argc, char **argv)
while (xl) {
if (strcmp (xl->type, "protocol/client") == 0) {
- glfsh_print_pending_heals (xl, &rootloc);
- printf("\n");
+ if (_is_afr_an_ancestor (xl)) {
+ glfsh_print_pending_heals (xl, &rootloc);
+ printf("\n");
+ }
}
xl = xl->prev;