From 5ea667e03acfb6ab03010b756ad45e9b678a67d0 Mon Sep 17 00:00:00 2001 From: Ben Ford Date: Tue, 24 Sep 2019 09:40:35 -0500 Subject: [PATCH] taskprocessor.c: Add CLI commands to reset taskprocessor stats. Added two new CLI commands to reset stats for taskprocessors. You can reset stats for a single, specific taskprocessor ('core reset taskprocessor '), or you can reset all taskprocessors ('core reset taskprocessors'). These commands will reset the counter for the number of tasks processed as well as the max queue size. Change-Id: Iaf17fc4ae29396ab0c6ac92408fc7bdc2f12362d --- .../taskprocessor-reset-stats.txt | 7 ++ main/taskprocessor.c | 78 +++++++++++++++++++ 2 files changed, 85 insertions(+) create mode 100644 doc/CHANGES-staging/taskprocessor-reset-stats.txt diff --git a/doc/CHANGES-staging/taskprocessor-reset-stats.txt b/doc/CHANGES-staging/taskprocessor-reset-stats.txt new file mode 100644 index 0000000000..b5ebb86917 --- /dev/null +++ b/doc/CHANGES-staging/taskprocessor-reset-stats.txt @@ -0,0 +1,7 @@ +Subject: taskprocessor.c + +Added two new CLI commands to reset stats for taskprocessors. You can +reset stats for a single, specific taskprocessor ('core reset +taskprocessor '), or you can reset all taskprocessors +('core reset taskprocessors'). These commands will reset the counter for +the number of tasks processed as well as the max queue size. diff --git a/main/taskprocessor.c b/main/taskprocessor.c index df60236ecd..39372dc71f 100644 --- a/main/taskprocessor.c +++ b/main/taskprocessor.c @@ -153,11 +153,15 @@ static int tps_ping_handler(void *datap); static char *cli_tps_ping(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a); static char *cli_tps_report(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a); static char *cli_subsystem_alert_report(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a); +static char *cli_tps_reset_stats(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a); +static char *cli_tps_reset_stats_all(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a); static struct ast_cli_entry taskprocessor_clis[] = { AST_CLI_DEFINE(cli_tps_ping, "Ping a named task processor"), AST_CLI_DEFINE(cli_tps_report, "List instantiated task processors and statistics"), AST_CLI_DEFINE(cli_subsystem_alert_report, "List task processor subsystems in alert"), + AST_CLI_DEFINE(cli_tps_reset_stats, "Reset a named task processor's stats"), + AST_CLI_DEFINE(cli_tps_reset_stats_all, "Reset all task processors' stats"), }; struct default_taskprocessor_listener_pvt { @@ -1254,3 +1258,77 @@ void ast_taskprocessor_build_name(char *buf, unsigned int size, const char *form /* Append sequence number to end of user name. */ snprintf(buf + user_size, SEQ_STR_SIZE, "-%08x", ast_taskprocessor_seq_num()); } + +static void tps_reset_stats(struct ast_taskprocessor *tps) +{ + ao2_lock(tps); + tps->stats._tasks_processed_count = 0; + tps->stats.max_qsize = 0; + ao2_unlock(tps); +} + +static char *cli_tps_reset_stats(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a) +{ + const char *name; + struct ast_taskprocessor *tps; + + switch (cmd) { + case CLI_INIT: + e->command = "core reset taskprocessor"; + e->usage = + "Usage: core reset taskprocessor \n" + " Resets stats for the specified taskprocessor\n"; + return NULL; + case CLI_GENERATE: + return tps_taskprocessor_tab_complete(a); + } + + if (a->argc != 4) { + return CLI_SHOWUSAGE; + } + + name = a->argv[3]; + if (!(tps = ast_taskprocessor_get(name, TPS_REF_IF_EXISTS))) { + ast_cli(a->fd, "\nReset failed: %s not found\n\n", name); + return CLI_SUCCESS; + } + ast_cli(a->fd, "\nResetting %s\n\n", name); + + tps_reset_stats(tps); + + ast_taskprocessor_unreference(tps); + + return CLI_SUCCESS; +} + +static char *cli_tps_reset_stats_all(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a) +{ + struct ast_taskprocessor *tps; + struct ao2_iterator iter; + + switch (cmd) { + case CLI_INIT: + e->command = "core reset taskprocessors"; + e->usage = + "Usage: core reset taskprocessors\n" + " Resets stats for all taskprocessors\n"; + return NULL; + case CLI_GENERATE: + return NULL; + } + + if (a->argc != e->args) { + return CLI_SHOWUSAGE; + } + + ast_cli(a->fd, "\nResetting stats for all taskprocessors\n\n"); + + iter = ao2_iterator_init(tps_singletons, 0); + while ((tps = ao2_iterator_next(&iter))) { + tps_reset_stats(tps); + ast_taskprocessor_unreference(tps); + } + ao2_iterator_destroy(&iter); + + return CLI_SUCCESS; +}