On Sat, Dec 07, 2024 at 12:36:04AM +0100, Martin Wilck wrote: > This patch set goes on top of Ben's set [1] for github issue 105 [2]. > > The first patch implements the remark I had on patch 2 on Ben's set. > > Patch 2-4 add map reload logic for the case when update_pathvec_from_dm() > detects an inconsistency: in this case, the map is now reloaded before > the checkers are actually started. If the inconsistency can't be cleared, > another attempt will be made when the checkers have finished. > > Patch 5 ff. reshuffle the code in checkerloop(). There is now one function, > checker_finished(), that takes all actions that need to be done with the vecs > lock taken after the checkers have finished. checkerloop() enters this > function immediately when the checkers have finished, without dropping and > re-acquiring the vecs lock. The map reload logic is completely handled in this > function. > > The various _tick() functions don't loop over mpvec any more; they are now > just called for a single mpp, and they simply return true if a map reload is > required. The actual reload action differs: if missing_uev_wait_tick() > requests a reload, it needs to be a full update_map() (which calls > adopt_paths()), whereas in the other cases, reload_and_sync_map() is sufficient. > The last patch changes the reload action for the ghost delay tick. > > Reviews & comments welcome. For all the patches I haven't commented on: Reviewed-by: Benjamin Marzinski <bmarzins@xxxxxxxxxx> > > Regards > Martin > > [1] https://lore.kernel.org/dm-devel/20241205035638.1218953-1-bmarzins@xxxxxxxxxx/ > [2] https://github.com/opensvc/multipath-tools/issues/105 > > Martin Wilck (13): > multipathd: don't reload map in update_mpp_prio() > multipathd: remove dm_get_info() call from refresh_multipath() > multipathd: allow map removal in do_sync_mpp() > multipathd: reload maps in do_sync_mpp() if necessary > multipathd: move yielding for waiters to start of checkerloop > multipathd: add checker_finished() > multipathd: move "tick" calls into checker_finished() > multipathd: remove mpvec_garbage_collector() > multipathd: don't call reload_and_sync_map() from > deferred_failback_tick() > multipathd: move retry_count_tick() into existing mpvec loop > multipathd: don't call update_map() from missing_uev_wait_tick() > multipathd: don't call udpate_map() from ghost_delay_tick() > multipathd: only call reload_and_sync_map() when ghost delay expires > > multipathd/main.c | 295 +++++++++++++++++++--------------------------- > 1 file changed, 120 insertions(+), 175 deletions(-) > > -- > 2.47.0