You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
72 lines
2.3 KiB
72 lines
2.3 KiB
4 years ago
|
---
|
||
|
libmultipath/structs_vec.c | 24 +++++++++++++++++-------
|
||
|
multipathd/main.c | 2 ++
|
||
|
2 files changed, 19 insertions(+), 7 deletions(-)
|
||
|
|
||
|
Index: multipath-tools-130222/libmultipath/structs_vec.c
|
||
|
===================================================================
|
||
|
--- multipath-tools-130222.orig/libmultipath/structs_vec.c
|
||
|
+++ multipath-tools-130222/libmultipath/structs_vec.c
|
||
|
@@ -312,24 +312,33 @@ update_multipath_strings (struct multipa
|
||
|
extern void
|
||
|
set_no_path_retry(struct multipath *mpp)
|
||
|
{
|
||
|
- mpp->retry_tick = 0;
|
||
|
+ char is_queueing = 0;
|
||
|
+
|
||
|
mpp->nr_active = pathcount(mpp, PATH_UP) + pathcount(mpp, PATH_GHOST);
|
||
|
- select_no_path_retry(mpp);
|
||
|
+ if (mpp->features && strstr(mpp->features, "queue_if_no_path"))
|
||
|
+ is_queueing = 1;
|
||
|
|
||
|
switch (mpp->no_path_retry) {
|
||
|
case NO_PATH_RETRY_UNDEF:
|
||
|
break;
|
||
|
case NO_PATH_RETRY_FAIL:
|
||
|
- dm_queue_if_no_path(mpp->alias, 0);
|
||
|
+ if (is_queueing)
|
||
|
+ dm_queue_if_no_path(mpp->alias, 0);
|
||
|
break;
|
||
|
case NO_PATH_RETRY_QUEUE:
|
||
|
- dm_queue_if_no_path(mpp->alias, 1);
|
||
|
+ if (!is_queueing)
|
||
|
+ dm_queue_if_no_path(mpp->alias, 1);
|
||
|
break;
|
||
|
default:
|
||
|
- dm_queue_if_no_path(mpp->alias, 1);
|
||
|
- if (mpp->nr_active == 0) {
|
||
|
+ if (mpp->nr_active > 0) {
|
||
|
+ mpp->retry_tick = 0;
|
||
|
+ if (!is_queueing)
|
||
|
+ dm_queue_if_no_path(mpp->alias, 1);
|
||
|
+ } else if (is_queueing && mpp->retry_tick == 0) {
|
||
|
/* Enter retry mode */
|
||
|
- mpp->retry_tick = mpp->no_path_retry * conf->checkint;
|
||
|
+ 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);
|
||
|
}
|
||
|
@@ -360,6 +369,7 @@ __setup_multipath (struct vectors * vecs
|
||
|
if (reset) {
|
||
|
select_rr_weight(mpp);
|
||
|
select_pgfailback(mpp);
|
||
|
+ select_no_path_retry(mpp);
|
||
|
set_no_path_retry(mpp);
|
||
|
select_pg_timeout(mpp);
|
||
|
select_flush_on_last_del(mpp);
|
||
|
Index: multipath-tools-130222/multipathd/main.c
|
||
|
===================================================================
|
||
|
--- multipath-tools-130222.orig/multipathd/main.c
|
||
|
+++ multipath-tools-130222/multipathd/main.c
|
||
|
@@ -1464,6 +1464,8 @@ check_path (struct vectors * vecs, struc
|
||
|
if (!pp->mpp)
|
||
|
return 0;
|
||
|
|
||
|
+ set_no_path_retry(pp->mpp);
|
||
|
+
|
||
|
if ((newstate == PATH_UP || newstate == PATH_GHOST) &&
|
||
|
pp->io_err_disable_reinstate && need_io_err_check(pp)) {
|
||
|
pp->state = PATH_SHAKY;
|