summaryrefslogtreecommitdiff
path: root/multipathd
diff options
context:
space:
mode:
authorBenjamin Marzinski <bmarzins@redhat.com>2010-05-17 14:04:27 -0500
committerChristophe Varoqui <christophe.varoqui@opensvc.com>2010-05-20 06:49:38 +0200
commit69cb2d84466042ae5021740c04703c2cb92f6c1b (patch)
treee2ac0b2e79b6ef7ac54aaca2a092d5fc4fcf0046 /multipathd
parent8d63b33d0996e141a2451df552b062b908db15bc (diff)
downloadmultipath-tools-69cb2d84466042ae5021740c04703c2cb92f6c1b.tar.gz
multipath-tools-69cb2d84466042ae5021740c04703c2cb92f6c1b.tar.bz2
multipath-tools-69cb2d84466042ae5021740c04703c2cb92f6c1b.zip
multipath: add "count paths" multipathd command
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@redhat.com>
Diffstat (limited to 'multipathd')
-rw-r--r--multipathd/cli.c2
-rw-r--r--multipathd/cli.h2
-rw-r--r--multipathd/cli_handlers.c33
-rw-r--r--multipathd/cli_handlers.h1
-rw-r--r--multipathd/main.c1
-rw-r--r--multipathd/multipathd.84
6 files changed, 43 insertions, 0 deletions
diff --git a/multipathd/cli.c b/multipathd/cli.c
index 208a0ad..741e3d6 100644
--- a/multipathd/cli.c
+++ b/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;
diff --git a/multipathd/cli.h b/multipathd/cli.h
index f22d459..05de4e3 100644
--- a/multipathd/cli.h
+++ b/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)
diff --git a/multipathd/cli_handlers.c b/multipathd/cli_handlers.c
index 71a73ff..0542fde 100644
--- a/multipathd/cli_handlers.c
+++ b/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 * len, void * data)
}
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;
diff --git a/multipathd/cli_handlers.h b/multipathd/cli_handlers.h
index b3ad377..71009b7 100644
--- a/multipathd/cli_handlers.h
+++ b/multipathd/cli_handlers.h
@@ -25,5 +25,6 @@ int cli_restore_all_queueing(void * v, char ** reply, int * len, void * data);
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);
diff --git a/multipathd/main.c b/multipathd/main.c
index c247c43..d2c2cc3 100644
--- a/multipathd/main.c
+++ b/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);
diff --git a/multipathd/multipathd.8 b/multipathd/multipathd.8
index a2d71d8..5ab7330 100644
--- a/multipathd/multipathd.8
+++ b/multipathd/multipathd.8
@@ -69,6 +69,10 @@ Add a path to the list of monitored paths. $path is as listed in /sys/block (e.g
.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