diff options
| author | Mohit Agrawal <moagrawa@redhat.com> | 2017-05-25 21:43:42 +0530 | 
|---|---|---|
| committer | Jeff Darcy <jeff@pl.atyp.us> | 2017-05-31 20:43:53 +0000 | 
| commit | dba55ae364a2772904bb68a6bd0ea87289ee1470 (patch) | |
| tree | e8a7cf51bd45464cd26f9c4270787ffc50228854 /xlators/storage/posix/src/posix-helpers.c | |
| parent | de92c363c95d16966dbcc9d8763fd4448dd84d13 (diff) | |
glusterfs: Not able to mount running volume after enable brick mux and stopped any volume
Problem: After enabled brick mux if any volume has down and then try ot run mount
         with running volume , mount command is hung.
Solution: After enable brick mux server has shared one data structure server_conf
          for all associated subvolumes.After down any subvolume in some
          ungraceful manner (remove brick directory) posix xlator sends
          GF_EVENT_CHILD_DOWN event to parent xlatros and server notify
          updates the child_up to false in server_conf.When client is trying
          to communicate with server through mount it checks conf->child_up
          and it is FALSE so it throws message "translator are not yet ready".
          From this patch updated structure server_conf to save child_up status
          for xlator wise. Another improtant correction from this patch is
          cleanup threads from server side xlators after stop the volume.
BUG: 1453977
Change-Id: Ic54da3f01881b7c9429ce92cc569236eb1d43e0d
Signed-off-by: Mohit Agrawal <moagrawa@redhat.com>
Reviewed-on: https://review.gluster.org/17356
Smoke: Gluster Build System <jenkins@build.gluster.org>
NetBSD-regression: NetBSD Build System <jenkins@build.gluster.org>
Reviewed-by: Raghavendra Talur <rtalur@redhat.com>
CentOS-regression: Gluster Build System <jenkins@build.gluster.org>
Reviewed-by: Jeff Darcy <jeff@pl.atyp.us>
Diffstat (limited to 'xlators/storage/posix/src/posix-helpers.c')
| -rw-r--r-- | xlators/storage/posix/src/posix-helpers.c | 36 | 
1 files changed, 21 insertions, 15 deletions
diff --git a/xlators/storage/posix/src/posix-helpers.c b/xlators/storage/posix/src/posix-helpers.c index 1a49af47a8b..52be925aae2 100644 --- a/xlators/storage/posix/src/posix-helpers.c +++ b/xlators/storage/posix/src/posix-helpers.c @@ -1411,6 +1411,7 @@ posix_janitor_thread_proc (void *data)          THIS = this;          while (1) { +                  time (&now);                  if ((now - priv->last_landfill_check) > priv->janitor_sleep_duration) {                          gf_msg_trace (this->name, 0, @@ -1844,9 +1845,11 @@ posix_health_check_thread_proc (void *data)          xlator_list_t       **trav_p             = NULL;          int                   count              = 0;          gf_boolean_t          victim_found       = _gf_false; +        glusterfs_ctx_t      *ctx                = NULL;          this = data;          priv = this->private; +        ctx  = THIS->ctx;          /* prevent races when the interval is updated */          interval = priv->health_check_interval; @@ -1896,10 +1899,12 @@ abort:          */          if (this->ctx->active) {                  top = this->ctx->active->first; -                for (trav_p = &top->children; *trav_p; +                LOCK (&ctx->volfile_lock); +                        for (trav_p = &top->children; *trav_p;                                                 trav_p = &(*trav_p)->next) { -                        count++; -                } +                                count++; +                        } +                UNLOCK (&ctx->volfile_lock);          }          if (count == 1) { @@ -1919,20 +1924,21 @@ abort:                          kill (getpid(), SIGKILL);          } else { -                for (trav_p = &top->children; *trav_p; -                     trav_p = &(*trav_p)->next) { -                        victim = (*trav_p)->xlator; -                        if (victim && -                            strcmp (victim->name, priv->base_path) == 0) { -                                victim_found = _gf_true; -                                break; +                LOCK (&ctx->volfile_lock); +                        for (trav_p = &top->children; *trav_p; +                             trav_p = &(*trav_p)->next) { +                                victim = (*trav_p)->xlator; +                                if (victim && +                                         strcmp (victim->name, priv->base_path) == 0) { +                                        victim_found = _gf_true; +                                        break; +                                }                          } -                } +                UNLOCK (&ctx->volfile_lock);                  if (victim_found) { -                        top->notify (top, GF_EVENT_TRANSPORT_CLEANUP, victim); -                        glusterfs_mgmt_pmap_signout (glusterfsd_ctx, -                                                     priv->base_path); -                        glusterfs_autoscale_threads (THIS->ctx, -1); +                        gf_log (THIS->name, GF_LOG_INFO, "detaching not-only " +                                " child %s", priv->base_path); +                        top->notify (top, GF_EVENT_CLEANUP, victim);                  }          }  | 
