[dm-devel] [PATCH] multipath: add "count paths" multipathd command
Benjamin Marzinski
bmarzins at redhat.com
Mon May 24 15:13:46 UTC 2010
On Fri, May 21, 2010 at 06:30:04PM +0200, Christophe Varoqui wrote:
> Hi Ben,
>
> Do you mind if I merge this output to the 'show status' command output ?
That's fine with me.
-Ben
>
> ----- 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 <[1]bmarzins at redhat.com>
> > ---
> > 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
> > [2]dm-devel at redhat.com
> > [3]https://www.redhat.com/mailman/listinfo/dm-devel
>
> References
>
> Visible links
> 1. mailto:bmarzins at redhat.com
> 2. mailto:dm-devel at redhat.com
> 3. https://www.redhat.com/mailman/listinfo/dm-devel
More information about the dm-devel
mailing list