diff options
| author | Jeff Darcy <jdarcy@redhat.com> | 2012-03-12 09:32:40 -0400 | 
|---|---|---|
| committer | Anand Avati <avati@redhat.com> | 2012-03-19 15:19:50 -0700 | 
| commit | c816d16288d3089d9e986c3155cb5ca9265b6210 (patch) | |
| tree | 450fc7b6c217fb9e365e67813de9e452b83792d3 /xlators/cluster/afr/src | |
| parent | 2ffefd720a54fb815b1efa11e9de766fe1518831 (diff) | |
replicate: fix a glitch in up_count/down_count updates.
Change-Id: I4919a98191bf7fe5edad9a149a129bcd177cd4a8
BUG: 802522
Signed-off-by: Jeff Darcy <jdarcy@redhat.com>
Reviewed-on: http://review.gluster.com/2927
Tested-by: Gluster Build System <jenkins@build.gluster.com>
Reviewed-by: Anand Avati <avati@redhat.com>
Diffstat (limited to 'xlators/cluster/afr/src')
| -rw-r--r-- | xlators/cluster/afr/src/afr-common.c | 26 | 
1 files changed, 24 insertions, 2 deletions
diff --git a/xlators/cluster/afr/src/afr-common.c b/xlators/cluster/afr/src/afr-common.c index b2077c384..22c741151 100644 --- a/xlators/cluster/afr/src/afr-common.c +++ b/xlators/cluster/afr/src/afr-common.c @@ -3488,8 +3488,16 @@ afr_notify (xlator_t *this, int32_t event,          case GF_EVENT_CHILD_UP:                  LOCK (&priv->lock);                  { +                        /* +                         * This only really counts if the child was never up +                         * (value = -1) or had been down (value = 0).  See +                         * comment at GF_EVENT_CHILD_DOWN for a more detailed +                         * explanation. +                         */ +                        if (priv->child_up[idx] != 1) { +                                priv->up_count++; +                        }                          priv->child_up[idx] = 1; -                        priv->up_count++;                          call_psh = 1;                          up_child = idx; @@ -3513,8 +3521,22 @@ afr_notify (xlator_t *this, int32_t event,          case GF_EVENT_CHILD_DOWN:                  LOCK (&priv->lock);                  { +                        /* +                         * If a brick is down when we start, we'll get a +                         * CHILD_DOWN to indicate its initial state.  There +                         * was never a CHILD_UP in this case, so if we +                         * increment "down_count" the difference between than +                         * and "up_count" will no longer be the number of +                         * children that are currently up.  This has serious +                         * implications e.g. for quorum enforcement, so we +                         * don't increment these values unless the event +                         * represents an actual state transition between "up" +                         * (value = 1) and anything else. +                         */ +                        if (priv->child_up[idx] == 1) { +                                priv->down_count++; +                        }                          priv->child_up[idx] = 0; -                        priv->down_count++;                          for (i = 0; i < priv->child_count; i++)                                  if (priv->child_up[i] == 0)  | 
