diff options
Diffstat (limited to 'xlators/mgmt/glusterd/src')
| -rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-handler.c | 74 | ||||
| -rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-op-sm.c | 94 | ||||
| -rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-rpc-ops.c | 1 | ||||
| -rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-volume-ops.c | 85 | ||||
| -rw-r--r-- | xlators/mgmt/glusterd/src/glusterd.h | 2 | 
5 files changed, 253 insertions, 3 deletions
diff --git a/xlators/mgmt/glusterd/src/glusterd-handler.c b/xlators/mgmt/glusterd/src/glusterd-handler.c index 9433436d0..1b1d113b5 100644 --- a/xlators/mgmt/glusterd/src/glusterd-handler.c +++ b/xlators/mgmt/glusterd/src/glusterd-handler.c @@ -50,6 +50,10 @@  #include "globals.h"  #include "glusterd-syncop.h" +#ifdef HAVE_BD_XLATOR +#include <lvm2app.h> +#endif +  static int  glusterd_handle_friend_req (rpcsvc_request_t *req, uuid_t  uuid,                              char *hostname, int port, @@ -927,6 +931,73 @@ out:          return ret;  } +#ifdef HAVE_BD_XLATOR +int +glusterd_handle_cli_bd_op (rpcsvc_request_t *req) +{ +        int32_t          ret        = -1; +        gf_cli_req       cli_req    = { {0,} }; +        dict_t           *dict      = NULL; +        char             *volname   = NULL; +        char             *op_errstr = NULL; +        glusterd_op_t    cli_op     = GD_OP_BD_OP; + +        GF_ASSERT (req); + +        if (!xdr_to_generic (req->msg[0], &cli_req, +                                (xdrproc_t)xdr_gf_cli_req)) { +                /* failed to decode msg */ +                req->rpc_err = GARBAGE_ARGS; +                goto out; +        } + +        gf_log ("glusterd", GF_LOG_DEBUG, "Received bd op req"); + +        if (cli_req.dict.dict_len) { +                /* Unserialize the dictionary */ +                dict  = dict_new (); + +                ret = dict_unserialize (cli_req.dict.dict_val, +                                        cli_req.dict.dict_len, +                                        &dict); +                if (ret < 0) { +                        gf_log ("glusterd", GF_LOG_ERROR, +                                "failed to " +                                "unserialize req-buffer to dictionary"); +                        goto out; +                } else { +                        dict->extra_stdfree = cli_req.dict.dict_val; +                } +        } + +        ret = dict_get_str (dict, "volname", &volname); +        if (ret) { +                gf_log (THIS->name, GF_LOG_ERROR, +                                "failed to get volname"); +                goto out; +        } + +        ret = glusterd_op_begin (req, GD_OP_BD_OP, dict); +        gf_cmd_log ("bd op: %s", ((ret == 0) ? "SUCCESS": "FAILED")); +out: +        if (ret && dict) +                dict_unref (dict); + +        glusterd_friend_sm (); +        glusterd_op_sm (); + +        if (ret) { +                if (!op_errstr) +                        op_errstr = gf_strdup ("operation failed"); +                ret = glusterd_op_send_cli_response (cli_op, ret, 0, +                                req, NULL, op_errstr); +                GF_FREE (op_errstr); +        } + +        return ret; +} +#endif +  int  glusterd_handle_cli_uuid_reset (rpcsvc_request_t *req)  { @@ -3165,6 +3236,9 @@ rpcsvc_actor_t gd_svc_cli_actors[] = {          [GLUSTER_CLI_STATEDUMP_VOLUME] = {"STATEDUMP_VOLUME", GLUSTER_CLI_STATEDUMP_VOLUME, glusterd_handle_cli_statedump_volume, NULL, 0},          [GLUSTER_CLI_LIST_VOLUME] = {"LIST_VOLUME", GLUSTER_CLI_LIST_VOLUME, glusterd_handle_cli_list_volume, NULL, 0},          [GLUSTER_CLI_CLRLOCKS_VOLUME] = {"CLEARLOCKS_VOLUME", GLUSTER_CLI_CLRLOCKS_VOLUME, glusterd_handle_cli_clearlocks_volume, NULL, 0}, +#ifdef HAVE_BD_XLATOR +        [GLUSTER_CLI_BD_OP]       = {"BD_OP", GLUSTER_CLI_BD_OP, glusterd_handle_cli_bd_op, NULL, 0}, +#endif  };  struct rpcsvc_program gd_svc_cli_prog = { diff --git a/xlators/mgmt/glusterd/src/glusterd-op-sm.c b/xlators/mgmt/glusterd/src/glusterd-op-sm.c index 4ca705161..ac53f2e46 100644 --- a/xlators/mgmt/glusterd/src/glusterd-op-sm.c +++ b/xlators/mgmt/glusterd/src/glusterd-op-sm.c @@ -235,6 +235,20 @@ glusterd_brick_op_build_payload (glusterd_op_t op, glusterd_brickinfo_t *brickin                  brick_req->name = gf_strdup (name);                  break; + +#ifdef HAVE_BD_XLATOR +        case GD_OP_BD_OP: +        { +                brick_req = GF_CALLOC (1, sizeof (*brick_req), +                                       gf_gld_mt_mop_brick_req_t); +                if (!brick_req) +                        goto out; + +                brick_req->op = GLUSTERD_BRICK_BD_OP; +                brick_req->name = ""; +        } +                break; +#endif          default:                  goto out;          break; @@ -2356,6 +2370,9 @@ glusterd_op_build_payload (dict_t **req, char **op_errstr, dict_t *op_ctx)                  case GD_OP_STATEDUMP_VOLUME:                  case GD_OP_CLEARLOCKS_VOLUME:                  case GD_OP_DEFRAG_BRICK_VOLUME: +#ifdef HAVE_BD_XLATOR +                case GD_OP_BD_OP: +#endif                          {                                  ret = dict_get_str (dict, "volname", &volname);                                  if (ret) { @@ -3489,7 +3506,11 @@ glusterd_op_stage_validate (glusterd_op_t op, dict_t *dict, char **op_errstr,                          ret = glusterd_op_stage_clearlocks_volume (dict,                                                                     op_errstr);                          break; - +#ifdef HAVE_BD_XLATOR +                case GD_OP_BD_OP: +                        ret = glusterd_op_stage_bd (dict, op_errstr); +                        break; +#endif                  default:                          gf_log ("", GF_LOG_ERROR, "Unknown op %d",                                  op); @@ -3585,7 +3606,11 @@ glusterd_op_commit_perform (glusterd_op_t op, dict_t *dict, char **op_errstr,                  case GD_OP_CLEARLOCKS_VOLUME:                          ret = glusterd_op_clearlocks_volume (dict, op_errstr);                          break; - +#ifdef HAVE_BD_XLATOR +                case GD_OP_BD_OP: +                        ret = 0; +                        break; +#endif                  default:                          gf_log ("", GF_LOG_ERROR, "Unknown op %d",                                  op); @@ -4325,6 +4350,62 @@ _select_rxlators_for_full_self_heal (xlator_t *this,          return rxlator_count;  } +#ifdef HAVE_BD_XLATOR +static int +glusterd_bricks_select_bd (dict_t *dict, char **op_errstr) +{ +        int                        ret           = -1; +        glusterd_conf_t            *priv         = NULL; +        xlator_t                   *this         = NULL; +        glusterd_pending_node_t    *pending_node = NULL; +        glusterd_volinfo_t         *volinfo      = NULL; +        char                       *volname      = NULL; +        glusterd_brickinfo_t       *brickinfo    = NULL; +        int                         brick_index  = -1; + +        this = THIS; +        GF_ASSERT (this); +        priv = this->private; +        GF_ASSERT (priv); + +        ret = dict_get_str (dict, "volname", &volname); +        if (ret) { +                gf_log (this->name, GF_LOG_ERROR, "Unable to get volname"); +                goto out; +        } +        ret = glusterd_volinfo_find (volname, &volinfo); +        if (ret) +                goto out; + +        pending_node = GF_CALLOC (1, sizeof (*pending_node), +                                  gf_gld_mt_pending_node_t); +        if (!pending_node) { +                ret = -1; +                goto out; +        } + +        list_for_each_entry (brickinfo, &volinfo->bricks, brick_list) { +                brick_index++; +                if (uuid_compare (brickinfo->uuid, MY_UUID) || +                    !glusterd_is_brick_started (brickinfo)) { +                        continue; +                } +                pending_node->node = brickinfo; +                pending_node->type = GD_NODE_BRICK; +                pending_node->index = brick_index; +                list_add_tail (&pending_node->list, +                               &opinfo.pending_bricks); +                pending_node = NULL; +        } + +        ret = 0; + +out: +        gf_log (THIS->name, GF_LOG_DEBUG, "Returning ret %d", ret); +        return ret; +} +#endif +  static int  glusterd_bricks_select_heal_volume (dict_t *dict, char **op_errstr)  { @@ -4402,7 +4483,6 @@ out:  } -  static int  glusterd_bricks_select_rebalance_volume (dict_t *dict, char **op_errstr)  { @@ -4735,6 +4815,11 @@ glusterd_op_bricks_select (glusterd_op_t op, dict_t *dict, char **op_errstr)          case GD_OP_DEFRAG_BRICK_VOLUME:                  ret = glusterd_bricks_select_rebalance_volume (dict, op_errstr);                  break; +#ifdef HAVE_BD_XLATOR +        case GD_OP_BD_OP: +                ret = glusterd_bricks_select_bd (dict, op_errstr); +                break; +#endif          default:                  break;           } @@ -5298,6 +5383,9 @@ glusterd_op_free_ctx (glusterd_op_t op, void *ctx)                  case GD_OP_STATEDUMP_VOLUME:                  case GD_OP_CLEARLOCKS_VOLUME:                  case GD_OP_DEFRAG_BRICK_VOLUME: +#ifdef HAVE_BD_XLATOR +                case GD_OP_BD_OP: +#endif                          dict_unref (ctx);                          break;                  default: diff --git a/xlators/mgmt/glusterd/src/glusterd-rpc-ops.c b/xlators/mgmt/glusterd/src/glusterd-rpc-ops.c index c18c2b5e1..21fad7e93 100644 --- a/xlators/mgmt/glusterd/src/glusterd-rpc-ops.c +++ b/xlators/mgmt/glusterd/src/glusterd-rpc-ops.c @@ -139,6 +139,7 @@ glusterd_op_send_cli_response (glusterd_op_t op, int32_t op_ret,          case GD_OP_LIST_VOLUME:          case GD_OP_CLEARLOCKS_VOLUME:          case GD_OP_HEAL_VOLUME: +        case GD_OP_BD_OP:          {                  /*nothing specific to be done*/                  break; diff --git a/xlators/mgmt/glusterd/src/glusterd-volume-ops.c b/xlators/mgmt/glusterd/src/glusterd-volume-ops.c index 8c76c8f09..b74bbec7c 100644 --- a/xlators/mgmt/glusterd/src/glusterd-volume-ops.c +++ b/xlators/mgmt/glusterd/src/glusterd-volume-ops.c @@ -1241,6 +1241,91 @@ out:          return ret;  } +#ifdef HAVE_BD_XLATOR +int +glusterd_op_stage_bd (dict_t *dict, char **op_errstr) +{ +        int                     ret       = -1; +        char                    *volname  = NULL; +        char                    *path     = NULL; +        char                    *size     = NULL; +        glusterd_volinfo_t      *volinfo  = NULL; +        char                    msg[2048] = {0,}; +        gf_xl_bd_op_t           bd_op     = GF_BD_OP_INVALID; +        uint64_t                bytes     = 0; + +        ret = dict_get_str (dict, "volname", &volname); +        if (ret) { +                snprintf (msg, sizeof(msg), "Failed to get volume name"); +                gf_log (THIS->name, GF_LOG_ERROR, "%s", msg); +                *op_errstr = gf_strdup (msg); +                goto out; +        } + +        ret = dict_get_int32 (dict, "bd-op", (int32_t *)&bd_op); +        if (ret) { +                snprintf (msg, sizeof(msg), "Failed to get bd-op"); +                gf_log (THIS->name, GF_LOG_ERROR, "%s", msg); +                *op_errstr = gf_strdup (msg); +                goto out; +        } + +        ret = dict_get_str (dict, "path", &path); +        if (ret) { +                snprintf (msg, sizeof(msg), "Failed to get path"); +                gf_log (THIS->name, GF_LOG_ERROR, "%s", msg); +                *op_errstr = gf_strdup (msg); +                goto out; +        } + +        if (bd_op == GF_BD_OP_NEW_BD) { +                ret = dict_get_str (dict, "size", &size); +                if (ret) { +                        snprintf (msg, sizeof(msg), "Failed to get size"); +                        gf_log ("", GF_LOG_ERROR, "%s", msg); +                        *op_errstr = gf_strdup (msg); +                        goto out; +                } +                if (gf_string2bytesize (size, &bytes) < 0) { +                        snprintf (msg, sizeof(msg), +                                  "Invalid size %s, suffix with KB, MB etc", +                                   size); +                        gf_log ("", GF_LOG_ERROR, "%s", msg); +                        *op_errstr = gf_strdup (msg); +                        ret = -1; +                        goto out; +                } +        } + +        ret = glusterd_volinfo_find (volname, &volinfo); +        if (ret) { +                snprintf (msg, sizeof(msg), "Volume %s does not exist", +                          volname); +                gf_log ("", GF_LOG_ERROR, "%s", msg); +                *op_errstr = gf_strdup (msg); +                goto out; +        } + +        ret = glusterd_validate_volume_id (dict, volinfo); +        if (ret) +                goto out; + +        if (!glusterd_is_volume_started (volinfo)) { +                snprintf (msg, sizeof(msg), "Volume %s is not started", +                          volname); +                gf_log ("", GF_LOG_ERROR, "%s", msg); +                *op_errstr = gf_strdup (msg); +                ret = -1; +                goto out; +        } + +        ret = 0; +out: +        gf_log ("", GF_LOG_DEBUG, "Returning %d", ret); +        return ret; +} + +#endif  int  glusterd_op_create_volume (dict_t *dict, char **op_errstr) diff --git a/xlators/mgmt/glusterd/src/glusterd.h b/xlators/mgmt/glusterd/src/glusterd.h index ea0ea6061..36cd8f8fc 100644 --- a/xlators/mgmt/glusterd/src/glusterd.h +++ b/xlators/mgmt/glusterd/src/glusterd.h @@ -78,6 +78,7 @@ typedef enum glusterd_op_ {          GD_OP_LIST_VOLUME,          GD_OP_CLEARLOCKS_VOLUME,          GD_OP_DEFRAG_BRICK_VOLUME, +        GD_OP_BD_OP,          GD_OP_MAX,  } glusterd_op_t; @@ -684,6 +685,7 @@ int glusterd_op_statedump_volume (dict_t *dict, char **op_errstr);  int glusterd_op_stage_clearlocks_volume (dict_t *dict, char **op_errstr);  int glusterd_op_clearlocks_volume (dict_t *dict, char **op_errstr); +int glusterd_op_stage_bd (dict_t *dict, char **op_errstr);  /* misc */  void glusterd_do_replace_brick (void *data);  | 
