diff options
Diffstat (limited to 'xlators/mgmt/glusterd')
| -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 | 
3 files changed, 92 insertions, 5 deletions
diff --git a/xlators/mgmt/glusterd/src/glusterd-pmap.c b/xlators/mgmt/glusterd/src/glusterd-pmap.c index 9b2954af64d..0507715305c 100644 --- a/xlators/mgmt/glusterd/src/glusterd-pmap.c +++ b/xlators/mgmt/glusterd/src/glusterd-pmap.c @@ -519,11 +519,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); @@ -542,6 +551,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 df058330cd0..e7fd01aabb2 100644 --- a/xlators/mgmt/glusterd/src/glusterd-utils.c +++ b/xlators/mgmt/glusterd/src/glusterd-utils.c @@ -5827,6 +5827,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); @@ -5845,6 +5846,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;  } @@ -13212,6 +13228,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 db13c4c8ad4..31bf462bcad 100644 --- a/xlators/mgmt/glusterd/src/glusterd-utils.h +++ b/xlators/mgmt/glusterd/src/glusterd-utils.h @@ -847,4 +847,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  | 
