Patchwork [BUG:1304,3/5] cli: Cleanup replace brick operations.

login
register
Submitter Pavan Sondur
Date 2010-08-16 08:05:40
Message ID <20100816080540.GA5448@gluster.com>
Download mbox | patch
Permalink /patch/4145/
State Accepted
Headers show

Comments

Pavan Sondur - 2010-08-16 08:05:40
Signed-off-by: Pavan Vilas Sondur <pavan@gluster.com>
---
 cli/src/cli.c         |   10 +++
 cli/src/cli.h         |   17 ++----
 cli/src/cli3_1-cops.c |  172 +++++++++++++++++++++++++------------------------
 3 files changed, 104 insertions(+), 95 deletions(-)

Patch

diff --git a/cli/src/cli.c b/cli/src/cli.c
index ec24e96..26fa772 100644
--- a/cli/src/cli.c
+++ b/cli/src/cli.c
@@ -492,6 +492,16 @@  cli_local_get ()
         return local;
 }
 
+void
+cli_local_wipe (cli_local_t *local)
+{
+        if (local) {
+                GF_FREE (local);
+        }
+
+        return;
+}
+
 struct cli_state *global_state;
 
 int
diff --git a/cli/src/cli.h b/cli/src/cli.h
index 854c609..9efabfe 100644
--- a/cli/src/cli.h
+++ b/cli/src/cli.h
@@ -39,14 +39,6 @@  enum argp_option_keys {
 	ARGP_PORT_KEY = 'p',
 };
 
-typedef enum replace_brick_cmd {
-        REPLACE_BRICK_START,
-        REPLACE_BRICK_PAUSE,
-        REPLACE_BRICK_ABORT,
-        REPLACE_BRICK_STATUS,
-        REPLACE_BRICK_COMMIT,
-} replace_brick_cmd_t;
-
 struct cli_state;
 struct cli_cmd_word;
 struct cli_cmd_tree;
@@ -129,10 +121,8 @@  struct cli_local {
                 } defrag_vol;
 
                 struct {
-                        char    *volume;
-                        replace_brick_cmd_t op;
-                        char *src_brick;
-                        char *dst_brick;
+                        char    *volname;
+                        dict_t  *dict;
                 } replace_brick;
         } u;
 };
@@ -186,6 +176,9 @@  cli_cmd_volume_replace_brick_parse (const char **words, int wordcount,
 
 cli_local_t * cli_local_get ();
 
+void
+cli_local_wipe (cli_local_t *local);
+
 int32_t
 cli_cmd_await_connected ();
 
diff --git a/cli/src/cli3_1-cops.c b/cli/src/cli3_1-cops.c
index 83d5afd..8f81815 100644
--- a/cli/src/cli3_1-cops.c
+++ b/cli/src/cli3_1-cops.c
@@ -677,47 +677,27 @@  out:
 }
 
 
