multipathd: delay reloads during creation
authorBenjamin Marzinski <bmarzins@redhat.com>
Thu, 7 Apr 2016 23:20:04 +0000 (18:20 -0500)
committerChristophe Varoqui <christophe.varoqui@opensvc.com>
Mon, 18 Apr 2016 09:00:26 +0000 (11:00 +0200)
commitb833425029b59106e4e6de26470990ee39d614f5
treee2b1759f5ddc60f108e1bf4b9bfef3b7563a53a0
parent37f9c625cb5ba246a23c89be3a050e1b7ea8180c
multipathd: delay reloads during creation

lvm needs PV devices to not be suspended while the udev rules are
running, for them to be correctly identified as PVs. However, multipathd
will often be in a situation where it will create a multipath device
upon seeing a path, and then immediately reload the device upon seeing
another path.  If multipath is reloading a device while processing the
udev event from its creation, lvm can fail to identify it as a PV. This
can cause systems to fail to boot. Unfortunately, using udev
synchronization cookies to solve this issue would cause a host of other
issues that could only be avoided by a pretty substantial change in how
multipathd does locking and event processing. The good news is that
multipathd is already listening to udev events itself, and can make sure
that it isn't reloading when it shouldn't be.

This patch makes multipathd delay or refuse any reloads that would
happen between the time when it creates a device, and when it receives
the change uevent from the device creation. The only reloads that it
refuses are from the multipathd interactive commands that make no sense
on a not fully started device.  Otherwise, it processes the event or
command, and sets a flag to either mark that device for an update, or
to signal that multipathd needs a reconfigure. When the udev event for
the creation arrives, multipath will reload the device if necessary. If
a reconfigure has been requested, and no devices are currently being
created, multipathd will also do the reconfigure then.

Also this patch adds a configurable timer "missing_uev_wait_timeout"
defaulting to 30 seconds. If the udev creation event has not arrived
after this timeout has triggered, multipathd will print an warning
message, and re-enable device reloads, as if the event had occured.

Users can also manually re-enable device reloads by running

multipathd add map <map_waiting_on_udev>

Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com>
libmultipath/config.c
libmultipath/config.h
libmultipath/configure.c
libmultipath/defaults.h
libmultipath/dict.c
libmultipath/structs.h
multipath.conf.defaults
multipath/multipath.conf.5
multipathd/cli_handlers.c
multipathd/main.c
multipathd/main.h