summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--xlators/cluster/afr/src/afr-common.c2
-rw-r--r--xlators/cluster/afr/src/afr-self-heald.c15
-rw-r--r--xlators/cluster/afr/src/afr.h3
3 files changed, 19 insertions, 1 deletions
diff --git a/xlators/cluster/afr/src/afr-common.c b/xlators/cluster/afr/src/afr-common.c
index 51d611d503a..0971104cc10 100644
--- a/xlators/cluster/afr/src/afr-common.c
+++ b/xlators/cluster/afr/src/afr-common.c
@@ -4919,7 +4919,7 @@ find_child_index(xlator_t *this, xlator_t *child)
return i;
}
-static int
+int
__afr_get_up_children_count(afr_private_t *priv)
{
int up_children = 0;
diff --git a/xlators/cluster/afr/src/afr-self-heald.c b/xlators/cluster/afr/src/afr-self-heald.c
index 0cf01a041b4..72b7d0d56ba 100644
--- a/xlators/cluster/afr/src/afr-self-heald.c
+++ b/xlators/cluster/afr/src/afr-self-heald.c
@@ -716,6 +716,18 @@ out:
return;
}
+gf_boolean_t
+afr_bricks_available_for_heal(afr_private_t *priv)
+{
+ int up_children = 0;
+
+ up_children = __afr_get_up_children_count(priv);
+ if (up_children < 2) {
+ return _gf_false;
+ }
+ return _gf_true;
+}
+
void *
afr_shd_index_healer(void *data)
{
@@ -735,6 +747,9 @@ afr_shd_index_healer(void *data)
for (;;) {
afr_shd_healer_wait(healer);
+ if (!afr_bricks_available_for_heal(priv))
+ continue;
+
ASSERT_LOCAL(this, healer);
priv->local[healer->subvol] = healer->local;
diff --git a/xlators/cluster/afr/src/afr.h b/xlators/cluster/afr/src/afr.h
index cc4bceef521..3d2c1950571 100644
--- a/xlators/cluster/afr/src/afr.h
+++ b/xlators/cluster/afr/src/afr.h
@@ -1284,6 +1284,9 @@ afr_ta_post_op_unlock(xlator_t *this, loc_t *loc);
gf_boolean_t
afr_is_pending_set(xlator_t *this, dict_t *xdata, int type);
+int
+__afr_get_up_children_count(afr_private_t *priv);
+
call_frame_t *
afr_ta_frame_create(xlator_t *this);
#endif /* __AFR_H__ */