-static int
-replace_brick_mount (char *volname)
-{
-        char  cmd_str[8192] = {0,};
-
-        gf_log ("", GF_LOG_DEBUG,
-                "creating directory");
-
-        snprintf (cmd_str, 4096, "mkdir -p /tmp/mnt");
-        system (cmd_str);
-
-        gf_log ("", GF_LOG_DEBUG,
-                "creating maintenance mount");
-
-        snprintf (cmd_str, 4096, "glusterfs -f /tmp/replace_brick.vol /tmp/mnt -l /tmp/pav_log -LTRACE");
-
-        system (cmd_str);
-
-        return 0;
-}
 
 int
 gf_cli3_1_replace_brick_cbk (struct rpc_req *req, struct iovec *iov,
                              int count, void *myframe)
 {
-        gf1_cli_replace_brick_rsp       rsp   = {0,};
-        int                             ret   = 0;
-        cli_local_t                     *local = NULL;
-        call_frame_t                    *frame = NULL;
-        char *src_brick = NULL;
-        char *dst_brick = NULL;
-        char *replace_brick_op = NULL;
-        char  status_msg[8192] = {0,};
-        char  cmd_str[8192] = {0,};
+        gf1_cli_replace_brick_rsp        rsp              = {0,};
+        int                              ret              = 0;
+        cli_local_t                     *local            = NULL;
+        call_frame_t                    *frame            = NULL;
+        dict_t                          *dict             = NULL;
+        char                            *src_brick        = NULL;
+        char                            *dst_brick        = NULL;
+        gf1_cli_replace_op               replace_op       = 0;
+        char                            *rb_operation_str = NULL;
+        char                             cmd_str[8192]    = {0,};
 
         if (-1 == req->rpc_status) {
                 goto out;
         }
 
         frame = (call_frame_t *) myframe;
-        local = frame->local;
 
         ret = gf_xdr_to_cli_replace_brick_rsp (*iov, &rsp);
         if (ret < 0) {
@@ -725,89 +705,95 @@  gf_cli3_1_replace_brick_cbk (struct rpc_req *req, struct iovec *iov,
                 goto out;
         }
 
-        switch (local->u.replace_brick.op) {
-        case REPLACE_BRICK_START:
-
-                replace_brick_op = "Replace brick start operation";
-
-                replace_brick_mount (local->u.replace_brick.volume);
-
-                gf_log ("", GF_LOG_DEBUG,
-                        "sending setxattr");
-
-                snprintf (cmd_str, 4096, "sleep 2; stat /tmp/mnt/ >/dev/null;setfattr -n trusted.glusterfs.pump.start /tmp/mnt/");
-
-                system (cmd_str);
+        local = frame->local;
+        GF_ASSERT (local);
+        dict = local->u.replace_brick.dict;
 
+        ret = dict_get_int32 (dict, "operation", (int32_t *)&replace_op);
+        if (ret) {
                 gf_log ("", GF_LOG_DEBUG,
-                        "umounting");
-
-                snprintf (cmd_str, 4096, "umount -f /tmp/mnt 2>/dev/null");
-
-                ret = system (cmd_str);
+                        "dict_get on operation failed");
+                goto out;
+        }
 
-                system ("rmdir /tmp/mnt");
+        switch (replace_op) {
+        case GF_REPLACE_OP_START:
+                rb_operation_str = "Replace brick start operation";
                 break;
 
-        case REPLACE_BRICK_STATUS:
-
-                replace_brick_op = "Replace brick status operation";
-
-                snprintf (cmd_str, 4096, "mkdir -p /tmp/mnt");
-                system (cmd_str);
-
-                snprintf (cmd_str, 4096, "glusterfs -f /tmp/replace_brick.vol /tmp/mnt -l /tmp/pav_log -LTRACE");
-                system (cmd_str);
-
-                gf_log ("", GF_LOG_DEBUG,
-                        "sending getxattr");
-
-                ret = lgetxattr ("/tmp/mnt/", "trusted.glusterfs.pump.status", status_msg, 8192);
-                fprintf (stdout, "%s\n", status_msg);
-
-                gf_log ("", GF_LOG_DEBUG,
-                        "umounting");
-
-                snprintf (cmd_str, 4096, "umount -f /tmp/mnt 2>/dev/null");
+        case GF_REPLACE_OP_STATUS:
+                rb_operation_str = "Replace brick status operation";
+                break;
 
-                ret = system (cmd_str);
+        case GF_REPLACE_OP_PAUSE:
+                rb_operation_str = "Replace brick pause operation";
+                break;
 
-                system ("rmdir /tmp/mnt");
+        case GF_REPLACE_OP_ABORT:
+                rb_operation_str = "Replace brick abort operation";
                 break;
 
-        case REPLACE_BRICK_COMMIT:
+        case GF_REPLACE_OP_COMMIT:
+                rb_operation_str = "Replace brick commit operation";
 
-                replace_brick_op = "Replace brick commit operation";
+                ret = dict_get_str (dict, "src-brick", &src_brick);
+                if (ret) {
+                        gf_log ("", GF_LOG_DEBUG,
+                                "dict_get on src-brick failed");
+                        goto out;
+                }
 
-                src_brick = local->u.replace_brick.src_brick;
-                dst_brick = local->u.replace_brick.dst_brick;
+                ret = dict_get_str (dict, "dst-brick", &dst_brick);
+                if (ret) {
+                        gf_log ("", GF_LOG_DEBUG,
+                                "dict_get on dst-brick failed");
+                        goto out;
+                }
 
                 snprintf (cmd_str, 4096, "gluster volume add-brick %s %s >/dev/null",
-                          local->u.replace_brick.volume, dst_brick);
+                          local->u.replace_brick.volname, dst_brick);
 
                 ret = system (cmd_str);
+                if (ret) {
+                        gf_log ("", GF_LOG_DEBUG,
+                                "add brick failed");
+                        goto out;
+                }
 
                 snprintf (cmd_str, 4096, "gluster volume remove-brick %s %s >/dev/null",
-                          local->u.replace_brick.volume, src_brick);
+                          local->u.replace_brick.volname, src_brick);
 
                 ret = system (cmd_str);
+                if (ret) {
+                        gf_log ("", GF_LOG_DEBUG,
+                                "remove brick failed");
+                        goto out;
+                }
 
                 break;
 
         default:
+                gf_log ("", GF_LOG_DEBUG,
+                        "Unknown operation");
                 break;
         }
 
 
         gf_log ("cli", GF_LOG_NORMAL, "Received resp to replace brick");
         cli_out ("%s %s",
-                 replace_brick_op ? replace_brick_op : "Unknown operation",
+                 rb_operation_str ? rb_operation_str : "Unknown operation",
                  (rsp.op_ret) ? "unsuccessful":
                  "successful");
 
         ret = rsp.op_ret;
 
 out:
