diff options
| -rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-brick-ops.c | 31 | ||||
| -rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-op-sm.h | 3 | ||||
| -rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-replace-brick.c | 61 | ||||
| -rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-utils.c | 37 | ||||
| -rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-utils.h | 4 | ||||
| -rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-volume-ops.c | 11 | 
6 files changed, 34 insertions, 113 deletions
diff --git a/xlators/mgmt/glusterd/src/glusterd-brick-ops.c b/xlators/mgmt/glusterd/src/glusterd-brick-ops.c index 2f1c37f0e9f..c170972ce83 100644 --- a/xlators/mgmt/glusterd/src/glusterd-brick-ops.c +++ b/xlators/mgmt/glusterd/src/glusterd-brick-ops.c @@ -1024,6 +1024,16 @@ glusterd_op_stage_add_brick (dict_t *dict, char **op_errstr)                  goto out;          } +        if (glusterd_is_rb_ongoing (volinfo)) { +                snprintf (msg, sizeof (msg), "Replace brick is in progress on " +                          "volume %s. Please retry after replace-brick " +                          "operation is committed or aborted", volname); +                gf_log (THIS->name, GF_LOG_ERROR, "%s", msg); +                *op_errstr = gf_strdup (msg); +                ret = -1; +                goto out; +        } +          if (glusterd_is_defrag_on(volinfo)) {                  snprintf (msg, sizeof(msg), "Volume name %s rebalance is in "                            "progress. Please retry after completion", volname); @@ -1050,17 +1060,6 @@ glusterd_op_stage_add_brick (dict_t *dict, char **op_errstr)                  free_ptr = brick_list;          } -        /* Check whether any of the bricks given is the destination brick of the -           replace brick running */ - -        str_ret = glusterd_check_brick_rb_part (all_bricks, count, volinfo); -        if (str_ret) { -                gf_log (THIS->name, GF_LOG_ERROR, "%s", str_ret); -                *op_errstr = gf_strdup (str_ret); -                ret = -1; -                goto out; -        } -          if (count)                  brick = strtok_r (brick_list+1, " \n", &saveptr); @@ -1161,6 +1160,16 @@ glusterd_op_stage_remove_brick (dict_t *dict, char **op_errstr)                  goto out;          } +        if (glusterd_is_rb_ongoing (volinfo)) { +                snprintf (msg, sizeof (msg), "Replace brick is in progress on " +                          "volume %s. Please retry after replace-brick " +                          "operation is committed or aborted", volname); +                gf_log (THIS->name, GF_LOG_ERROR, "%s", msg); +                *op_errstr = gf_strdup (msg); +                ret = -1; +                goto out; +        } +          ret = dict_get_int32 (dict, "command", &flag);          if (ret) {                  gf_log ("", GF_LOG_ERROR, "Unable to get brick count"); diff --git a/xlators/mgmt/glusterd/src/glusterd-op-sm.h b/xlators/mgmt/glusterd/src/glusterd-op-sm.h index e658e6ece79..12aa139f591 100644 --- a/xlators/mgmt/glusterd/src/glusterd-op-sm.h +++ b/xlators/mgmt/glusterd/src/glusterd-op-sm.h @@ -218,9 +218,6 @@ glusterd_check_option_exists(char *optstring, char **completion);  int  set_xlator_option (dict_t *dict, char *key, char *value); -char * -glusterd_check_brick_rb_part (char *bricks, int count, glusterd_volinfo_t *volinfo); -  void  glusterd_do_replace_brick (void *data);  int diff --git a/xlators/mgmt/glusterd/src/glusterd-replace-brick.c b/xlators/mgmt/glusterd/src/glusterd-replace-brick.c index 92ae963a109..40202dd82ca 100644 --- a/xlators/mgmt/glusterd/src/glusterd-replace-brick.c +++ b/xlators/mgmt/glusterd/src/glusterd-replace-brick.c @@ -169,65 +169,6 @@ out:          return ret;  } - -char * -glusterd_check_brick_rb_part (char *bricks, int count, glusterd_volinfo_t *volinfo) -{ -        char                                    *saveptr = NULL; -        char                                    *brick = NULL; -        char                                    *brick_list = NULL; -        int                                     ret = 0; -        glusterd_brickinfo_t                    *brickinfo = NULL; -        uint32_t                                i = 0; -        char                                    *str = NULL; -        char                                    msg[2048] = {0,}; - -        brick_list = gf_strdup (bricks); -        if (!brick_list) { -                gf_log ("glusterd", GF_LOG_ERROR, -                        "Out of memory"); -                ret = -1; -                goto out; -        } - -        if (count) -                brick = strtok_r (brick_list+1, " \n", &saveptr); - - -        while ( i < count) { -                ret = glusterd_brickinfo_from_brick (brick, &brickinfo); -                if (ret) { -                        snprintf (msg, sizeof(msg), "Unable to" -                                  " get brickinfo"); -                        gf_log ("", GF_LOG_ERROR, "%s", msg); -                        ret = -1; -                        goto out; -                } - -                if (glusterd_is_replace_running (volinfo, brickinfo)) { -                        snprintf (msg, sizeof(msg), "Volume %s: replace brick is running" -                          " and the brick %s:%s you are trying to add is the destination brick" -                          " for replace brick", volinfo->volname, brickinfo->hostname, brickinfo->path); -                        ret = -1; -                        goto out; -                } - -                glusterd_brickinfo_delete (brickinfo); -                brickinfo = NULL; -                brick = strtok_r (NULL, " \n", &saveptr); -                i++; -        } - -out: -        if (brick_list) -                GF_FREE(brick_list); -        if (brickinfo) -                glusterd_brickinfo_delete (brickinfo); -        if (ret) -                str = gf_strdup (msg); -        return str; -} -  static int  glusterd_get_rb_dst_brickinfo (glusterd_volinfo_t *volinfo,                                 glusterd_brickinfo_t **brickinfo) @@ -826,6 +767,7 @@ out:  static const char *dst_brick_volfile_str = "volume src-posix\n"          " type storage/posix\n"          " option directory %s\n" +        " option volume-id %s\n"          "end-volume\n"          "volume %s\n"          " type features/locks\n" @@ -872,6 +814,7 @@ rb_generate_dst_brick_volfile (glusterd_volinfo_t *volinfo,  	}          fprintf (file, dst_brick_volfile_str, dst_brickinfo->path, +                 uuid_utoa (volinfo->volume_id),                   dst_brickinfo->path, dst_brickinfo->path,                   trans_type, dst_brickinfo->path); diff --git a/xlators/mgmt/glusterd/src/glusterd-utils.c b/xlators/mgmt/glusterd/src/glusterd-utils.c index c0462d9c779..3230ddc8ab0 100644 --- a/xlators/mgmt/glusterd/src/glusterd-utils.c +++ b/xlators/mgmt/glusterd/src/glusterd-utils.c @@ -3742,43 +3742,6 @@ glusterd_is_rb_ongoing (glusterd_volinfo_t *volinfo)  }  int -glusterd_is_replace_running (glusterd_volinfo_t *volinfo, glusterd_brickinfo_t *brickinfo) -{ -        int ret = 0; -        char *src_hostname = NULL; -        char *brick_hostname = NULL; - -        if (volinfo->src_brick) { -                src_hostname = gf_strdup (volinfo->src_brick->hostname); -                if (!src_hostname) { -                        ret = -1; -                        goto out; -                } -        } else { -                gf_log ("glusterd", GF_LOG_DEBUG, -                        "replace brick is not running"); -                goto out; -        } - -        brick_hostname = gf_strdup (brickinfo->hostname); -        if (!brick_hostname) { -                ret = -1; -                goto out; -        } -        if (!glusterd_is_local_addr (src_hostname) && !glusterd_is_local_addr (brick_hostname)) { -                if (glusterd_is_rb_started (volinfo) || glusterd_is_rb_paused (volinfo)) -                        ret = -1; -        } - -out: -        if (src_hostname) -                GF_FREE (src_hostname); -        if (brick_hostname) -                GF_FREE (brick_hostname); -        return ret; -} - -int  glusterd_new_brick_validate (char *brick, glusterd_brickinfo_t *brickinfo,                               char *op_errstr, size_t len)  { diff --git a/xlators/mgmt/glusterd/src/glusterd-utils.h b/xlators/mgmt/glusterd/src/glusterd-utils.h index ba1b8f67805..e6a655ca780 100644 --- a/xlators/mgmt/glusterd/src/glusterd-utils.h +++ b/xlators/mgmt/glusterd/src/glusterd-utils.h @@ -295,11 +295,9 @@ gf_boolean_t  glusterd_is_rb_ongoing (glusterd_volinfo_t *volinfo);  int -glusterd_is_replace_running (glusterd_volinfo_t *volinfo, glusterd_brickinfo_t *brickinfo); - -int  glusterd_rb_check_bricks (glusterd_volinfo_t *volinfo,                            glusterd_brickinfo_t *src_brick, glusterd_brickinfo_t *dst_brick); +  int  glusterd_brick_create_path (char *host, char *path, uuid_t uuid, mode_t mode,                              char **op_errstr); diff --git a/xlators/mgmt/glusterd/src/glusterd-volume-ops.c b/xlators/mgmt/glusterd/src/glusterd-volume-ops.c index 1389f78f9d4..3208ad35537 100644 --- a/xlators/mgmt/glusterd/src/glusterd-volume-ops.c +++ b/xlators/mgmt/glusterd/src/glusterd-volume-ops.c @@ -884,6 +884,17 @@ glusterd_op_stage_stop_volume (dict_t *dict, char **op_errstr)                  ret = -1;                  goto out;          } + +        if (glusterd_is_rb_ongoing (volinfo)) { +                snprintf (msg, sizeof (msg), "Replace brick is in progress on " +                          "volume %s. Please retry after replace-brick " +                          "operation is committed or aborted", volname); +                gf_log (THIS->name, GF_LOG_ERROR, "%s", msg); +                *op_errstr = gf_strdup (msg); +                ret = -1; +                goto out; +        } +          if (glusterd_is_defrag_on (volinfo)) {                  snprintf (msg, sizeof(msg), "rebalance session is "                            "in progress for the volume '%s'", volname);  | 
