1
0
multipath-tools/multipath-tools-add-show-status-cmd

245 lines
6.9 KiB
Plaintext
Raw Normal View History

From 88eb616ae1a673127ef4fd995d703a8b46a63822 Mon Sep 17 00:00:00 2001
From: Christophe Varoqui <christophe.varoqui@free.fr>
Date: Thu, 11 Sep 2008 00:17:37 +0200
Subject: [PATCH] [multipathd] add "show status" cli command
For now just print the number of paths in each path checker state,
if not zero. For example :
path checker states:
up 2
down 1
ghost 1
---
libmultipath/checkers.c | 15 +++++++++++++++
libmultipath/checkers.h | 18 +++++++++++-------
libmultipath/print.c | 24 ++++++++++++++++++++++++
libmultipath/print.h | 1 +
libmultipath/structs.c | 2 +-
multipathd/cli.c | 1 +
multipathd/cli_handlers.c | 30 ++++++++++++++++++++++++++++++
multipathd/cli_handlers.h | 1 +
multipathd/main.c | 4 +++-
9 files changed, 87 insertions(+), 9 deletions(-)
diff --git a/libmultipath/checkers.c b/libmultipath/checkers.c
index 5889ad7..5132081 100644
--- a/libmultipath/checkers.c
+++ b/libmultipath/checkers.c
@@ -8,8 +8,23 @@
#include "vector.h"
#include "config.h"
+char *checker_state_names[] = {
+ "wild",
+ "unchecked",
+ "down",
+ "up",
+ "shaky",
+ "ghost",
+ "pending"
+};
+
static LIST_HEAD(checkers);
+char * checker_state_name (int i)
+{
+ return checker_state_names[i];
+}
+
int init_checkers (void)
{
INIT_LIST_HEAD(&checkers);
diff --git a/libmultipath/checkers.h b/libmultipath/checkers.h
index a65aaf9..e735250 100644
--- a/libmultipath/checkers.h
+++ b/libmultipath/checkers.h
@@ -47,13 +47,16 @@
* - Use: All async checkers
* - Description: Indicates a check IO is in flight.
*/
-#define PATH_WILD -1
-#define PATH_UNCHECKED 0
-#define PATH_DOWN 1
-#define PATH_UP 2
-#define PATH_SHAKY 3
-#define PATH_GHOST 4
-#define PATH_PENDING 5
+enum path_check_state {
+ PATH_WILD,
+ PATH_UNCHECKED,
+ PATH_DOWN,
+ PATH_UP,
+ PATH_SHAKY,
+ PATH_GHOST,
+ PATH_PENDING,
+ PATH_MAX_STATE
+};
#define DIRECTIO "directio"
#define TUR "tur"
@@ -106,6 +109,7 @@ struct checker {
#define MSG(c, fmt, args...) snprintf((c)->message, CHECKER_MSG_LEN, fmt, ##args);
+char * checker_state_name (int);
int init_checkers (void);
struct checker * add_checker (char *);
struct checker * checker_lookup (char *);
diff --git a/libmultipath/print.c b/libmultipath/print.c
index 08ebd51..459b973 100644
--- a/libmultipath/print.c
+++ b/libmultipath/print.c
@@ -1133,6 +1133,30 @@ snprint_blacklist_except (char * buff, int len)
}
extern int
+snprint_status (char * buff, int len, struct vectors *vecs)
+{
+ int fwd = 0;
+ int i;
+ unsigned int count[PATH_MAX_STATE] = {0};
+ struct path * pp;
+
+ vector_foreach_slot (vecs->pathvec, pp, i) {
+ count[pp->state]++;
+ }
+ fwd += snprintf(buff + fwd, len - fwd, "path checker states:\n");
+ for (i=0; i<PATH_MAX_STATE; i++) {
+ if (!count[i])
+ continue;
+ fwd += snprintf(buff + fwd, len - fwd, "%-20s%u\n",
+ checker_state_name(i), count[i]);
+ }
+
+ if (fwd > len)
+ return len;
+ return fwd;
+}
+
+extern int
snprint_devices (char * buff, int len, struct vectors *vecs)
{
DIR *blkdir;
diff --git a/libmultipath/print.h b/libmultipath/print.h
index 5c7023c..1718c94 100644
--- a/libmultipath/print.h
+++ b/libmultipath/print.h
@@ -44,6 +44,7 @@ int snprint_defaults (char *, int);
int snprint_blacklist (char *, int);
int snprint_blacklist_except (char *, int);
int snprint_blacklist_report (char *, int);
+int snprint_status (char *, int, struct vectors *);
int snprint_devices (char *, int, struct vectors *);
int snprint_hwtable (char *, int, vector);
int snprint_mptable (char *, int, vector);
diff --git a/libmultipath/structs.c b/libmultipath/structs.c
index 50f66f4..bb0d9f7 100644
--- a/libmultipath/structs.c
+++ b/libmultipath/structs.c
@@ -349,7 +349,7 @@ pathcountgr (struct pathgroup * pgp, int state)
int i;
vector_foreach_slot (pgp->paths, pp, i)
- if ((pp->state == state) || (state < 0))
+ if ((pp->state == state) || (state == PATH_WILD))
count++;
return count;
diff --git a/multipathd/cli.c b/multipathd/cli.c
index 7eaac73..051624a 100644
--- a/multipathd/cli.c
+++ b/multipathd/cli.c
@@ -406,6 +406,7 @@ cli_init (void) {
add_handler(LIST+PATHS, NULL);
add_handler(LIST+PATHS+FMT, NULL);
+ add_handler(LIST+STATUS, NULL);
add_handler(LIST+MAPS, NULL);
add_handler(LIST+MAPS+STATUS, NULL);
add_handler(LIST+MAPS+STATS, NULL);
diff --git a/multipathd/cli_handlers.c b/multipathd/cli_handlers.c
index c84805a..415f865 100644
--- a/multipathd/cli_handlers.c
+++ b/multipathd/cli_handlers.c
@@ -224,6 +224,26 @@ cli_list_maps_topology (void * v, char ** reply, int * len, void * data)
}
int
+show_status (char ** r, int *len, struct vectors * vecs)
+{
+ char * c;
+ char * reply;
+
+ unsigned int maxlen = INITIAL_REPLY_LEN;
+ reply = MALLOC(maxlen);
+
+ if (!reply)
+ return 1;
+
+ c = reply;
+ c += snprint_status(c, reply + maxlen - c, vecs);
+
+ *r = reply;
+ *len = (int)(c - reply + 1);
+ return 0;
+}
+
+int
show_maps (char ** r, int *len, struct vectors * vecs, char * style)
{
int i;
@@ -270,6 +290,16 @@ cli_list_maps (void * v, char ** reply, int * len, void * data)
}
int
+cli_list_status (void * v, char ** reply, int * len, void * data)
+{
+ struct vectors * vecs = (struct vectors *)data;
+
+ condlog(3, "list status (operator)");
+
+ return show_status(reply, len, vecs);
+}
+
+int
cli_list_maps_status (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 a688481..cfc4b12 100644
--- a/multipathd/cli_handlers.h
+++ b/multipathd/cli_handlers.h
@@ -1,5 +1,6 @@
int cli_list_paths (void * v, char ** reply, int * len, void * data);
int cli_list_paths_fmt (void * v, char ** reply, int * len, void * data);
+int cli_list_status (void * v, char ** reply, int * len, void * data);
int cli_list_maps (void * v, char ** reply, int * len, void * data);
int cli_list_maps_status (void * v, char ** reply, int * len, void * data);
int cli_list_maps_stats (void * v, char ** reply, int * len, void * data);
diff --git a/multipathd/main.c b/multipathd/main.c
index 8d74cb9..e57a3e4 100644
--- a/multipathd/main.c
+++ b/multipathd/main.c
@@ -159,7 +159,8 @@ sync_map_state(struct multipath *mpp)
vector_foreach_slot (mpp->pg, pgp, i){
vector_foreach_slot (pgp->paths, pp, j){
- if (pp->state <= PATH_UNCHECKED)
+ if (pp->state == PATH_UNCHECKED ||
+ pp->state == PATH_WILD)
continue;
if ((pp->dmstate == PSTATE_FAILED ||
pp->dmstate == PSTATE_UNDEF) &&
@@ -693,6 +694,7 @@ uxlsnrloop (void * ap)
set_handler_callback(LIST+PATHS, cli_list_paths);
set_handler_callback(LIST+PATHS+FMT, cli_list_paths_fmt);
set_handler_callback(LIST+MAPS, cli_list_maps);
+ set_handler_callback(LIST+STATUS, cli_list_status);
set_handler_callback(LIST+MAPS+STATUS, cli_list_maps_status);
set_handler_callback(LIST+MAPS+STATS, cli_list_maps_stats);
set_handler_callback(LIST+MAPS+TOPOLOGY, cli_list_maps_topology);
--
1.5.2.4