On Mon, Mar 29, 2021 at 10:39:35PM +0200, mwilck@xxxxxxxx wrote: > From: Martin Wilck <mwilck@xxxxxxxx> > > After b7aae60 ("multipathd: improve "add missing path" handling"), > a path that failed to initialize after multiple udev retriggers > would still be checked in check_path(). However, if a path is up, > has been checked more than once, the failback WWID methods have > been tried, and still there is no usable WWID, we may conclude > that something is fishy and we shouldn't keep trying. > > Without this patch, totally WWID-less devices (seen e.g. on ESXi) > will cause a "add missing path" message in every checker iteration. > > Fixes: b7aae60 ("multipathd: improve "add missing path" handling") > Signed-off-by: Martin Wilck <mwilck@xxxxxxxx> Reviewed-by: Benjamin Marzinski <bmarzins@xxxxxxxxxx> > --- > libmultipath/discovery.c | 16 ++++++++++++++++ > multipathd/main.c | 6 ++++-- > 2 files changed, 20 insertions(+), 2 deletions(-) > > diff --git a/libmultipath/discovery.c b/libmultipath/discovery.c > index f804414..ec99a7a 100644 > --- a/libmultipath/discovery.c > +++ b/libmultipath/discovery.c > @@ -2370,6 +2370,22 @@ int pathinfo(struct path *pp, struct config *conf, int mask) > if (pp->initialized != INIT_FAILED) { > pp->initialized = INIT_MISSING_UDEV; > pp->tick = conf->retrigger_delay; > + } else if (pp->retriggers >= conf->retrigger_tries && > + (pp->state == PATH_UP || pp->state == PATH_GHOST)) { > + /* > + * We have failed to read udev info for this path > + * repeatedly. We used the fallback in get_uid() > + * if there was any, and still got no WWID, > + * although the path is allegedly up. > + * It's likely that this path is not fit for > + * multipath use. > + */ > + char buf[16]; > + > + snprint_path(buf, sizeof(buf), "%T", pp, 0); > + condlog(1, "%s: no WWID in state \"%s\", giving up", > + pp->dev, buf); > + return PATHINFO_SKIPPED; > } > return PATHINFO_OK; > } > diff --git a/multipathd/main.c b/multipathd/main.c > index 3579bad..102946b 100644 > --- a/multipathd/main.c > +++ b/multipathd/main.c > @@ -2218,13 +2218,13 @@ check_path (struct vectors * vecs, struct path * pp, unsigned int ticks) > ev_add_path(pp, vecs, 1); > pp->tick = 1; > } else { > + if (ret == PATHINFO_SKIPPED) > + return -1; > /* > * We failed multiple times to initialize this > * path properly. Don't re-check too often. > */ > pp->checkint = max_checkint; > - if (ret == PATHINFO_SKIPPED) > - return -1; > } > } > return 0; > @@ -2504,6 +2504,8 @@ checkerloop (void *ap) > vector_foreach_slot (vecs->pathvec, pp, i) { > rc = check_path(vecs, pp, ticks); > if (rc < 0) { > + condlog(1, "%s: check_path() failed, removing", > + pp->dev); > vector_del_slot(vecs->pathvec, i); > free_path(pp); > i--; > -- > 2.30.1 -- dm-devel mailing list dm-devel@xxxxxxxxxx https://listman.redhat.com/mailman/listinfo/dm-devel