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

Benjamin Marzinski bmarzins at redhat.com
Mon May 17 19:04:27 UTC 2010


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




More information about the dm-devel mailing list