diff options
-rw-r--r-- | xlators/cluster/afr/src/afr-common.c | 2 | ||||
-rw-r--r-- | xlators/cluster/afr/src/afr-self-heald.c | 15 | ||||
-rw-r--r-- | xlators/cluster/afr/src/afr.h | 3 |
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 8d50144c046..e655999c6a6 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 53d7ef8bb8e..e2de77a9c45 100644 --- a/xlators/cluster/afr/src/afr-self-heald.c +++ b/xlators/cluster/afr/src/afr-self-heald.c @@ -787,6 +787,18 @@ unref: afr_ta_post_op_unlock(this, loc); } +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) { @@ -806,6 +818,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__ */ |