diff options
| -rw-r--r-- | glusterfsd/src/glusterfsd.c | 18 | ||||
| -rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-pmap.c | 31 | ||||
| -rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-utils.c | 62 | ||||
| -rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-utils.h | 4 | 
4 files changed, 109 insertions, 6 deletions
diff --git a/glusterfsd/src/glusterfsd.c b/glusterfsd/src/glusterfsd.c index ec83434494e..cb92cbee867 100644 --- a/glusterfsd/src/glusterfsd.c +++ b/glusterfsd/src/glusterfsd.c @@ -1303,6 +1303,9 @@ cleanup_and_exit (int signum)  {          glusterfs_ctx_t *ctx      = NULL;          xlator_t        *trav     = NULL; +        xlator_t        *top; +        xlator_t        *victim; +        xlator_list_t   **trav_p;          ctx = glusterfsd_ctx; @@ -1332,7 +1335,20 @@ cleanup_and_exit (int signum)                  return;          ctx->cleanup_started = 1; -        glusterfs_mgmt_pmap_signout (ctx, NULL); + +        /* signout should be sent to all the bricks in case brick mux is enabled +         * and multiple brick instances are attached to this process +         */ +        if (ctx->active) { +                top = ctx->active->first; +                for (trav_p = &top->children; *trav_p; +                     trav_p = &(*trav_p)->next) { +                        victim = (*trav_p)->xlator; +                        glusterfs_mgmt_pmap_signout (ctx, victim->name); +                } +        } else { +                glusterfs_mgmt_pmap_signout (ctx, NULL); +        }          /* below part is a racy code where the rpcsvc object is freed.           * But in another thread (epoll thread), upon poll error in the diff --git a/xlators/mgmt/glusterd/src/glusterd-pmap.c b/xlators/mgmt/glusterd/src/glusterd-pmap.c index 8c4174a3642..c3f5dbc3cd1 100644 --- a/xlators/mgmt/glusterd/src/glusterd-pmap.c +++ b/xlators/mgmt/glusterd/src/glusterd-pmap.c @@ -521,11 +521,20 @@ gluster_pmap_signin (rpcsvc_request_t *req)  int  __gluster_pmap_signout (rpcsvc_request_t *req)  { -        pmap_signout_req    args                 = {0,}; -        pmap_signout_rsp    rsp                  = {0,}; -        int                 ret                  = -1; -        char                brick_path[PATH_MAX] = {0,}; -        glusterd_brickinfo_t *brickinfo = NULL; +        pmap_signout_req      args                 = {0,}; +        pmap_signout_rsp      rsp                  = {0,}; +        int                   ret                  = -1; +        xlator_t             *this                 = NULL; +        glusterd_conf_t      *conf                 = NULL; +        glusterd_volinfo_t   *volinfo              = NULL; +        glusterd_brickinfo_t *brickinfo            = NULL; +        char                  pidfile[PATH_MAX]    = {0}; +        char                  brick_path[PATH_MAX] = {0,}; + +        this = THIS; +        GF_VALIDATE_OR_GOTO ("glusterd", this, fail); +        conf = this->private; +        GF_VALIDATE_OR_GOTO (this->name, conf, fail);          ret = xdr_to_generic (req->msg[0], &args,                                (xdrproc_t)xdr_pmap_signout_req); @@ -544,6 +553,18 @@ __gluster_pmap_signout (rpcsvc_request_t *req)                                  brick_path, GF_PMAP_PORT_BRICKSERVER,                                  req->trans);          } +        /* Clean up the pidfile for this brick given glusterfsd doesn't clean it +         * any more. This is required to ensure we don't end up with having +         * stale pid files in case a brick is killed from the backend +         */ +        ret = glusterd_get_volinfo_from_brick (args.brick, &volinfo); +        if (!ret) { +                if (volinfo && brickinfo) { +                        GLUSTERD_GET_BRICK_PIDFILE (pidfile, volinfo, brickinfo, +                                                    conf); +                        sys_unlink (pidfile); +                } +        }  fail:          glusterd_submit_reply (req, &rsp, NULL, 0, NULL, diff --git a/xlators/mgmt/glusterd/src/glusterd-utils.c b/xlators/mgmt/glusterd/src/glusterd-utils.c index 27af1b79851..4b8eb88e7fb 100644 --- a/xlators/mgmt/glusterd/src/glusterd-utils.c +++ b/xlators/mgmt/glusterd/src/glusterd-utils.c @@ -5824,6 +5824,7 @@ glusterd_get_brickinfo (xlator_t *this, const char *brickname, int port,          glusterd_conf_t         *priv = NULL;          glusterd_volinfo_t      *volinfo = NULL;          glusterd_brickinfo_t    *tmpbrkinfo = NULL; +        glusterd_snap_t         *snap    = NULL;          int                     ret = -1;          GF_ASSERT (brickname); @@ -5842,6 +5843,21 @@ glusterd_get_brickinfo (xlator_t *this, const char *brickname, int port,                          }                  }          } +        /* In case normal volume is not found, check for snapshot volumes */ +        cds_list_for_each_entry (snap, &priv->snapshots, snap_list) { +                cds_list_for_each_entry (volinfo, &snap->volumes, vol_list) { +                        cds_list_for_each_entry (tmpbrkinfo, &volinfo->bricks, +                                                 brick_list) { +                                if (gf_uuid_compare (tmpbrkinfo->uuid, MY_UUID)) +                                        continue; +                                if (!strcmp(tmpbrkinfo->path, brickname)) { +                                        *brickinfo = tmpbrkinfo; +                                        return 0; +                                } +                        } +                } +        } +          return ret;  } @@ -13241,6 +13257,52 @@ out:          return ret;  } +int +glusterd_get_volinfo_from_brick (char *brick, glusterd_volinfo_t **volinfo) +{ +        int             ret                 = -1; +        xlator_t                *this       = NULL; +        glusterd_conf_t         *conf       = NULL; +        glusterd_volinfo_t      *voliter    = NULL; +        glusterd_brickinfo_t    *brickiter  = NULL; +        glusterd_snap_t         *snap    = NULL; + +        this = THIS; +        GF_VALIDATE_OR_GOTO ("glusterd", this, out); +        conf = this->private; +        GF_VALIDATE_OR_GOTO (this->name, conf, out); + +        /* First check for normal volumes */ +        cds_list_for_each_entry (voliter, &conf->volumes, vol_list) { +                cds_list_for_each_entry (brickiter, &voliter->bricks, +                                         brick_list) { +                        if (gf_uuid_compare (brickiter->uuid, MY_UUID)) +                                continue; +                        if (!strcmp(brickiter->path, brick)) { +                                *volinfo = voliter; +                                return 0; +                        } +                } +        } +        /* In case normal volume is not found, check for snapshot volumes */ +        cds_list_for_each_entry (snap, &conf->snapshots, snap_list) { +                cds_list_for_each_entry (voliter, &snap->volumes, vol_list) { +                        cds_list_for_each_entry (brickiter, &voliter->bricks, +                                                 brick_list) { +                                if (gf_uuid_compare (brickiter->uuid, MY_UUID)) +                                        continue; +                                if (!strcmp(brickiter->path, brick)) { +                                        *volinfo = voliter; +                                        return 0; +                                } +                        } +                } +        } + +out: +        return ret; +} +  glusterd_op_t  gd_cli_to_gd_op (char *cli_op)  { diff --git a/xlators/mgmt/glusterd/src/glusterd-utils.h b/xlators/mgmt/glusterd/src/glusterd-utils.h index 1a0376da5cd..d002ee45b6c 100644 --- a/xlators/mgmt/glusterd/src/glusterd-utils.h +++ b/xlators/mgmt/glusterd/src/glusterd-utils.h @@ -851,4 +851,8 @@ glusterd_brick_op_prerequisites (dict_t *dict,                                   char **src_brick, glusterd_brickinfo_t                                   **src_brickinfo, char *pidfile,                                   char **op_errstr, dict_t *rsp_dict); + +int +glusterd_get_volinfo_from_brick (char *brick, glusterd_volinfo_t **volinfo); +  #endif  | 
