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 <bmarz...@redhat.com>
> ---
>  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

Reply via email to