From a6304aec8c366ad7853f95348aa6c73a0b873678 Mon Sep 17 00:00:00 2001 From: Pranith K Date: Tue, 12 Oct 2010 03:08:46 +0000 Subject: mgmt/glusterd: create brick path if does not exist Signed-off-by: Pranith Kumar K Signed-off-by: Vijay Bellur BUG: 971 (dynamic volume management) URL: http://bugs.gluster.com/cgi-bin/bugzilla3/show_bug.cgi?id=971 --- xlators/mgmt/glusterd/src/glusterd-op-sm.c | 84 +++++------------------------- xlators/mgmt/glusterd/src/glusterd-utils.c | 36 +++++++++++++ xlators/mgmt/glusterd/src/glusterd-utils.h | 3 ++ 3 files changed, 53 insertions(+), 70 deletions(-) (limited to 'xlators/mgmt') diff --git a/xlators/mgmt/glusterd/src/glusterd-op-sm.c b/xlators/mgmt/glusterd/src/glusterd-op-sm.c index e0fc1cc7ee3..1ea0b6ce5dc 100644 --- a/xlators/mgmt/glusterd/src/glusterd-op-sm.c +++ b/xlators/mgmt/glusterd/src/glusterd-op-sm.c @@ -326,13 +326,11 @@ glusterd_op_stage_create_volume (gd1_mgmt_stage_op_req *req, char **op_errstr) glusterd_brickinfo_t *brick_info = NULL; int32_t brick_count = 0; int32_t i = 0; - struct stat st_buf = {0,}; char *brick = NULL; char *tmpptr = NULL; char cmd_str[1024]; xlator_t *this = NULL; glusterd_conf_t *priv = NULL; - char msg[2048] = {0,}; GF_ASSERT (req); @@ -417,26 +415,11 @@ glusterd_op_stage_create_volume (gd1_mgmt_stage_op_req *req, char **op_errstr) } if (!uuid_compare (brick_info->uuid, priv->uuid)) { - ret = stat (cmd_str, &st_buf); - if (ret == -1) { - snprintf (msg, 2048,"Volume name %s, brick" - ": %s:%s, path %s not present", volname, - brick_info->hostname, brick_info->path, brick_info->path); - gf_log ("glusterd",GF_LOG_ERROR, "%s", msg); - *op_errstr = gf_strdup (msg); - goto out; - } - - if (!S_ISDIR (st_buf.st_mode)) { - snprintf (msg, 2048, "Volume name %s, brick" - ": %s, path %s is not a directory", volname, - brick, brick_info->path); - gf_log ("glusterd", GF_LOG_ERROR, - "%s", msg); - *op_errstr = gf_strdup (msg); - ret = -1; + ret = glusterd_brick_create_path (brick_info->hostname, + brick_info->path, + 0777, op_errstr); + if (ret) goto out; - } brick_list = tmpptr; } glusterd_brickinfo_delete (brick_info); @@ -496,7 +479,6 @@ glusterd_op_stage_start_volume (gd1_mgmt_stage_op_req *req, char **op_errstr) gf_boolean_t exists = _gf_false; glusterd_volinfo_t *volinfo = NULL; glusterd_brickinfo_t *brickinfo = NULL; - struct stat statbuf = {0,}; char msg[2048]; glusterd_conf_t *priv = NULL; @@ -545,16 +527,11 @@ glusterd_op_stage_start_volume (gd1_mgmt_stage_op_req *req, char **op_errstr) } if (!uuid_compare (brickinfo->uuid, priv->uuid)) { - ret = stat (brickinfo->path, &statbuf); - if (ret == -1) { - snprintf (msg, 2048, "Volume name %s, brick" - ": %s:%s, path %s is not present", - volname, brickinfo->hostname, brickinfo->path, brickinfo->path); - gf_log ("glusterd", GF_LOG_ERROR, - "%s", msg); - *op_errstr = gf_strdup (msg); + ret = glusterd_brick_create_path (brickinfo->hostname, + brickinfo->path, + 0777, op_errstr); + if (ret) goto out; - } } if (!(flags & GF_CLI_FLAG_OP_FORCE)) { @@ -694,7 +671,6 @@ glusterd_op_stage_add_brick (gd1_mgmt_stage_op_req *req, char **op_errstr) char *brick = NULL; glusterd_brickinfo_t *brickinfo = NULL; glusterd_volinfo_t *volinfo = NULL; - struct stat st_buf = {0,}; char cmd_str[1024]; glusterd_conf_t *priv = NULL; char msg[2048] = {0,}; @@ -784,27 +760,11 @@ glusterd_op_stage_add_brick (gd1_mgmt_stage_op_req *req, char **op_errstr) } if (!uuid_compare (brickinfo->uuid, priv->uuid)) { - ret = stat (cmd_str, &st_buf); - if (ret == -1) { - snprintf (msg, 2048, "Volume name %s, brick" - ": %s, path %s not present", volname, - brick, brickinfo->path); - gf_log ("glusterd", GF_LOG_ERROR, - "%s", msg); - *op_errstr = gf_strdup (msg); - goto out; - } - - if (!S_ISDIR (st_buf.st_mode)) { - snprintf (msg, 2048, "Volume name %s, brick" - ": %s, path %s is not a directory", volname, - brick, brickinfo->path); - gf_log ("glusterd", GF_LOG_ERROR, - "%s", msg); - *op_errstr = gf_strdup (msg); - ret = -1; + ret = glusterd_brick_create_path (brickinfo->hostname, + brickinfo->path, + 0777, op_errstr); + if (ret) goto out; - } } glusterd_brickinfo_delete (brickinfo); @@ -844,7 +804,6 @@ glusterd_op_stage_replace_brick (gd1_mgmt_stage_op_req *req, char **op_errstr, char msg[2048] = {0}; char *dup_dstbrick = NULL; glusterd_peerinfo_t *peerinfo = NULL; - struct stat st_buf = {0,}; glusterd_brickinfo_t *dst_brickinfo = NULL; GF_ASSERT (req); @@ -1031,24 +990,9 @@ glusterd_op_stage_replace_brick (gd1_mgmt_stage_op_req *req, char **op_errstr, goto out; } if (!glusterd_is_local_addr (host)) { - ret = stat (path, &st_buf); - if (ret == -1) { - snprintf (msg, sizeof (msg) ,"path: %s for brick: %s" - " does not exist", path, dst_brick); - gf_log ("glusterd", GF_LOG_ERROR, "%s", msg); - *op_errstr = gf_strdup (msg); - goto out; - } - if (!S_ISDIR (st_buf.st_mode)) { - snprintf (msg, sizeof (msg), "Volume name %s, brick" - ": %s, path %s is not a directory", volname, - dst_brick, path); - gf_log ("glusterd", GF_LOG_ERROR, - "%s", msg); - *op_errstr = gf_strdup (msg); - ret = -1; + ret = glusterd_brick_create_path (host, path, 0777, op_errstr); + if (ret) goto out; - } } else { ret = glusterd_friend_find (NULL, host, &peerinfo); if (ret) { diff --git a/xlators/mgmt/glusterd/src/glusterd-utils.c b/xlators/mgmt/glusterd/src/glusterd-utils.c index 1ce1dac27b4..f6fa6f66e92 100644 --- a/xlators/mgmt/glusterd/src/glusterd-utils.c +++ b/xlators/mgmt/glusterd/src/glusterd-utils.c @@ -2387,3 +2387,39 @@ glusterd_rb_check_bricks (glusterd_volinfo_t *volinfo, } return 0; } + +int +glusterd_brick_create_path (char *host, char *path, mode_t mode, + char **op_errstr) +{ + int ret = -1; + char msg[2048] = {0}; + struct stat st_buf = {0}; + + ret = stat (path, &st_buf); + if ((!ret) && (!S_ISDIR (st_buf.st_mode))) { + snprintf (msg, sizeof (msg), "brick %s:%s, " + "path %s is not a directory", host, path, path); + gf_log ("", GF_LOG_ERROR, "%s", msg); + *op_errstr = gf_strdup (msg); + ret = -1; + goto out; + } else if (!ret) { + goto out; + } + + ret = mkdir (path, mode); + if ((ret == -1) && (EEXIST != errno)) { + snprintf (msg, sizeof (msg), "brick: %s:%s, path " + "creation failed, reason: %s", + host, path, strerror(errno)); + gf_log ("glusterd",GF_LOG_ERROR, "%s", msg); + *op_errstr = gf_strdup (msg); + } else { + ret = 0; + } + +out: + 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 0e102a4ee66..5797c35cfdf 100644 --- a/xlators/mgmt/glusterd/src/glusterd-utils.h +++ b/xlators/mgmt/glusterd/src/glusterd-utils.h @@ -227,4 +227,7 @@ glusterd_set_rb_status (glusterd_volinfo_t *volinfo, gf_rb_status_t status); 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, mode_t mode, + char **op_errstr); #endif -- cgit