summaryrefslogtreecommitdiffstats
path: root/xlators/mgmt/glusterd/src/glusterd-utils.c
diff options
context:
space:
mode:
authorRaghavendra Bhat <raghavendra@redhat.com>2013-11-29 12:29:38 +0530
committerRaghavendra Bhat <raghavendra@redhat.com>2013-12-12 14:58:02 +0530
commit005b445d684f30e8611c9b2a374cdc798a6cdcbb (patch)
treed5a2f1893179e3b789aac58beed0e2495cee568f /xlators/mgmt/glusterd/src/glusterd-utils.c
parent112691a0d5a539b71c642228e197764248174f5d (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.c186
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;