diff options
| author | Gaurav Kumar Garg <ggarg@redhat.com> | 2015-03-25 18:07:24 +0530 | 
|---|---|---|
| committer | Atin Mukherjee <amukherj@redhat.com> | 2015-11-19 19:41:43 -0800 | 
| commit | 097e131481d25e5b1f859f4ea556b8bf56155472 (patch) | |
| tree | 0086afbddcf7ea8706a5560484ea30fa9488e102 /glusterfsd | |
| parent | b479e086ddbcb5cde83c11b67d542dbd4f2bd739 (diff) | |
glusterd: cli command implementation for bitrot scrub status
CLI command  for bitrot scrub status will be :
gluster volume bitrot <volname> scrub status
Above command will show the statistics of bitrot scrubber.
Upon execution of this command it will show some common
scrubber tunable value of volume <VOLNAME> followed by
statistics of scrubber statistics of individual nodes.
sample ouput for single node:
Volume name : <VOLNAME>
State of scrub: Active
Scrub frequency: biweekly
Bitrot error log location: /var/log/glusterfs/bitd.log
Scrubber error log location: /var/log/glusterfs/scrub.log
=========================================================
Node name:
Number of Scrubbed files:
Number of Unsigned files:
Last completed scrub time:
Duration of last scrub:
Error count:
=========================================================
This is just infrastructure. list of bad file, last scrub
time, error count value will be taken care by
http://review.gluster.org/#/c/12503/  and
http://review.gluster.org/#/c/12654/ patches.
Change-Id: I3ed3c7057c9d0c894233f4079a7f185d90c202d1
BUG: 1207627
Signed-off-by: Gaurav Kumar Garg <ggarg@redhat.com>
Reviewed-on: http://review.gluster.org/10231
Reviewed-by: Atin Mukherjee <amukherj@redhat.com>
Tested-by: NetBSD Build System <jenkins@build.gluster.org>
Tested-by: Gluster Build System <jenkins@build.gluster.com>
Diffstat (limited to 'glusterfsd')
| -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 = {  | 
