diff options
| author | Pranith K <pranithk@gluster.com> | 2010-10-04 08:54:55 +0000 | 
|---|---|---|
| committer | Vijay Bellur <vijay@dev.gluster.com> | 2010-10-04 08:28:35 -0700 | 
| commit | 64609b65c2ffc34577b342dab12595b13a52d8a2 (patch) | |
| tree | 12dca1508bbae245f94c24aa24aead95e6809241 /xlators | |
| parent | 85c013f3accfc409c1a520d0ad529a2c1c16c653 (diff) | |
mgmt/glusterd: added new brick validation functionality
Signed-off-by: Pranith Kumar K <pranithk@gluster.com>
Signed-off-by: Vijay Bellur <vijay@dev.gluster.com>
BUG: 1726 ()
URL: http://bugs.gluster.com/cgi-bin/bugzilla3/show_bug.cgi?id=1726
Diffstat (limited to 'xlators')
| -rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-handler.c | 175 | ||||
| -rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-op-sm.c | 18 | ||||
| -rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-utils.c | 218 | ||||
| -rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-utils.h | 26 | 
4 files changed, 242 insertions, 195 deletions
diff --git a/xlators/mgmt/glusterd/src/glusterd-handler.c b/xlators/mgmt/glusterd/src/glusterd-handler.c index c21cd906cd2..6e391670805 100644 --- a/xlators/mgmt/glusterd/src/glusterd-handler.c +++ b/xlators/mgmt/glusterd/src/glusterd-handler.c @@ -62,38 +62,6 @@          glusterd_volume_txn (req, volname, flags, GD_OP_STOP_VOLUME)  static int -glusterd_friend_find_by_uuid (uuid_t uuid, -                              glusterd_peerinfo_t  **peerinfo) -{ -        int                     ret = -1; -        glusterd_conf_t         *priv = NULL; -        glusterd_peerinfo_t     *entry = NULL; - -        GF_ASSERT (peerinfo); - -        *peerinfo = NULL; -        priv    = THIS->private; - -        GF_ASSERT (priv); - -        if (uuid_is_null (uuid)) -                return -1; - -        list_for_each_entry (entry, &priv->peers, uuid_list) { -                if (!uuid_compare (entry->uuid, uuid)) { - -                        gf_log ("glusterd", GF_LOG_NORMAL, -                                 "Friend found.. state: %d", -                                  entry->state.state); -                        *peerinfo = entry; -                        return 0; -                } -        } - -        return ret; -} - -static int  glusterd_handle_friend_req (rpcsvc_request_t *req, uuid_t  uuid,                              char *hostname, int port, dict_t *dict)  { @@ -717,7 +685,6 @@ glusterd_handle_create_volume (rpcsvc_request_t *req)          int                    brick_count = 0;          char                   *tmpptr      = NULL;          int                    i           = 0; -        glusterd_peerinfo_t    *peerinfo    = NULL;          char                   *brick_list  = NULL;          void                   *cli_rsp     = NULL;          char                    err_str[2048] = {0,}; @@ -730,9 +697,7 @@ glusterd_handle_create_volume (rpcsvc_request_t *req)          uuid_t                  volume_id   = {0,};          char                    volid[64]   = {0,};          glusterd_brickinfo_t    *tmpbrkinfo = NULL; -        glusterd_brickinfo_t    *tmp        = NULL; -        glusterd_brickinfo_t    *tmp2       = NULL; -        uint32_t                delete_list = 0; +        glusterd_volinfo_t      tmpvolinfo = {{0},};          GF_ASSERT (req); @@ -819,63 +784,35 @@ glusterd_handle_create_volume (rpcsvc_request_t *req)                      ((cli_req.type == 1)? "STRIPE":"REPLICATE")), cli_req.count,                      bricks); +        INIT_LIST_HEAD (&tmpvolinfo.bricks);          while ( i < brick_count) {                  i++;                  brick= strtok_r (brick_list, " \n", &tmpptr);                  brick_list = tmpptr; -                brickinfo = NULL;                  ret = glusterd_brickinfo_from_brick (brick, &brickinfo);                  if (ret)                          goto out; -                if(!(ret = glusterd_is_local_addr (brickinfo->hostname))) -                        goto brick_validation;        //localhost, continue without validation - -                ret = glusterd_friend_find_by_hostname (brickinfo->hostname, -                                                        &peerinfo); +                ret = glusterd_new_brick_validate (brick, brickinfo, err_str, +                                                   sizeof (err_str));                  if (ret) { -                        snprintf (err_str, 2048, "Host %s not a friend", -                                  brickinfo->hostname); -                        gf_log ("glusterd", GF_LOG_ERROR, "%s", err_str);                          err_ret = 1;                          goto out;                  } -                if ((!peerinfo->connected) || -                    (peerinfo->state.state != GD_FRIEND_STATE_BEFRIENDED)) { -                        snprintf(err_str, 2048, "Host %s not connected", -                                 brickinfo->hostname); -                        gf_log ("glusterd", GF_LOG_ERROR, "%s", err_str); +                ret = glusterd_volume_brickinfo_get (brickinfo->uuid, +                                                     brickinfo->hostname, +                                                     brickinfo->path, +                                                     &tmpvolinfo, &tmpbrkinfo); +                if (!ret) {                          err_ret = 1; +                        snprintf (err_str, sizeof (err_str), "Brick: %s:%s, %s" +                                  " in the arguments mean the same", +                                  tmpbrkinfo->hostname, tmpbrkinfo->path, +                                  brick);                          goto out;                  } -brick_validation: -                err_ret = glusterd_is_exisiting_brick (brickinfo->hostname, -                                                       brickinfo->path); -                if (err_ret) { -                        snprintf(err_str, 2048, "Brick: %s already in use", -                                 brick); -                        goto out; -                } - -                if (1 < i) -                        list_add_tail (&brickinfo->brick_list, &tmpbrkinfo->brick_list); -                else -                        tmpbrkinfo = brickinfo; -        } - -        list_for_each_entry (tmp, &tmpbrkinfo->brick_list, brick_list) { -                list_for_each_entry (tmp2, &tmp->brick_list, brick_list) { -                        if ((!glusterd_is_local_addr (tmp->hostname)) && (!glusterd_is_local_addr (tmp2->hostname)) -                            && (!strcmp (tmp->path, tmp2->path))) { -                                snprintf (err_str, 2048, "%s:%s and %s:%s are one and the same", -                                          tmp->hostname, tmp->path, tmp2->hostname, tmp2->path); -                                gf_log ("glusterd", GF_LOG_ERROR, -                                        "%s",err_str); -                                err_ret = 1; -                                delete_list = 1; -                                goto out; -                        } -                } +                list_add_tail (&brickinfo->brick_list, &tmpvolinfo.bricks); +                brickinfo = NULL;          }          ret = glusterd_create_volume (req, dict); @@ -883,7 +820,6 @@ brick_validation:          gf_cmd_log ("Volume create", "on volname: %s %s", volname,                      ((ret || err_ret) != 0) ? "FAILED": "SUCCESS"); -        delete_list = 1;  out:          if ((err_ret || ret) && dict)                  dict_unref (dict); @@ -904,12 +840,9 @@ out:          if (free_ptr)                  GF_FREE(free_ptr); -        if (delete_list) { -                list_for_each_entry_safe (tmp, tmp2, &tmpbrkinfo->brick_list, brick_list) { -                        glusterd_brickinfo_delete (tmp); -                } -        } - +        ret = glusterd_volume_bricks_delete (&tmpvolinfo); +        if (brickinfo) +                glusterd_brickinfo_delete (brickinfo);          if (cli_req.volname)                  free (cli_req.volname); // its a malloced by xdr          return ret; @@ -1015,7 +948,6 @@ glusterd_handle_add_brick (rpcsvc_request_t *req)          int                             brick_count = 0;          char                            *tmpptr = NULL;          int                             i = 0; -        glusterd_peerinfo_t             *peerinfo = NULL;          char                            *brick_list = NULL;          void                            *cli_rsp = NULL;          char                            err_str[2048] = {0,}; @@ -1026,9 +958,7 @@ glusterd_handle_add_brick (rpcsvc_request_t *req)          xlator_t                        *this = NULL;          char                            *free_ptr = NULL;          glusterd_brickinfo_t            *tmpbrkinfo = NULL; -        glusterd_brickinfo_t            *tmp = NULL; -        glusterd_brickinfo_t            *tmp2 = NULL; -        uint32_t                        delete_list = 0; +        glusterd_volinfo_t              tmpvolinfo = {{0},};          this = THIS;          GF_ASSERT(this); @@ -1135,6 +1065,7 @@ brick_val:                      ,volname, ((volinfo->type == 0)? "DEFAULT" : ((volinfo->type                      == 1)? "STRIPE": "REPLICATE")), brick_count, brick_list); +        INIT_LIST_HEAD (&tmpvolinfo.bricks);          while ( i < brick_count) {                  i++;                  brick= strtok_r (brick_list, " \n", &tmpptr); @@ -1143,61 +1074,32 @@ brick_val:                  ret = glusterd_brickinfo_from_brick (brick, &brickinfo);                  if (ret)                          goto out; -                if(!(ret = glusterd_is_local_addr(brickinfo->hostname))) -                        goto brick_validation;       //localhost, continue without validation -                ret = glusterd_friend_find_by_hostname(brickinfo->hostname, -                                                        &peerinfo); +                ret = glusterd_new_brick_validate (brick, brickinfo, err_str, +                                                   sizeof (err_str));                  if (ret) { -                        snprintf(err_str, 2048, "Host %s not a friend", -                                 brickinfo->hostname); -                        gf_log ("glusterd", GF_LOG_ERROR, "%s", err_str);                          err_ret = 1;                          goto out;                  } -                if ((!peerinfo->connected) || -                    (peerinfo->state.state != GD_FRIEND_STATE_BEFRIENDED)) { -                        snprintf(err_str, 2048, "Host %s not connected", -                                 brickinfo->hostname); -                        gf_log ("glusterd", GF_LOG_ERROR, "%s", err_str); +                ret = glusterd_volume_brickinfo_get (brickinfo->uuid, +                                                     brickinfo->hostname, +                                                     brickinfo->path, +                                                     &tmpvolinfo, &tmpbrkinfo); +                if (!ret) {                          err_ret = 1; +                        snprintf (err_str, sizeof (err_str), "Brick: %s:%s, %s" +                                  " in the arguments mean the same", +                                  tmpbrkinfo->hostname, tmpbrkinfo->path, +                                  brick);                          goto out;                  } -brick_validation: -                err_ret = glusterd_is_exisiting_brick (brickinfo->hostname, -                                                       brickinfo->path); -                if (err_ret) { -                        snprintf(err_str, 2048, "Brick: %s already in use", -                                 brick); -                        goto out; -                } - -                if (1 < i) -                        list_add_tail (&brickinfo->brick_list, &tmpbrkinfo->brick_list); -                else -                        tmpbrkinfo = brickinfo; - -        } - -        list_for_each_entry (tmp, &tmpbrkinfo->brick_list, brick_list) { -                list_for_each_entry (tmp2, &tmp->brick_list, brick_list) { -                        if ((!glusterd_is_local_addr (tmp->hostname)) && (!glusterd_is_local_addr (tmp2->hostname)) -                            && (!strcmp (tmp->path, tmp2->path))) { -                                snprintf (err_str, 2048, "%s:%s and %s:%s are one and the same", -                                          tmp->hostname, tmp->path, tmp2->hostname, tmp2->path); -                                gf_log ("glusterd", GF_LOG_ERROR, -                                        "%s",err_str); -                                err_ret = 1; -                                delete_list = 1; -                                goto out; -                        } -                } +                list_add_tail (&brickinfo->brick_list, &tmpvolinfo.bricks); +                brickinfo = NULL;          }          ret = glusterd_add_brick (req, dict);          gf_cmd_log ("Volume add-brick","on volname: %s %s", volname,                     ((ret || err_ret) != 0)? "FAILED" : "SUCCESS"); -        delete_list = 1;  out:          if ((err_ret || ret) && dict) @@ -1217,14 +1119,11 @@ out:                  ret = 0; //sent error to cli, prevent second reply          } -        if (delete_list) { -                list_for_each_entry_safe (tmp, tmp2, &tmpbrkinfo->brick_list, brick_list) { -                        glusterd_brickinfo_delete (tmp); -                } -        } -          if (free_ptr)                  GF_FREE (free_ptr); +        ret = glusterd_volume_bricks_delete (&tmpvolinfo); +        if (brickinfo) +                glusterd_brickinfo_delete (brickinfo);          if (cli_req.volname)                  free (cli_req.volname); //its malloced by xdr          return ret; @@ -1540,7 +1439,7 @@ glusterd_handle_remove_brick (rpcsvc_request_t *req)                  gf_log ("", GF_LOG_DEBUG, "Remove brick count %d brick: %s",                          i, brick); -                ret = glusterd_brickinfo_get(brick, volinfo, &brickinfo); +                ret = glusterd_volume_brickinfo_get_by_brick(brick, volinfo, &brickinfo);                  if (ret) {                          snprintf(err_str, 2048," Incorrect brick %s for volname"                                  " %s", brick, cli_req.volname); diff --git a/xlators/mgmt/glusterd/src/glusterd-op-sm.c b/xlators/mgmt/glusterd/src/glusterd-op-sm.c index 52ebd1b2cda..3109e173b34 100644 --- a/xlators/mgmt/glusterd/src/glusterd-op-sm.c +++ b/xlators/mgmt/glusterd/src/glusterd-op-sm.c @@ -712,7 +712,7 @@ glusterd_op_stage_add_brick (gd1_mgmt_stage_op_req *req, char **op_errstr)                  brick = strtok_r (brick_list+1, " \n", &saveptr);          while ( i < count) { -                ret = glusterd_brickinfo_get (brick, volinfo, &brickinfo); +                ret = glusterd_volume_brickinfo_get_by_brick (brick, volinfo, &brickinfo);                  if (!ret) {                          gf_log ("", GF_LOG_ERROR, "Adding duplicate brick: %s",                                  brick); @@ -863,7 +863,7 @@ glusterd_op_stage_replace_brick (gd1_mgmt_stage_op_req *req, char **op_errstr)                  goto out;          } -        ret = glusterd_brickinfo_get (src_brick, volinfo, +        ret = glusterd_volume_brickinfo_get_by_brick (src_brick, volinfo,                                        &src_brickinfo);          if (ret) {                  snprintf (msg, sizeof (msg), "brick: %s does not exist in " @@ -893,7 +893,7 @@ glusterd_op_stage_replace_brick (gd1_mgmt_stage_op_req *req, char **op_errstr)                  ret = -1;                  goto out;          } -        if (glusterd_is_exisiting_brick (host, path)) { +        if (!glusterd_brickinfo_get (NULL, host, path, NULL)) {                  snprintf(msg, sizeof(msg), "Brick: %s:%s already in use",                           host, path);                  *op_errstr = gf_strdup (msg); @@ -1186,7 +1186,7 @@ glusterd_op_perform_remove_brick (glusterd_volinfo_t  *volinfo, char *brick)          if (!dup_brick)                  goto out; -        ret = glusterd_brickinfo_get (dup_brick, volinfo,  &brickinfo); +        ret = glusterd_volume_brickinfo_get_by_brick (dup_brick, volinfo,  &brickinfo);          if (ret)                  goto out; @@ -1234,7 +1234,7 @@ glusterd_op_perform_replace_brick (glusterd_volinfo_t  *volinfo,          if (ret)                  goto out; -        ret = glusterd_brickinfo_get (old_brick, volinfo, +        ret = glusterd_volume_brickinfo_get_by_brick (old_brick, volinfo,                                        &old_brickinfo);          if (ret)                  goto out; @@ -1320,7 +1320,7 @@ glusterd_op_perform_add_bricks (glusterd_volinfo_t  *volinfo, int32_t count,          while (i <= count) { -                ret = glusterd_brickinfo_get (brick, volinfo, &brickinfo); +                ret = glusterd_volume_brickinfo_get_by_brick (brick, volinfo, &brickinfo);                  if (ret)                          goto out; @@ -2613,7 +2613,7 @@ glusterd_op_replace_brick (gd1_mgmt_stage_op_req *req, dict_t *rsp_dict)                  goto out;          } -        ret = glusterd_brickinfo_get (src_brick, volinfo, &src_brickinfo); +        ret = glusterd_volume_brickinfo_get_by_brick (src_brick, volinfo, &src_brickinfo);          if (ret) {                  gf_log ("", GF_LOG_DEBUG, "Unable to get src-brickinfo");                  goto out; @@ -3970,7 +3970,7 @@ glusterd_do_replace_brick (void *data)                  goto out;          } -        ret = glusterd_brickinfo_get (src_brick, volinfo, &src_brickinfo); +        ret = glusterd_volume_brickinfo_get_by_brick (src_brick, volinfo, &src_brickinfo);          if (ret) {                  gf_log ("", GF_LOG_DEBUG, "Unable to get src-brickinfo");                  goto out; @@ -4527,7 +4527,7 @@ glusterd_op_stage_validate (gd1_mgmt_stage_op_req *req, char **op_errstr)                  case GD_OP_SET_VOLUME:                          ret = glusterd_op_stage_set_volume (req);                          break; -                         +                  case GD_OP_RESET_VOLUME:                          ret = glusterd_op_stage_reset_volume (req); diff --git a/xlators/mgmt/glusterd/src/glusterd-utils.c b/xlators/mgmt/glusterd/src/glusterd-utils.c index 6f1cd07265e..3649ef8639d 100644 --- a/xlators/mgmt/glusterd/src/glusterd-utils.c +++ b/xlators/mgmt/glusterd/src/glusterd-utils.c @@ -531,16 +531,14 @@ glusterd_brickinfo_delete (glusterd_brickinfo_t *brickinfo)  }  int32_t -glusterd_volinfo_delete (glusterd_volinfo_t *volinfo) +glusterd_volume_bricks_delete (glusterd_volinfo_t *volinfo)  { -        int32_t                 ret = -1;          glusterd_brickinfo_t    *brickinfo = NULL;          glusterd_brickinfo_t    *tmp = NULL; +        int32_t                 ret = -1;          GF_ASSERT (volinfo); -        list_del_init (&volinfo->vol_list); -          list_for_each_entry_safe (brickinfo, tmp, &volinfo->bricks,                                     brick_list) {                  ret = glusterd_brickinfo_delete (brickinfo); @@ -548,6 +546,23 @@ glusterd_volinfo_delete (glusterd_volinfo_t *volinfo)                          goto out;          } +out: +        gf_log ("", GF_LOG_DEBUG, "Returning %d", ret); +        return ret; +} + +int32_t +glusterd_volinfo_delete (glusterd_volinfo_t *volinfo) +{ +        int32_t                 ret = -1; + +        GF_ASSERT (volinfo); + +        list_del_init (&volinfo->vol_list); + +        ret = glusterd_volume_bricks_delete (volinfo); +        if (ret) +                goto out;          dict_unref (volinfo->dict);          GF_FREE (volinfo); @@ -642,19 +657,56 @@ out:  }  int32_t -glusterd_brickinfo_get (char *brick, glusterd_volinfo_t *volinfo, -                        glusterd_brickinfo_t **brickinfo) +glusterd_volume_brickinfo_get (uuid_t uuid, char *hostname, char *path, +                               glusterd_volinfo_t *volinfo, +                               glusterd_brickinfo_t **brickinfo) +{ +        glusterd_brickinfo_t    *brickiter = NULL; +        uuid_t                  peer_uuid = {0}; +        int32_t                 ret = -1; + +        if (uuid) { +                uuid_copy (peer_uuid, uuid); +        } else { +                ret = glusterd_hostname_to_uuid (hostname, peer_uuid); +                if (ret) +                        goto out; +        } +        ret = -1; +        list_for_each_entry (brickiter, &volinfo->bricks, brick_list) { + +                if (uuid_is_null (brickiter->uuid)) { +                        ret = glusterd_resolve_brick (brickiter); +                        if (ret) +                                goto out; +                } +                if ((!uuid_compare (peer_uuid, brickiter->uuid)) && +                        !strcmp (brickiter->path, path)) { +                        gf_log ("", GF_LOG_NORMAL, "Found brick"); +                        ret = 0; +                        if (brickinfo) +                                *brickinfo = brickiter; +                        break; +                } +        } + +out: +        gf_log ("", GF_LOG_DEBUG, "Returning %d", ret); +        return ret; +} + +int32_t +glusterd_volume_brickinfo_get_by_brick (char *brick, +                                        glusterd_volinfo_t *volinfo, +                                        glusterd_brickinfo_t **brickinfo)  {          int32_t                 ret = -1;          char                    *hostname = NULL;          char                    *path = NULL;          char                    *dup_brick = NULL;          char                    *free_ptr = NULL; -        glusterd_brickinfo_t    *tmp = NULL; -        uuid_t                  uuid = {0};          GF_ASSERT (brick); -        GF_ASSERT (brickinfo);          GF_ASSERT (volinfo);          gf_log ("", GF_LOG_NORMAL, "brick: %s", brick); @@ -680,26 +732,8 @@ glusterd_brickinfo_get (char *brick, glusterd_volinfo_t *volinfo,                  goto out;          } -        ret = glusterd_hostname_to_uuid (hostname, uuid); -        if (ret) -                goto out; -        ret = -1; -        list_for_each_entry (tmp, &volinfo->bricks, brick_list) { - -                if (uuid_is_null (tmp->uuid)) { -                        ret = glusterd_resolve_brick (tmp); -                        if (ret) -                                goto out; -                } -                if ((!uuid_compare (uuid, tmp->uuid)) && -                        !strcmp (tmp->path, path)) { -                        gf_log ("", GF_LOG_NORMAL, "Found brick"); -                        ret = 0; -                        *brickinfo = tmp; -                        break; -                } -        } - +        ret = glusterd_volume_brickinfo_get (NULL, hostname, path, volinfo, +                                             brickinfo);  out:          if (free_ptr)                  GF_FREE (free_ptr); @@ -1757,15 +1791,14 @@ glusterd_volume_count_get (void)  }  int -glusterd_is_exisiting_brick (char *hostname, char *path) +glusterd_brickinfo_get (uuid_t uuid, char *hostname, char *path, +                        glusterd_brickinfo_t **brickinfo)  { -        glusterd_brickinfo_t            *tmpbrkinfo = NULL;          glusterd_volinfo_t              *volinfo     = NULL;          glusterd_conf_t                 *priv = NULL;          xlator_t                        *this = NULL; -        int                             ret = 0; +        int                             ret = -1; -        GF_ASSERT (hostname);          GF_ASSERT (path);          this = THIS; @@ -1775,16 +1808,11 @@ glusterd_is_exisiting_brick (char *hostname, char *path)          list_for_each_entry (volinfo, &priv->volumes, vol_list) { -                list_for_each_entry (tmpbrkinfo, &volinfo->bricks, -                                     brick_list) { -                        if ((!glusterd_is_local_addr (hostname)) && (!glusterd_is_local_addr (tmpbrkinfo->hostname)) -                            && !strcmp(path, tmpbrkinfo->path)) { -                                gf_log ("glusterd", GF_LOG_ERROR, "Brick %s:%s" -                                        " already in use", hostname, path); -                                ret = 1; -                                goto out; -                        } -                } +                ret = glusterd_volume_brickinfo_get (uuid, hostname, path, +                                                     volinfo, +                                                     brickinfo); +                if (!ret) +                        goto out;          }  out:          return ret; @@ -1955,6 +1983,39 @@ out:  }  int +glusterd_friend_find_by_uuid (uuid_t uuid, +                              glusterd_peerinfo_t  **peerinfo) +{ +        int                     ret = -1; +        glusterd_conf_t         *priv = NULL; +        glusterd_peerinfo_t     *entry = NULL; + +        GF_ASSERT (peerinfo); + +        *peerinfo = NULL; +        priv    = THIS->private; + +        GF_ASSERT (priv); + +        if (uuid_is_null (uuid)) +                return -1; + +        list_for_each_entry (entry, &priv->peers, uuid_list) { +                if (!uuid_compare (entry->uuid, uuid)) { + +                        gf_log ("glusterd", GF_LOG_NORMAL, +                                 "Friend found.. state: %d", +                                  entry->state.state); +                        *peerinfo = entry; +                        return 0; +                } +        } + +        return ret; +} + + +int  glusterd_friend_find_by_hostname (const char *hoststr,                                    glusterd_peerinfo_t  **peerinfo)  { @@ -2127,3 +2188,74 @@ glusterd_is_defrag_on (glusterd_volinfo_t *volinfo)          return ((volinfo->defrag_status == GF_DEFRAG_STATUS_STARTED) ||                  (volinfo->defrag_status == GF_DEFRAG_STATUS_LAYOUT_FIX_COMPLETE));  } + +int +glusterd_new_brick_validate (char *brick, glusterd_brickinfo_t *brickinfo, +                             char *op_errstr, size_t len) +{ +        glusterd_brickinfo_t    *newbrickinfo = NULL; +        glusterd_brickinfo_t    *tmpbrkinfo = NULL; +        int                     ret = -1; +        gf_boolean_t            is_allocated = _gf_false; +        glusterd_peerinfo_t     *peerinfo = NULL; +        glusterd_conf_t         *priv = NULL; +        xlator_t                *this = NULL; + +        this = THIS; +        GF_ASSERT (this); +        priv = this->private; +        GF_ASSERT (priv); + + +        GF_ASSERT (brick); +        GF_ASSERT (op_errstr); + +        if (!brickinfo) { +                ret = glusterd_brickinfo_from_brick (brick, &newbrickinfo); +                if (ret) +                        goto out; +                is_allocated = _gf_true; +        } else { +                newbrickinfo = brickinfo; +        } + +        ret = glusterd_resolve_brick (newbrickinfo); +        if (ret) { +                snprintf (op_errstr, len, "Host %s not a friend", +                          newbrickinfo->hostname); +                gf_log ("glusterd", GF_LOG_ERROR, "%s", op_errstr); +                goto out; +        } + +        if (!uuid_compare (priv->uuid, newbrickinfo->uuid)) +                goto brick_validation; +        ret = glusterd_friend_find_by_uuid (newbrickinfo->uuid, &peerinfo); +        if (ret) +                goto out; +        if ((!peerinfo->connected) || +            (peerinfo->state.state != GD_FRIEND_STATE_BEFRIENDED)) { +                snprintf(op_errstr, len, "Host %s not connected", +                         newbrickinfo->hostname); +                gf_log ("glusterd", GF_LOG_ERROR, "%s", op_errstr); +                ret = -1; +                goto out; +        } +brick_validation: +        ret = glusterd_brickinfo_get (newbrickinfo->uuid, +                                      newbrickinfo->hostname, +                                      newbrickinfo->path, &tmpbrkinfo); +        if (!ret) { +                snprintf(op_errstr, len, "Brick: %s already in use", +                         brick); +                gf_log ("", GF_LOG_ERROR, op_errstr); +                ret = -1; +                goto out; +        } else { +                ret = 0; +        } +out: +        if (is_allocated && newbrickinfo) +                glusterd_brickinfo_delete (newbrickinfo); +        gf_log ("", GF_LOG_DEBUG, "returning %d ", ret); +        return ret; +} diff --git a/xlators/mgmt/glusterd/src/glusterd-utils.h b/xlators/mgmt/glusterd/src/glusterd-utils.h index e2736bf1631..74b837773fc 100644 --- a/xlators/mgmt/glusterd/src/glusterd-utils.h +++ b/xlators/mgmt/glusterd/src/glusterd-utils.h @@ -119,8 +119,9 @@ gf_boolean_t  glusterd_is_cli_op_req (int32_t op);  int32_t -glusterd_brickinfo_get (char *brick, glusterd_volinfo_t *volinfo, -                        glusterd_brickinfo_t **brickinfo); +glusterd_volume_brickinfo_get_by_brick (char *brick, +                                        glusterd_volinfo_t *volinfo, +                                        glusterd_brickinfo_t **brickinfo);  int32_t  glusterd_is_local_addr (char *hostname); @@ -161,9 +162,6 @@ int32_t  glusterd_add_volume_to_dict (glusterd_volinfo_t *volinfo,                               dict_t  *dict, int32_t count);  int -glusterd_is_exisiting_brick (char *hostname, char *path); - -int  glusterd_get_brickinfo (xlator_t *this, const char *brickname,                           int port, gf_boolean_t localhost,                           glusterd_brickinfo_t **brickinfo); @@ -196,4 +194,22 @@ glusterd_brick_stop (glusterd_volinfo_t *volinfo,  int  glusterd_is_defrag_on (glusterd_volinfo_t *volinfo); + +int32_t +glusterd_volinfo_bricks_delete (glusterd_volinfo_t *volinfo); +int +glusterd_friend_find_by_uuid (uuid_t uuid, +                              glusterd_peerinfo_t  **peerinfo); +int +glusterd_new_brick_validate (char *brick, glusterd_brickinfo_t *brickinfo, +                             char *op_errstr, size_t len); +int32_t +glusterd_volume_bricks_delete (glusterd_volinfo_t *volinfo); +int32_t +glusterd_volume_brickinfo_get (uuid_t uuid, char *hostname, char *path, +                               glusterd_volinfo_t *volinfo, +                               glusterd_brickinfo_t **brickinfo); +int +glusterd_brickinfo_get (uuid_t uuid, char *hostname, char *path, +                       glusterd_brickinfo_t **brickinfo);  #endif  | 
