summaryrefslogtreecommitdiffstats
path: root/0167-RHBZ-1335176-fix-show-cmds.patch
blob: 55154b69837072e5d77410acf552857594de2b1b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
---
 libmultipath/print.c       |    7 +++++++
 libmultipath/structs.h     |    1 +
 libmultipath/structs_vec.c |   24 ++++++++++++++----------
 multipathd/cli_handlers.c  |   11 ++++++++++-
 multipathd/main.c          |    2 ++
 5 files changed, 34 insertions(+), 11 deletions(-)

Index: multipath-tools-130222/libmultipath/print.c
===================================================================
--- multipath-tools-130222.orig/libmultipath/print.c
+++ multipath-tools-130222/libmultipath/print.c
@@ -248,6 +248,12 @@ snprint_q_timeouts (char * buff, size_t
 }
 
 static int
+snprint_map_failures (char * buff, size_t len, struct multipath * mpp)
+{
+	return snprint_uint(buff, len, mpp->stat_map_failures);
+}
+
+static int
 snprint_multipath_uuid (char * buff, size_t len, struct multipath * mpp)
 {
 	return snprint_str(buff, len, mpp->wwid);
@@ -546,6 +552,7 @@ struct multipath_data mpd[] = {
 	{'t', "dm-st",         0, snprint_dm_map_state},
 	{'S', "size",          0, snprint_multipath_size},
 	{'f', "features",      0, snprint_features},
+	{'x', "failures",      0, snprint_map_failures},
 	{'h', "hwhandler",     0, snprint_hwhandler},
 	{'A', "action",        0, snprint_action},
 	{'0', "path_faults",   0, snprint_path_faults},
Index: multipath-tools-130222/libmultipath/structs.h
===================================================================
--- multipath-tools-130222.orig/libmultipath/structs.h
+++ multipath-tools-130222/libmultipath/structs.h
@@ -270,6 +270,7 @@ struct multipath {
 	unsigned int stat_map_loads;
 	unsigned int stat_total_queueing_time;
 	unsigned int stat_queueing_timeouts;
+	unsigned int stat_map_failures;
 
 	/* checkers shared data */
 	void * mpcontext;
Index: multipath-tools-130222/libmultipath/structs_vec.c
===================================================================
--- multipath-tools-130222.orig/libmultipath/structs_vec.c
+++ multipath-tools-130222/libmultipath/structs_vec.c
@@ -579,16 +579,20 @@ int update_multipath (struct vectors *ve
  */
 void update_queue_mode_del_path(struct multipath *mpp)
 {
-	if (--mpp->nr_active == 0 && mpp->no_path_retry > 0) {
-		/*
-		 * Enter retry mode.
-		 * meaning of +1: retry_tick may be decremented in
-		 *                checkerloop before starting retry.
-		 */
-		mpp->stat_queueing_timeouts++;
-		mpp->retry_tick = mpp->no_path_retry * conf->checkint + 1;
-		condlog(1, "%s: Entering recovery mode: max_retries=%d",
-			mpp->alias, mpp->no_path_retry);
+	if (--mpp->nr_active == 0) {
+		if (mpp->no_path_retry > 0) {
+			/*
+			 * Enter retry mode.
+			 * meaning of +1: retry_tick may be decremented in
+			 *                checkerloop before starting retry.
+			 */
+			mpp->stat_queueing_timeouts++;
+			mpp->retry_tick = mpp->no_path_retry *
+					  conf->checkint + 1;
+			condlog(1, "%s: Entering recovery mode: max_retries=%d",
+				mpp->alias, mpp->no_path_retry);
+		} else if (mpp->no_path_retry != NO_PATH_RETRY_QUEUE)
+			mpp->stat_map_failures++;
 	}
 	condlog(2, "%s: remaining active paths: %d", mpp->alias, mpp->nr_active);
 }
Index: multipath-tools-130222/multipathd/cli_handlers.c
===================================================================
--- multipath-tools-130222.orig/multipathd/cli_handlers.c
+++ multipath-tools-130222/multipathd/cli_handlers.c
@@ -319,9 +319,14 @@ show_maps (char ** r, int *len, struct v
 			c += snprint_multipath_header(c, reply + maxlen - c,
 						      style);
 
-		vector_foreach_slot(vecs->mpvec, mpp, i)
+		vector_foreach_slot(vecs->mpvec, mpp, i) {
+			if (update_multipath(vecs, mpp->alias, 0)) {
+				i--;
+				continue;
+			}
 			c += snprint_multipath(c, reply + maxlen - c,
 					       style, mpp, pretty);
+		}
 
 		again = ((c - reply) == (maxlen - 1));
 
@@ -742,6 +747,8 @@ cli_disable_queueing(void *v, char **rep
 		return 1;
 	}
 
+	if (mpp->nr_active == 0)
+		mpp->stat_map_failures++;
 	mpp->retry_tick = 0;
 	dm_queue_if_no_path(mpp->alias, 0);
 	return 0;
@@ -756,6 +763,8 @@ cli_disable_all_queueing(void *v, char *
 
 	condlog(2, "disable queueing (operator)");
 	vector_foreach_slot(vecs->mpvec, mpp, i) {
+		if (mpp->nr_active == 0)
+			mpp->stat_map_failures++;
 		mpp->retry_tick = 0;
 		dm_queue_if_no_path(mpp->alias, 0);
 	}
Index: multipath-tools-130222/multipathd/main.c
===================================================================
--- multipath-tools-130222.orig/multipathd/main.c
+++ multipath-tools-130222/multipathd/main.c
@@ -716,6 +716,7 @@ ev_remove_path (struct path *pp, struct
 				mpp->retry_tick = 0;
 				mpp->no_path_retry = NO_PATH_RETRY_FAIL;
 				mpp->flush_on_last_del = FLUSH_IN_PROGRESS;
+				mpp->stat_map_failures++;
 				dm_queue_if_no_path(mpp->alias, 0);
 			}
 			if (!flush_map(mpp, vecs, 1)) {
@@ -1184,6 +1185,7 @@ retry_count_tick(vector mpvec)
 			mpp->stat_total_queueing_time++;
 			condlog(4, "%s: Retrying.. No active path", mpp->alias);
 			if(--mpp->retry_tick == 0) {
+				mpp->stat_map_failures++;
 				dm_queue_if_no_path(mpp->alias, 0);
 				condlog(2, "%s: Disable queueing", mpp->alias);
 			}