diff options
author | Raghavendra Bhat <raghavendra@redhat.com> | 2013-11-29 12:29:38 +0530 |
---|---|---|
committer | Raghavendra Bhat <raghavendra@redhat.com> | 2013-12-12 14:58:02 +0530 |
commit | 005b445d684f30e8611c9b2a374cdc798a6cdcbb (patch) | |
tree | d5a2f1893179e3b789aac58beed0e2495cee568f /xlators/mgmt/glusterd/src/glusterd-utils.c | |
parent | 112691a0d5a539b71c642228e197764248174f5d (diff) |
cli/glusterd: implement the snap and cg delete functionalities
Change-Id: Icdb66c89acdd043d0d6368c48ce2e01b1a40966f
Signed-off-by: Raghavendra Bhat <raghavendra@redhat.com>
Diffstat (limited to 'xlators/mgmt/glusterd/src/glusterd-utils.c')
-rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-utils.c | 186 |
1 files changed, 186 insertions, 0 deletions
diff --git a/xlators/mgmt/glusterd/src/glusterd-utils.c b/xlators/mgmt/glusterd/src/glusterd-utils.c index 9492baf3a..e9df28b8f 100644 --- a/xlators/mgmt/glusterd/src/glusterd-utils.c +++ b/xlators/mgmt/glusterd/src/glusterd-utils.c @@ -1688,6 +1688,52 @@ glusterd_brick_unlink_socket_file (glusterd_volinfo_t *volinfo, } int32_t +glusterd_snap_brick_unlink_socket_file (glusterd_volinfo_t *volinfo, + glusterd_volinfo_t *snap_volinfo, + glusterd_brickinfo_t *brickinfo) +{ + char path[PATH_MAX] = {0,}; + char socketpath[PATH_MAX] = {0}; + xlator_t *this = NULL; + glusterd_conf_t *priv = NULL; + int ret = 0; + char sock_filepath[PATH_MAX] = {0, }; + int expected_file_len = 0; + char export_path[PATH_MAX] = {0,}; + + GF_ASSERT (volinfo); + GF_ASSERT (snap_volinfo); + GF_ASSERT (brickinfo); + + this = THIS; + GF_ASSERT (this); + priv = this->private; + GF_ASSERT (priv); + + GLUSTERD_GET_SNAP_DIR (path, volinfo, snap_volinfo->volname, priv); + + glusterd_set_socket_filepath (sock_filepath, socketpath, sizeof (socketpath)); + + expected_file_len = strlen (GLUSTERD_SOCK_DIR) + strlen ("/") + + MD5_DIGEST_LENGTH*2 + strlen (".socket") + 1; + GF_ASSERT (sizeof (socketpath) >= expected_file_len); + + GLUSTERD_REMOVE_SLASH_FROM_PATH (brickinfo->path, export_path); + snprintf (sock_filepath, PATH_MAX, "%s/run/%s-%s", + path, brickinfo->hostname, export_path); + + ret = unlink (socketpath); + if (ret && (ENOENT == errno)) { + ret = 0; + } else { + gf_log (this->name, GF_LOG_ERROR, "Failed to remove %s" + " error: %s", socketpath, strerror (errno)); + } + + return ret; +} + +int32_t glusterd_brick_disconnect (glusterd_brickinfo_t *brickinfo) { rpc_clnt_t *rpc = NULL; @@ -1749,6 +1795,49 @@ glusterd_volume_stop_glusterfs (glusterd_volinfo_t *volinfo, } int32_t +glusterd_snap_volume_stop_glusterfs (glusterd_volinfo_t *volinfo, + glusterd_volinfo_t *snap_volinfo, + glusterd_brickinfo_t *brickinfo, + gf_boolean_t del_brick) +{ + xlator_t *this = NULL; + glusterd_conf_t *priv = NULL; + char pidfile[PATH_MAX] = {0,}; + int ret = 0; + + GF_ASSERT (volinfo); + GF_ASSERT (brickinfo); + GF_ASSERT (snap_volinfo); + + this = THIS; + GF_ASSERT (this); + priv = this->private; + GF_ASSERT (priv); + + if (del_brick) + list_del_init (&brickinfo->brick_list); + + if (GLUSTERD_STATUS_STARTED == volinfo->status) { + (void) glusterd_brick_disconnect (brickinfo); + GLUSTERD_GET_SNAP_BRICK_PIDFILE (pidfile, volinfo, + snap_volinfo->volname, + brickinfo, priv); + ret = glusterd_service_stop ("brick", pidfile, SIGTERM, _gf_false); + if (ret == 0) { + glusterd_set_brick_status (brickinfo, GF_BRICK_STOPPED); + (void) glusterd_snap_brick_unlink_socket_file (volinfo, + snap_volinfo, + brickinfo); + } + } + + if (del_brick) + glusterd_delete_snap_brick (volinfo, snap_volinfo, brickinfo); + + return ret; +} + +int32_t glusterd_peer_hostname_new (char *hostname, glusterd_peer_hostname_t **name) { glusterd_peer_hostname_t *peer_hostname = NULL; @@ -5358,6 +5447,60 @@ out: } int +glusterd_snap_brick_stop (glusterd_volinfo_t *volinfo, + glusterd_volinfo_t *snap_volinfo, + glusterd_brickinfo_t *brickinfo, + gf_boolean_t del_brick) +{ + int ret = -1; + xlator_t *this = NULL; + glusterd_conf_t *conf = NULL; + + this = THIS; + GF_ASSERT (this); + conf = this->private; + GF_ASSERT (conf); + + if ((!brickinfo) || (!volinfo) || !snap_volinfo) { + gf_log (this->name, GF_LOG_ERROR, "input parameters NULL"); + goto out; + } + + if (uuid_is_null (brickinfo->uuid)) { + ret = glusterd_resolve_brick (brickinfo); + if (ret) { + gf_log (this->name, GF_LOG_ERROR, FMTSTR_RESOLVE_BRICK, + brickinfo->hostname, brickinfo->path); + goto out; + } + } + + if (uuid_compare (brickinfo->uuid, MY_UUID)) { + ret = 0; + if (del_brick) + glusterd_delete_snap_brick (volinfo, snap_volinfo, + brickinfo); + goto out; + } + + gf_log (this->name, GF_LOG_DEBUG, "About to stop glusterfs" + " for brick %s:%s", brickinfo->hostname, + brickinfo->path); + ret = glusterd_snap_volume_stop_glusterfs (volinfo, snap_volinfo, + brickinfo, del_brick); + if (ret) { + gf_log (this->name, GF_LOG_CRITICAL, "Unable to stop" + " brick: %s:%s", brickinfo->hostname, + brickinfo->path); + goto out; + } + +out: + gf_log (this->name, GF_LOG_TRACE, "returning %d ", ret); + return ret; +} + +int glusterd_is_defrag_on (glusterd_volinfo_t *volinfo) { return (volinfo->rebal.defrag != NULL); @@ -6006,6 +6149,49 @@ glusterd_delete_brick (glusterd_volinfo_t* volinfo, } int32_t +glusterd_delete_snap_brick (glusterd_volinfo_t *volinfo, + glusterd_volinfo_t *snap_volinfo, + glusterd_brickinfo_t *brickinfo) +{ + int ret = 0; + char voldir[PATH_MAX] = {0,}; + xlator_t *this = NULL; + glusterd_conf_t *priv = NULL; + + this = THIS; + GF_ASSERT (this); + priv = this->private; + GF_ASSERT (priv); + + GF_ASSERT (volinfo); + GF_ASSERT (snap_volinfo); + GF_ASSERT (brickinfo); + + GLUSTERD_GET_SNAP_DIR(voldir, volinfo, snap_volinfo->volname, priv); + + ret = glusterd_delete_snap_volfile (volinfo, snap_volinfo, brickinfo); + if (ret) + gf_log (this->name, GF_LOG_WARNING, "failed to delete the " + "volfile for the brick (%s:%s), snap: %s volume: %s", + brickinfo->hostname, brickinfo->path, + snap_volinfo->volname, volinfo->volname); + ret = glusterd_store_delete_brick (brickinfo, voldir); + if (ret) + gf_log (this->name, GF_LOG_WARNING, "failed to delete the " + "store handle of brick (%s:%s), snap: %s volume: %s", + brickinfo->hostname, brickinfo->path, + snap_volinfo->volname, volinfo->volname); + ret = glusterd_brickinfo_delete (brickinfo); + if (ret) + gf_log (this->name, GF_LOG_WARNING, "failed to delete the " + "brickinfo (%s:%s), snap: %s volume: %s", + brickinfo->hostname, brickinfo->path, + snap_volinfo->volname, volinfo->volname); + snap_volinfo->brick_count--; + return ret; +} + +int32_t glusterd_delete_all_bricks (glusterd_volinfo_t* volinfo) { int ret = 0; |