diff options
author | Ashish Pandey <aspandey@redhat.com> | 2020-01-03 16:54:33 +0530 |
---|---|---|
committer | Ashish Pandey <aspandey@redhat.com> | 2020-02-18 12:19:31 +0530 |
commit | fc0f7442f038ce86344dd6b735abcff6a50533b8 (patch) | |
tree | 0212f516cf1a3f8b6ae659e0e6d0e67b2e5be42d | |
parent | 1d59dc3b37df2c5f960e0620c7e8c36760ff96c8 (diff) |
cluster/thin-arbiter: Wait for TA connection before ta-file lookup
Problem:
When we mount a ta volume, as soon as 2 data bricks are connected
we consider that the mount is done and then send a lookup/create on
ta file on ta node. However, this connection with ta node might not
have been completed.
Due to this delay, ta replica id file will not be created and we
will see ENOTCONN error in log file if we do lookup.
Solution:
As we know that this ta node could have a higher latency, we should
wait for reasonable time for connection to happen before sending
lookup/create on replica id file.
fixes: bz#1804058
Change-Id: I36f90865afe617e4e84cee57fec832a16f5dd6cc
(cherry picked from commit a7fa54ddea3fe429f143b37e4de06a93b49d776a)
-rw-r--r-- | xlators/cluster/afr/src/afr-common.c | 40 |
1 files changed, 21 insertions, 19 deletions
diff --git a/xlators/cluster/afr/src/afr-common.c b/xlators/cluster/afr/src/afr-common.c index 812bdc36767..ec7e6456012 100644 --- a/xlators/cluster/afr/src/afr-common.c +++ b/xlators/cluster/afr/src/afr-common.c @@ -4982,13 +4982,31 @@ __afr_get_up_children_count(afr_private_t *priv) return up_children; } +static int +__get_heard_from_all_status(xlator_t *this) +{ + afr_private_t *priv = this->private; + int i; + + for (i = 0; i < priv->child_count; i++) { + if (!priv->last_event[i]) { + return 0; + } + } + if (priv->thin_arbiter_count && !priv->ta_child_up) { + return 0; + } + return 1; +} + glusterfs_event_t -__afr_transform_event_from_state(afr_private_t *priv) +__afr_transform_event_from_state(xlator_t *this) { int i = 0; int up_children = 0; + afr_private_t *priv = this->private; - if (AFR_COUNT(priv->last_event, priv->child_count) == priv->child_count) + if (__get_heard_from_all_status(this)) /* have_heard_from_all. Let afr_notify() do the propagation. */ return GF_EVENT_MAXVAL; @@ -5030,7 +5048,7 @@ afr_notify_cbk(void *data) goto unlock; } priv->timer = NULL; - event = __afr_transform_event_from_state(priv); + event = __afr_transform_event_from_state(this); if (event != GF_EVENT_MAXVAL) propagate = _gf_true; } @@ -5057,22 +5075,6 @@ __afr_launch_notify_timer(xlator_t *this, afr_private_t *priv) } } -int -__get_heard_from_all_status(xlator_t *this) -{ - afr_private_t *priv = this->private; - int heard_from_all = 1; - int i = 0; - - for (i = 0; i < priv->child_count; i++) { - if (!priv->last_event[i]) { - heard_from_all = 0; - break; - } - } - return heard_from_all; -} - static int find_best_down_child(xlator_t *this) { |