[dm-devel] [PATCH] multipath: add "count paths" multipathd command

Christophe Varoqui christophe.varoqui at gmail.com
Fri May 21 16:30:04 UTC 2010


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 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
> dm-devel at redhat.com
> https://www.redhat.com/mailman/listinfo/dm-devel

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://listman.redhat.com/archives/dm-devel/attachments/20100521/39aeb281/attachment.htm>


More information about the dm-devel mailing list