From d43ffc1112c0385737f88bab1c884e4ff4c316f5 Mon Sep 17 00:00:00 2001 From: Benjamin Marzinski Date: Wed, 31 Jul 2019 18:11:41 -0500 Subject: [PATCH] multipathd: use marginal_pathgroups This commit makes the marginal_pathgroups option work with the existing methods for determining marginal paths. It also merges the code for the marginal_path and sand_path_err methods. This has the side effect of making the marginal_path code set a marginal path's state to "delayed" instead of "shaky" like it previously did. Signed-off-by: Benjamin Marzinski --- multipathd/main.c | 53 +++++++++++++++++++++++++++++++++-------------- 1 file changed, 38 insertions(+), 15 deletions(-) diff --git a/multipathd/main.c b/multipathd/main.c index dca2214c..04b2b56a 100644 --- a/multipathd/main.c +++ b/multipathd/main.c @@ -1960,6 +1960,18 @@ reinstate_path: return 0; } +static int +should_skip_path(struct path *pp){ + if (marginal_path_check_enabled(pp->mpp)) { + if (pp->io_err_disable_reinstate && need_io_err_check(pp)) + return 1; + } else if (san_path_check_enabled(pp->mpp)) { + if (check_path_reinstate_state(pp)) + return 1; + } + return 0; +} + /* * Returns '1' if the path has been checked, '-1' if it was blacklisted * and '0' otherwise @@ -1975,6 +1987,7 @@ check_path (struct vectors * vecs, struct path * pp, int ticks) int oldchkrstate = pp->chkrstate; int retrigger_tries, checkint, max_checkint, verbosity; struct config *conf; + int marginal_pathgroups, marginal_changed = 0; int ret; if ((pp->initialized == INIT_OK || @@ -1991,6 +2004,7 @@ check_path (struct vectors * vecs, struct path * pp, int ticks) checkint = conf->checkint; max_checkint = conf->max_checkint; verbosity = conf->verbosity; + marginal_pathgroups = conf->marginal_pathgroups; put_multipath_config(conf); if (pp->checkint == CHECKINT_UNDEF) { @@ -2106,20 +2120,27 @@ check_path (struct vectors * vecs, struct path * pp, int ticks) set_no_path_retry(pp->mpp); if ((newstate == PATH_UP || newstate == PATH_GHOST) && - check_path_reinstate_state(pp)) { - pp->state = PATH_DELAYED; - return 1; - } - - if ((newstate == PATH_UP || newstate == PATH_GHOST) && - pp->io_err_disable_reinstate && need_io_err_check(pp)) { - pp->state = PATH_SHAKY; - /* - * to reschedule as soon as possible,so that this path can - * be recoverd in time - */ - pp->tick = 1; - return 1; + (san_path_check_enabled(pp->mpp) || + marginal_path_check_enabled(pp->mpp))) { + int was_marginal = pp->marginal; + if (should_skip_path(pp)) { + if (!marginal_pathgroups) { + if (marginal_path_check_enabled(pp->mpp)) + /* to reschedule as soon as possible, + * so that this path can be recovered + * in time */ + pp->tick = 1; + pp->state = PATH_DELAYED; + return 1; + } + if (!was_marginal) { + pp->marginal = 1; + marginal_changed = 1; + } + } else if (marginal_pathgroups && was_marginal) { + pp->marginal = 0; + marginal_changed = 1; + } } /* @@ -2258,7 +2279,9 @@ check_path (struct vectors * vecs, struct path * pp, int ticks) */ condlog(4, "path prio refresh"); - if (update_prio(pp, new_path_up) && + if (marginal_changed) + update_path_groups(pp->mpp, vecs, 1); + else if (update_prio(pp, new_path_up) && (pp->mpp->pgpolicyfn == (pgpolicyfn *)group_by_prio) && pp->mpp->pgfailback == -FAILBACK_IMMEDIATE) update_path_groups(pp->mpp, vecs, !new_path_up); -- 2.17.2