diff options
Diffstat (limited to 'cli/src/cli3_1-cops.c')
| -rw-r--r-- | cli/src/cli3_1-cops.c | 172 | 
1 files changed, 89 insertions, 83 deletions
diff --git a/cli/src/cli3_1-cops.c b/cli/src/cli3_1-cops.c index 83d5afdc220..8f81815e803 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,  | 
