Hi Ben,
Do you mind if I merge this output to the 'show status' command output ?
----- Message d'origine -----
> This adds a new multipathd command, "count paths". which returns information in
> the format
>
> Paths: <nr_of_paths>
> Busy: <True|False>
>
> where "Paths" is the number of monitored paths, and "Busy" is set when
> multipathd is currently handling uevents. With this, it is possible to quickly
> get the number of paths being monitored, as well as an idea if more paths may
> be showing up shortly.
>
> Signed-off-by: Benjamin Marzinski <bmarzins@xxxxxxxxxx>
> ---
> libmultipath/uevent.c | 8 ++++++++
> libmultipath/uevent.h | 1 +
> multipathd/cli.c | 2 ++
> multipathd/cli.h | 2 ++
> multipathd/cli_handlers.c | 33 +++++++++++++++++++++++++++++++++
> multipathd/cli_handlers.h | 1 +
> multipathd/main.c | 1 +
> multipathd/multipathd.8 | 4 ++++
> 8 files changed, 52 insertions(+)
>
> Index: multipath-tools-100510/libmultipath/uevent.c
> ===================================================================
> --- multipath-tools-100510.orig/libmultipath/uevent.c
> +++ multipath-tools-100510/libmultipath/uevent.c
> @@ -52,6 +52,12 @@ pthread_mutex_t uevc_lock, *uevc_lockp =
> pthread_cond_t uev_cond, *uev_condp = &uev_cond;
> uev_trigger *my_uev_trigger;
> void * my_trigger_data;
> +int servicing_uev;
> +
> +int is_uevent_busy(void)
> +{
> + return (uevqhp != NULL || servicing_uev);
> +}
>
> static struct uevent * alloc_uevent (void)
> {
> @@ -96,7 +102,9 @@ uevq_thread(void * et)
>
> while (1) {
> pthread_mutex_lock(uevc_lockp);
> + servicing_uev = 0;
> pthread_cond_wait(uev_condp, uevc_lockp);
> + servicing_uev = 1;
> pthread_mutex_unlock(uevc_lockp);
>
> service_uevq();
> Index: multipath-tools-100510/libmultipath/uevent.h
> ===================================================================
> --- multipath-tools-100510.orig/libmultipath/uevent.h
> +++ multipath-tools-100510/libmultipath/uevent.h
> @@ -17,3 +17,4 @@ struct uevent {
>
> int uevent_listen(int (*store_uev)(struct uevent *, void * trigger_data),
> void * trigger_data);
> +int is_uevent_busy(void);
> Index: multipath-tools-100510/multipathd/cli.c
> ===================================================================
> --- multipath-tools-100510.orig/multipathd/cli.c
> +++ multipath-tools-100510/multipathd/cli.c
> @@ -174,6 +174,7 @@ load_keys (void)
> r += add_key(keys, "devices", DEVICES, 0);
> r += add_key(keys, "format", FMT, 1);
> r += add_key(keys, "wildcards", WILDCARDS, 0);
> + r += add_key(keys, "count", COUNT, 0);
> r += add_key(keys, "quit", QUIT, 0);
> r += add_key(keys, "exit", QUIT, 0);
>
> @@ -443,6 +444,7 @@ cli_init (void) {
> add_handler(RESTOREQ+MAPS, NULL);
> add_handler(REINSTATE+PATH, NULL);
> add_handler(FAIL+PATH, NULL);
> + add_handler(COUNT+PATHS, NULL);
> add_handler(QUIT, NULL);
>
> return 0;
> Index: multipath-tools-100510/multipathd/cli_handlers.h
> ===================================================================
> --- multipath-tools-100510.orig/multipathd/cli_handlers.h
> +++ multipath-tools-100510/multipathd/cli_handlers.h
> @@ -25,5 +25,6 @@ int cli_restore_all_queueing(void * v, c
> int cli_suspend(void * v, char ** reply, int * len, void * data);
> int cli_resume(void * v, char ** reply, int * len, void * data);
> int cli_reinstate(void * v, char ** reply, int * len, void * data);
> +int cli_count_paths(void * v, char ** reply, int * len, void * data);
> int cli_fail(void * v, char ** reply, int * len, void * data);
> int cli_quit(void * v, char ** reply, int * len, void * data);
> Index: multipath-tools-100510/multipathd/main.c
> ===================================================================
> --- multipath-tools-100510.orig/multipathd/main.c
> +++ multipath-tools-100510/multipathd/main.c
> @@ -783,6 +783,7 @@ uxlsnrloop (void * ap)
> set_handler_callback(RESTOREQ+MAP, cli_restore_queueing);
> set_handler_callback(DISABLEQ+MAPS, cli_disable_all_queueing);
> set_handler_callback(RESTOREQ+MAPS, cli_restore_all_queueing);
> + set_handler_callback(COUNT+PATHS, cli_count_paths);
> set_handler_callback(QUIT, cli_quit);
>
> umask(077);
> Index: multipath-tools-100510/multipathd/cli.h
> ===================================================================
> --- multipath-tools-100510.orig/multipathd/cli.h
> +++ multipath-tools-100510/multipathd/cli.h
> @@ -23,6 +23,7 @@ enum {
> __BLACKLIST,
> __DEVICES,
> __FMT,
> + __COUNT,
> __WILDCARDS,
> __QUIT,
> };
> @@ -51,6 +52,7 @@ enum {
> #define BLACKLIST (1 << __BLACKLIST)
> #define DEVICES (1 << __DEVICES)
> #define FMT (1 << __FMT)
> +#define COUNT (1 << __COUNT)
> #define WILDCARDS (1 << __WILDCARDS)
> #define QUIT (1 << __QUIT)
>
> Index: multipath-tools-100510/multipathd/cli_handlers.c
> ===================================================================
> --- multipath-tools-100510.orig/multipathd/cli_handlers.c
> +++ multipath-tools-100510/multipathd/cli_handlers.c
> @@ -18,6 +18,29 @@
>
> #include "main.h"
> #include "cli.h"
> +#include "uevent.h"
> +
> +int
> +count_paths(char **r, int *l, struct vectors *vecs)
> +{
> + int i, len;
> + struct path *pp;
> + char * reply;
> + unsigned int maxlen = INITIAL_REPLY_LEN;
> + int monitored_count = 0;
> +
> + reply = MALLOC(maxlen);
> + if (!reply)
> + return 1;
> + vector_foreach_slot(vecs->pathvec, pp, i)
> + if (pp->fd != -1)
> + monitored_count++;
> + len = sprintf(reply, "Paths: %d\nBusy: %s\n", monitored_count,
> + is_uevent_busy()? "True" : "False");
> + *r = reply;
> + *l = len + 1;
> + return 0;
> +}
>
> int
> show_paths (char ** r, int * len, struct vectors * vecs, char * style)
> @@ -176,6 +199,16 @@ cli_list_config (void * v, char ** reply
> }
>
> int
> +cli_count_paths (void * v, char ** reply, int * len, void * data)
> +{
> + struct vectors * vecs = (struct vectors *)data;
> +
> + condlog(3, "count paths (operator)");
> +
> + return count_paths(reply, len, vecs);
> +}
> +
> +int
> cli_list_paths (void * v, char ** reply, int * len, void * data)
> {
> struct vectors * vecs = (struct vectors *)data;
> Index: multipath-tools-100510/multipathd/multipathd.8
> ===================================================================
> --- multipath-tools-100510.orig/multipathd/multipathd.8
> +++ multipath-tools-100510/multipathd/multipathd.8
> @@ -69,6 +69,10 @@ Add a path to the list of monitored path
> .B remove|del path $path
> Stop monitoring a path. $path is as listed in /sys/block (e.g. sda).
> .TP
> +.B count paths
> +Show the number of monitored paths, and whether multipathd is currently
> +handling a uevent.
> +.TP
> .B add map $map
> Add a multipath device to the list of monitored devices. $map can either be a
> device-mapper device as listed in /sys/block (e.g. dm-0) or it can be the alias
> for the multipath device (e.g. mpath1) or the uid of the multipath device (e.g.
> 36005076303ffc56200000000000010aa). .TP
>
> --
> dm-devel mailing list
> dm-devel@xxxxxxxxxx
> https://www.redhat.com/mailman/listinfo/dm-devel
-- dm-devel mailing list dm-devel@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/dm-devel