On Thu, 2024-09-12 at 17:49 -0400, Benjamin Marzinski wrote: > Instead of checking and updating each path, the checkerloop now > starts > the checkers on all the paths in check_paths(), and then goes back > and > updates all the paths in update_paths(). Since the async checkers use > an > absolute time to wait for before returning PATH_PENDING, only one > checker actually needs to be waited for in update_paths(). The rest > will > already have reached their timeout when update_path() is called for > them. > > The check_paths() and update_paths() loop over the pathvec instead of > looping through the multipath device paths to avoid having to restart > checking of the device paths when the multipath device needs to be > resynced while updating the paths. > > Signed-off-by: Benjamin Marzinski <bmarzins@xxxxxxxxxx> > --- > libmultipath/structs.h | 10 +++- > multipathd/main.c | 105 +++++++++++++++++++-------------------- > -- > 2 files changed, 57 insertions(+), 58 deletions(-) > > diff --git a/libmultipath/structs.h b/libmultipath/structs.h > index d8231e95..af8e31e9 100644 > --- a/libmultipath/structs.h > +++ b/libmultipath/structs.h > @@ -314,6 +314,14 @@ enum recheck_wwid_states { > RECHECK_WWID_ON = YNU_YES, > }; > > +enum check_path_states { > + CHECK_PATH_UNCHECKED, > + CHECK_PATH_STARTED, > + CHECK_PATH_CHECKED, > + CHECK_PATH_SKIPPED, > + CHECK_PATH_REMOVED, > +}; > + > struct vpd_vendor_page { > int pg; > const char *name; > @@ -395,7 +403,7 @@ struct path { > int fast_io_fail; > unsigned int dev_loss; > int eh_deadline; > - bool is_checked; > + enum check_path_states is_checked; > bool can_use_env_uid; > unsigned int checker_timeout; > /* configlet pointers */ > diff --git a/multipathd/main.c b/multipathd/main.c > index 45d40559..9519b6c5 100644 > --- a/multipathd/main.c > +++ b/multipathd/main.c > @@ -2389,13 +2389,6 @@ sync_mpp(struct vectors * vecs, struct > multipath *mpp, unsigned int ticks) > do_sync_mpp(vecs, mpp); > } > > -enum check_path_return { > - CHECK_PATH_STARTED, > - CHECK_PATH_CHECKED, > - CHECK_PATH_SKIPPED, > - CHECK_PATH_REMOVED, > -}; > - > static int > update_path_state (struct vectors * vecs, struct path * pp) > { > @@ -2735,6 +2728,7 @@ check_uninitialized_path(struct path * pp, > unsigned int ticks) > conf = get_multipath_config(); > retrigger_tries = conf->retrigger_tries; > pp->tick = conf->max_checkint; > + pp->checkint = conf->checkint; > put_multipath_config(conf); > > if (pp->initialized == INIT_MISSING_UDEV) { > @@ -2778,6 +2772,10 @@ update_uninitialized_path(struct vectors * > vecs, struct path * pp) > int newstate, ret; > struct config *conf; > > + if (pp->initialized != INIT_NEW && pp->initialized != > INIT_FAILED && > + pp->initialized != INIT_MISSING_UDEV) > + return CHECK_PATH_SKIPPED; > + > newstate = get_new_state(pp); > It seems to me that this hunk and the previous one belong into 11/22. Martin