diff options
Diffstat (limited to 'glusterfsd/src')
| -rw-r--r-- | glusterfsd/src/glusterfsd-messages.h | 6 | ||||
| -rw-r--r-- | glusterfsd/src/glusterfsd-mgmt.c | 83 | 
2 files changed, 88 insertions, 1 deletions
diff --git a/glusterfsd/src/glusterfsd-messages.h b/glusterfsd/src/glusterfsd-messages.h index 9c6196c1d44..caa999506e6 100644 --- a/glusterfsd/src/glusterfsd-messages.h +++ b/glusterfsd/src/glusterfsd-messages.h @@ -36,7 +36,7 @@   */  #define GLFS_COMP_BASE          GLFS_MSGID_COMP_GLUSTERFSD -#define GLFS_NUM_MESSAGES       34 +#define GLFS_NUM_MESSAGES       36  #define GLFS_MSGID_END          (GLFS_COMP_BASE + GLFS_NUM_MESSAGES + 1)  /* Messaged with message IDs */  #define glfs_msg_start_x GLFS_COMP_BASE, "Invalid: Start of messages" @@ -104,6 +104,10 @@                          "was provided"  #define glusterfsd_msg_34 (GLFS_COMP_BASE + 34), "memory accounting init" \                          " failed." +#define glusterfsd_msg_35 (GLFS_COMP_BASE + 35), "rpc req buffer " \ +                        " unserialization failed." +#define glusterfsd_msg_36 (GLFS_COMP_BASE + 36), "problem in xlator " \ +                        " loading."  /*------------*/  #define glfs_msg_end_x GLFS_MSGID_END, "Invalid: End of messages" diff --git a/glusterfsd/src/glusterfsd-mgmt.c b/glusterfsd/src/glusterfsd-mgmt.c index 749873872d2..2e44f94b1bd 100644 --- a/glusterfsd/src/glusterfsd-mgmt.c +++ b/glusterfsd/src/glusterfsd-mgmt.c @@ -21,6 +21,7 @@  #include "rpc-clnt.h"  #include "protocol-common.h" +#include "glusterfsd-messages.h"  #include "glusterfs3.h"  #include "portmap-xdr.h"  #include "xdr-generic.h" @@ -641,6 +642,87 @@ out:          return 0;  } +int +glusterfs_handle_bitrot (rpcsvc_request_t *req) +{ +        int32_t                  ret          = -1; +        gd1_mgmt_brick_op_req    xlator_req   = {0,}; +        dict_t                   *input       = NULL; +        dict_t                   *output      = NULL; +        xlator_t                 *any         = NULL; +        xlator_t                 *this        = NULL; +        xlator_t                 *xlator      = NULL; +        char                     msg[2048]    = {0,}; +        char                     xname[1024]  = {0,}; +        glusterfs_ctx_t          *ctx         = NULL; +        glusterfs_graph_t        *active      = NULL; + +        GF_ASSERT (req); +        this = THIS; +        GF_ASSERT (this); + +        ret = xdr_to_generic (req->msg[0], &xlator_req, +                             (xdrproc_t)xdr_gd1_mgmt_brick_op_req); + +        if (ret < 0) { +                /*failed to decode msg;*/ +                req->rpc_err = GARBAGE_ARGS; +                goto out; +        } + +        ctx = glusterfsd_ctx; +        GF_ASSERT (ctx); + +        active = ctx->active; +        if (!active) { +                req->rpc_err = GARBAGE_ARGS; +                goto out; +        } + +        any = active->first; + +        input = dict_new (); +        if (!input) +                goto out; + +        ret = dict_unserialize (xlator_req.input.input_val, +                                xlator_req.input.input_len, +                                &input); + +        if (ret < 0) { +                gf_msg (this->name, GF_LOG_ERROR, 0, glusterfsd_msg_35); +                goto out; +        } + +        /* Send scrubber request to bitrot xlator */ +        snprintf (xname, sizeof (xname), "%s-bit-rot-0", xlator_req.name); +        xlator = xlator_search_by_name (any, xname); +        if (!xlator) { +                snprintf (msg, sizeof (msg), "xlator %s is not loaded", xname); +                gf_msg (this->name, GF_LOG_ERROR, 0, glusterfsd_msg_36); +                goto out; +        } + +        output = dict_new (); +        if (!output) { +                ret = -1; +                goto out; +        } + +        ret = xlator->notify (xlator, GF_EVENT_SCRUB_STATUS, input, +                              output); +out: +        glusterfs_translator_info_response_send (req, ret, msg, output); + +        if (input) +                dict_unref (input); +        free (xlator_req.input.input_val); /*malloced by xdr*/ +        if (output) +                dict_unref (output); +        free (xlator_req.name); + +        return 0; +}  int  glusterfs_handle_defrag (rpcsvc_request_t *req) @@ -1394,6 +1476,7 @@ rpcsvc_actor_t glusterfs_actors[GLUSTERD_BRICK_MAXVALUE] = {          [GLUSTERD_NODE_STATUS]         = {"NFS STATUS",        GLUSTERD_NODE_STATUS,         glusterfs_handle_node_status,         NULL, 0, DRC_NA},          [GLUSTERD_VOLUME_BARRIER_OP]   = {"VOLUME BARRIER OP", GLUSTERD_VOLUME_BARRIER_OP,   glusterfs_handle_volume_barrier_op,   NULL, 0, DRC_NA},          [GLUSTERD_BRICK_BARRIER]       = {"BARRIER",           GLUSTERD_BRICK_BARRIER,       glusterfs_handle_barrier,             NULL, 0, DRC_NA}, +        [GLUSTERD_NODE_BITROT]         = {"BITROT",            GLUSTERD_NODE_BITROT,         glusterfs_handle_bitrot,              NULL, 0, DRC_NA},  };  struct rpcsvc_program glusterfs_mop_prog = {  | 
