On Tue, Oct 22, 2013 at 4:19 PM, Hitoshi Mitake <[email protected]> wrote: > At Tue, 22 Oct 2013 14:14:28 +0800, > Liu Yuan wrote: >> >> On Sat, Oct 19, 2013 at 11:35:33PM +0900, Hitoshi Mitake wrote: >> > This patch adds two new opcode for runtime loglevel changes and let >> > dog support the changing from command line. This is useful for making >> > sheep process verbose temporally and can make troubleshooting easier. >> > >> > Example of usage: >> > >> > $ dog node loglevel list >> > emerg (0) >> > alert (1) >> > crit (2) >> > err (3) >> > warning (4) >> > notice (5) >> > info (6) >> > debug (7) >> > $ dog node loglevel get >> > info (6) >> > $ dog node loglevel set debug # <- change loglevel from info to debug >> > $ dog node loglevel get >> > debug (7) >> > >> > Signed-off-by: Hitoshi Mitake <[email protected]> >> > --- >> > CHANGELOG.md | 8 +++-- >> > dog/common.c | 84 >> > ++++++++++++++++++++++++++++++++++++++++++++++++ >> > dog/dog.h | 5 +++ >> > dog/node.c | 79 >> > ++++++++++++++++++++++++++++++++++++++++++++- >> > include/internal_proto.h | 2 ++ >> > include/logger.h | 3 ++ >> > lib/logger.c | 12 +++++++ >> > sheep/ops.c | 43 +++++++++++++++++++++++++ >> > 8 files changed, 233 insertions(+), 3 deletions(-) >> > >> > diff --git a/CHANGELOG.md b/CHANGELOG.md >> > index 98d221e..771d69b 100644 >> > --- a/CHANGELOG.md >> > +++ b/CHANGELOG.md >> > @@ -3,9 +3,13 @@ >> > >> > DOG COMMAND INTERFACE: >> > - new subcommand "vdi cache purge" for cleaning stale object cache >> > - -- "vdi cache purge" cleans stale cache of all images >> > - -- "vdi cache purge <image>" cleans stale cache of the specified image >> > + - "vdi cache purge" cleans stale cache of all images >> > + - "vdi cache purge <image>" cleans stale cache of the specified image >> > - new subcommand "node stat" for showing I/O status of the node >> > + - new subcommand "node loglevel" for changing log level at runtime >> > + - "node loglevel set" sets loglevel of running sheep process >> > + - "node loglevel get" gets loglevel from running sheep process >> > + - "node loglevel list" lists avialable loglevels >> > >> > SHEEP COMMAND INTERFACE: >> > - improvements of help messages >> > diff --git a/dog/common.c b/dog/common.c >> > index 5e7ce2e..44e116d 100644 >> > --- a/dog/common.c >> > +++ b/dog/common.c >> > @@ -351,3 +351,87 @@ bool is_erasure_oid(uint64_t oid, uint8_t policy) >> > return false; >> > return true; >> > } >> > + >> > +static const char *loglevel_table[] = { >> > + "emerg", >> > + "alert", >> > + "crit", >> > + "err", >> > + "warning", >> > + "notice", >> > + "info", >> > + "debug", >> > +}; /* index is log level */ >> > + >> > +int do_loglevel_set(const struct node_id *nid, const char *loglevel_str) >> > +{ >> > + int32_t loglevel = -1; >> > + int ret; >> > + struct sd_req hdr; >> > + struct sd_rsp *rsp = (struct sd_rsp *)&hdr; >> > + >> > + for (int i = 0; i < ARRAY_SIZE(loglevel_table); i++) { >> > + if (!strcmp(loglevel_table[i], loglevel_str)) { >> > + loglevel = i; >> > + break; >> > + } >> > + } >> > + >> > + if (loglevel == -1) >> > + return EXIT_USAGE; >> > + >> > + sd_init_req(&hdr, SD_OP_SET_LOGLEVEL); >> > + hdr.flags = SD_FLAG_CMD_WRITE; >> > + hdr.data_length = sizeof(loglevel); >> > + >> > + ret = dog_exec_req(nid, &hdr, &loglevel); >> > + if (ret < 0) >> > + return EXIT_SYSFAIL; >> > + >> > + if (rsp->result != SD_RES_SUCCESS) >> > + return EXIT_FAILURE; >> > + >> > + return EXIT_SUCCESS; >> > +} >> > + >> > +int do_loglevel_get(const struct node_id *nid, int32_t *ret_loglevel) >> > +{ >> > + int32_t loglevel = -1; >> > + int ret; >> > + struct sd_req hdr; >> > + struct sd_rsp *rsp = (struct sd_rsp *)&hdr; >> > + >> > + sd_init_req(&hdr, SD_OP_GET_LOGLEVEL); >> > + hdr.data_length = sizeof(loglevel); >> > + >> > + ret = dog_exec_req(nid, &hdr, &loglevel); >> > + if (ret < 0) >> > + return EXIT_SYSFAIL; >> > + >> > + if (rsp->result != SD_RES_SUCCESS) >> > + return EXIT_FAILURE; >> > + >> > + *ret_loglevel = loglevel; >> > + >> > + return EXIT_SUCCESS; >> > +} >> > + >> > +const char *loglevel_to_str(int loglevel) >> > +{ >> > + for (int i = 0; i < ARRAY_SIZE(loglevel_table); i++) { >> > + if (i == loglevel) >> > + return loglevel_table[i]; >> > + } >> > + >> > + return "unknown loglevel"; >> > +} >> > + >> > +void dump_loglevels(bool err) >> > +{ >> > + for (int i = 0; i < ARRAY_SIZE(loglevel_table); i++) { >> > + if (err) >> > + sd_err("%s\t(%d)", loglevel_table[i], i); >> > + else >> > + sd_info("%s\t(%d)", loglevel_table[i], i); >> > + } >> > +} >> > diff --git a/dog/dog.h b/dog/dog.h >> > index 769fc6c..28c36a1 100644 >> > --- a/dog/dog.h >> > +++ b/dog/dog.h >> > @@ -95,4 +95,9 @@ extern struct command cluster_command; >> > #define trace_command {} >> > #endif /* HAVE_TRACE */ >> > >> > +int do_loglevel_set(const struct node_id *nid, const char *loglevel_str); >> > +int do_loglevel_get(const struct node_id *nid, int32_t *ret_loglevel); >> > +const char *loglevel_to_str(int loglevel); >> > +void dump_loglevels(bool err); >> > + >> > #endif >> > diff --git a/dog/node.c b/dog/node.c >> > index 052739c..5f1b070 100644 >> > --- a/dog/node.c >> > +++ b/dog/node.c >> > @@ -420,7 +420,6 @@ static int node_md(int argc, char **argv) >> > return do_generic_subcommand(node_md_cmd, argc, argv); >> > } >> > >> > - >> > static int node_parser(int ch, const char *opt) >> > { >> > switch (ch) { >> > @@ -444,6 +443,82 @@ static struct sd_option node_options[] = { >> > { 0, NULL, false, NULL }, >> > }; >> > >> > +static int node_loglevel_set(int argc, char **argv) >> > +{ >> > + int ret = 0; >> > + char *loglevel_str = argv[optind]; >> > + >> > + ret = do_loglevel_set(&sd_nid, loglevel_str); >> > + switch (ret) { >> > + case EXIT_USAGE: >> > + sd_err("invalid loglevel: %s", loglevel_str); >> > + sd_err("available loglevels:"); >> > + dump_loglevels(true); >> > + >> > + ret = -1; >> > + break; >> > + case EXIT_FAILURE: >> > + case EXIT_SYSFAIL: >> > + sd_err("Failed to execute request"); >> > + ret = -1; >> > + break; >> > + case EXIT_SUCCESS: >> > + /* do nothing */ >> > + break; >> > + default: >> > + sd_err("unknown return code of do_loglevel_set(): %d", ret); >> > + ret = -1; >> > + break; >> > + } >> >> I think set/get can share the same switch case handling. > > Thanks for your pointing. I'll merge the two switch statements into one in v3. >
On the second thought, these two switches are hard to merge (merging will produce needless complexity). I'll leave them as is. Thanks, Hitoshi -- sheepdog mailing list [email protected] http://lists.wpkg.org/mailman/listinfo/sheepdog
