diff options
| author | Varun Shastry <vshastry@redhat.com> | 2012-12-17 11:20:31 +0530 | 
|---|---|---|
| committer | Anand Avati <avati@redhat.com> | 2013-02-03 15:29:59 -0800 | 
| commit | 50f0882051dff81882115bf72abb67577099944f (patch) | |
| tree | dc209fbaa83df573e81b14df1d6b06fffcc89de4 | |
| parent | 212ab59c511e13cc470e623061fcf113456841c8 (diff) | |
cluster/stripe: Mount issues with Stripe xlator
Problem:
* 'CONNECTING' is taken as CHILD_UP.
* Sending notifications (default_notify()) for all the events individually
   while mounting.
Solution:
* Consider Child up only after the event CHILD_UP is received.
* Send a single notification for all the children's events only
   while mounting.
Change-Id: I1b7de127e12f5bfb8f80702dbdce02019e138bc8
BUG: 885072
Signed-off-by: Varun Shastry <vshastry@redhat.com>
Reviewed-on: http://review.gluster.org/4356
Tested-by: Gluster Build System <jenkins@build.gluster.com>
Reviewed-by: Anand Avati <avati@redhat.com>
| -rw-r--r-- | xlators/cluster/stripe/src/stripe-mem-types.h | 1 | ||||
| -rw-r--r-- | xlators/cluster/stripe/src/stripe.c | 63 | ||||
| -rw-r--r-- | xlators/cluster/stripe/src/stripe.h | 2 | 
3 files changed, 46 insertions, 20 deletions
diff --git a/xlators/cluster/stripe/src/stripe-mem-types.h b/xlators/cluster/stripe/src/stripe-mem-types.h index e05ba0c29..e9ac9cf46 100644 --- a/xlators/cluster/stripe/src/stripe-mem-types.h +++ b/xlators/cluster/stripe/src/stripe-mem-types.h @@ -20,6 +20,7 @@ enum gf_stripe_mem_types_ {          gf_stripe_mt_stripe_fd_ctx_t,          gf_stripe_mt_char,          gf_stripe_mt_int8_t, +        gf_stripe_mt_int32_t,          gf_stripe_mt_xlator_t,          gf_stripe_mt_stripe_private_t,          gf_stripe_mt_stripe_options, diff --git a/xlators/cluster/stripe/src/stripe.c b/xlators/cluster/stripe/src/stripe.c index 43e3c3ed2..b3e87d31b 100644 --- a/xlators/cluster/stripe/src/stripe.c +++ b/xlators/cluster/stripe/src/stripe.c @@ -3809,6 +3809,7 @@ notify (xlator_t *this, int32_t event, void *data, ...)          stripe_private_t *priv = NULL;          int               down_client = 0;          int               i = 0; +        gf_boolean_t      heard_from_all_children = _gf_false;          if (!this)                  return 0; @@ -3820,30 +3821,34 @@ notify (xlator_t *this, int32_t event, void *data, ...)          switch (event)          {          case GF_EVENT_CHILD_UP: -        case GF_EVENT_CHILD_CONNECTING:          {                  /* get an index number to set */                  for (i = 0; i < priv->child_count; i++) {                          if (data == priv->xl_array[i])                                  break;                  } -                priv->state[i] = 1; -                for (i = 0; i < priv->child_count; i++) { -                        if (!priv->state[i]) -                                down_client++; + +                if (priv->child_count == i) { +                        gf_log (this->name, GF_LOG_ERROR, +                                "got GF_EVENT_CHILD_UP bad subvolume %s", +                                data? ((xlator_t *)data)->name: NULL); +                        break;                  }                  LOCK (&priv->lock);                  { -                        priv->nodes_down = down_client;                          if (data == FIRST_CHILD (this))                                  priv->first_child_down = 0; -                        if (!priv->nodes_down) -                                default_notify (this, event, data); +                        priv->last_event[i] = event;                  }                  UNLOCK (&priv->lock);          }          break; +        case GF_EVENT_CHILD_CONNECTING: +        { +                // 'CONNECTING' doesn't ensure its CHILD_UP, so do nothing +                goto out; +        }          case GF_EVENT_CHILD_DOWN:          {                  /* get an index number to set */ @@ -3851,20 +3856,19 @@ notify (xlator_t *this, int32_t event, void *data, ...)                          if (data == priv->xl_array[i])                                  break;                  } -                priv->state[i] = 0; -                for (i = 0; i < priv->child_count; i++) { -                        if (!priv->state[i]) -                                down_client++; + +                if (priv->child_count == i) { +                        gf_log (this->name, GF_LOG_ERROR, +                                "got GF_EVENT_CHILD_DOWN bad subvolume %s", +                                data? ((xlator_t *)data)->name: NULL); +                        break;                  }                  LOCK (&priv->lock);                  { -                        priv->nodes_down = down_client; -                          if (data == FIRST_CHILD (this))                                  priv->first_child_down = 1; -                        if (priv->nodes_down) -                                default_notify (this, event, data); +                        priv->last_event[i] = event;                  }                  UNLOCK (&priv->lock);          } @@ -3874,10 +3878,30 @@ notify (xlator_t *this, int32_t event, void *data, ...)          {                  /* */                  default_notify (this, event, data); +                goto out;          }          break;          } +        // Consider child as down if it's last_event is not CHILD_UP +        for (i = 0, down_client = 0; i < priv->child_count; i++) +                if (priv->last_event[i] != GF_EVENT_CHILD_UP) +                        down_client++; + +        LOCK (&priv->lock); +        { +                priv->nodes_down = down_client; +        } +        UNLOCK (&priv->lock); + +        heard_from_all_children = _gf_true; +        for (i = 0; i < priv->child_count; i++) +                if (!priv->last_event[i]) +                        heard_from_all_children = _gf_false; + +        if (heard_from_all_children) +                default_notify (this, event, data); +out:          return 0;  } @@ -4598,9 +4622,9 @@ init (xlator_t *this)          if (!priv->xl_array)                  goto out; -        priv->state = GF_CALLOC (count, sizeof (int8_t), -                                 gf_stripe_mt_int8_t); -        if (!priv->state) +        priv->last_event = GF_CALLOC (count, sizeof (int), +                                      gf_stripe_mt_int32_t); +        if (!priv->last_event)                  goto out;          priv->child_count = count; @@ -4701,6 +4725,7 @@ fini (xlator_t *this)                          trav = trav->next;                          GF_FREE (prev);                  } +                GF_FREE (priv->last_event);                  LOCK_DESTROY (&priv->lock);                  GF_FREE (priv);          } diff --git a/xlators/cluster/stripe/src/stripe.h b/xlators/cluster/stripe/src/stripe.h index 53b683c73..5673d18f3 100644 --- a/xlators/cluster/stripe/src/stripe.h +++ b/xlators/cluster/stripe/src/stripe.h @@ -98,8 +98,8 @@ struct stripe_private {          gf_lock_t               lock;          uint8_t                 nodes_down;          int8_t                  first_child_down; +        int                    *last_event;          int8_t                  child_count; -        int8_t                 *state; /* Current state of child node */          gf_boolean_t            xattr_supported;  /* default yes */  	gf_boolean_t		coalesce;          char                    vol_uuid[UUID_SIZE + 1];  | 