+        if (local) {
+                dict_unref (local->u.replace_brick.dict);
+                GF_FREE (local->u.replace_brick.volname);
+                cli_local_wipe (local);
+        }
+
         cli_cmd_broadcast_response (ret);
         return ret;
 }
@@ -1338,11 +1324,12 @@  int32_t
 gf_cli3_1_replace_brick (call_frame_t *frame, xlator_t *this,
                          void *data)
 {
-        gf1_cli_replace_brick_req  req = {0,};
-        int                        ret = 0;
-        dict_t                     *dict = NULL;
-        char                       *src_brick = NULL;
-        char                       *dst_brick = NULL;
+        gf1_cli_replace_brick_req   req        = {0,};
+        int                         ret        = 0;
+        cli_local_t                *local      = NULL;
+        dict_t                     *dict       = NULL;
+        char                       *src_brick  = NULL;
+        char                       *dst_brick  = NULL;
 
         if (!frame || !this ||  !data) {
                 ret = -1;
@@ -1351,6 +1338,17 @@  gf_cli3_1_replace_brick (call_frame_t *frame, xlator_t *this,
 
 	dict = data;
 
+        local = cli_local_get ();
+        if (!local) {
+                ret = -1;
+                gf_log (this->name, GF_LOG_ERROR,
+                        "Out of memory");
+                goto out;
+        }
+
+        local->u.replace_brick.dict = dict_ref (dict);
+        frame->local                = local;
+
         ret = dict_get_int32 (dict, "operation", (int32_t *)&req.op);
         if (ret) {
                 gf_log (this->name, GF_LOG_DEBUG,
@@ -1364,6 +1362,14 @@  gf_cli3_1_replace_brick (call_frame_t *frame, xlator_t *this,
                 goto out;
         }
 
+        local->u.replace_brick.volname = strdup (req.volname);
+        if (!local->u.replace_brick.volname) {
+                gf_log (this->name, GF_LOG_ERROR,
+                        "Out of memory");
+                ret = -1;
+                goto out;
+        }
+
         ret = dict_get_str (dict, "src-brick", &src_brick);
         if (ret) {
                 gf_log (this->name, GF_LOG_DEBUG,