Message ID | 20180404161627.6244-20-mwilck@suse.com (mailing list archive) |
---|---|
State | Not Applicable, archived |
Delegated to: | christophe varoqui |
Headers | show |
On Wed, Apr 04, 2018 at 06:16:26PM +0200, Martin Wilck wrote: > This activates "smart" path detection. This is similar to > "find_multipaths yes", but doesn't generally ignore single paths > that are not listed in the WWIDs file. Rather, such paths are > temporarily treated like multipath members. If no additional paths > are detected after a certain time, the paths are re-added to the > system as non-multipath. This needs support by the udev rules, to > be added in a follow-up patch. > > If a multipath map is successfully successfully created, and paths are > in waiting state, trigger path uevents to update their status. > > Signed-off-by: Martin Wilck <mwilck@suse.com> > --- > libmultipath/configure.c | 15 ++++++++++++--- > libmultipath/dict.c | 1 + > multipath/multipath.conf.5 | 13 +++++++++++++ > 3 files changed, 26 insertions(+), 3 deletions(-) > > diff --git a/libmultipath/configure.c b/libmultipath/configure.c > index 9aa3d21..17c2fa1 100644 > --- a/libmultipath/configure.c > +++ b/libmultipath/configure.c > @@ -12,6 +12,7 @@ > #include <string.h> > #include <sys/file.h> > #include <errno.h> > +#include <ctype.h> > #include <libdevmapper.h> > #include <libudev.h> > #include "mpath_cmd.h" > @@ -476,9 +477,17 @@ trigger_paths_udev_change(struct multipath *mpp, bool is_mpath) > env = udev_device_get_property_value( > pp->udev, "DM_MULTIPATH_DEVICE_PATH"); > > - if (is_mpath && env != NULL && !strcmp(env, "1")) > - continue; > - else if (!is_mpath && If DM_MULTIPATH_DEVICE_PATH=1 then there has already been a uevent where udev recognized that the device should be claimed. Wouldn't udev have stopped the timer then? I don't see why this is necessary. > + if (is_mpath && env != NULL && !strcmp(env, "1")) { > + /* > + * If FIND_MULTIPATHS_WAIT_UNTIL is not "0", > + * path is in "maybe" state and timer is running > + * Send uevent now (see multipath.rules). > + */ > + env = udev_device_get_property_value( > + pp->udev, "FIND_MULTIPATHS_WAIT_UNTIL"); > + if (env == NULL || !strcmp(env, "0")) > + continue; > + } else if (!is_mpath && > (env == NULL || !strcmp(env, "0"))) > continue; > > diff --git a/libmultipath/dict.c b/libmultipath/dict.c > index 4be808d..8a18b1f 100644 > --- a/libmultipath/dict.c > +++ b/libmultipath/dict.c > @@ -239,6 +239,7 @@ static const char *find_multipaths_optvals[] = { > [FIND_MULTIPATHS_ON] = "on", > [FIND_MULTIPATHS_STRICT] = "strict", > [FIND_MULTIPATHS_GREEDY] = "greedy", > + [FIND_MULTIPATHS_SMART] = "smart", > }; > > static int > diff --git a/multipath/multipath.conf.5 b/multipath/multipath.conf.5 > index 94c419a..641ba43 100644 > --- a/multipath/multipath.conf.5 > +++ b/multipath/multipath.conf.5 > @@ -978,6 +978,19 @@ with the same WWID have been detected. > Both multipathd and multipath treat every non-blacklisted device as multipath > device path. > .TP > +.I smart > +This differs from \fIfind_multipaths yes\fR only in > +the way it treats new devices for which only one path has been > +detected yet. When such a device is first encounted in udev rules, it is > +treated as a multipath device. multipathd waits whether additional paths with > +the same WWID appears. If that happens, it sets up a multipath map. If it > +doesn\'t happen until a > +timeout expires, or if setting up the map fails, a new uevent is triggered for > +the device; at second encounter in the udev rules, the device will be treated > +as non-multipath and passed on to upper layers. > +\fBNote:\fR this may cause delays during device detection if > +there are single-path devices which aren\'t blacklisted. > +.TP > The default is: \fBstrict\fR > .RE > . > -- > 2.16.1 -- dm-devel mailing list dm-devel@redhat.com https://www.redhat.com/mailman/listinfo/dm-devel
On Thu, 2018-04-12 at 13:47 -0500, Benjamin Marzinski wrote: > On Wed, Apr 04, 2018 at 06:16:26PM +0200, Martin Wilck wrote: > > This activates "smart" path detection. This is similar to > > "find_multipaths yes", but doesn't generally ignore single paths > > that are not listed in the WWIDs file. Rather, such paths are > > temporarily treated like multipath members. If no additional paths > > are detected after a certain time, the paths are re-added to the > > system as non-multipath. This needs support by the udev rules, to > > be added in a follow-up patch. > > > > If a multipath map is successfully successfully created, and paths > > are > > in waiting state, trigger path uevents to update their status. > > > > Signed-off-by: Martin Wilck <mwilck@suse.com> > > --- > > libmultipath/configure.c | 15 ++++++++++++--- > > libmultipath/dict.c | 1 + > > multipath/multipath.conf.5 | 13 +++++++++++++ > > 3 files changed, 26 insertions(+), 3 deletions(-) > > > > diff --git a/libmultipath/configure.c b/libmultipath/configure.c > > index 9aa3d21..17c2fa1 100644 > > --- a/libmultipath/configure.c > > +++ b/libmultipath/configure.c > > @@ -12,6 +12,7 @@ > > #include <string.h> > > #include <sys/file.h> > > #include <errno.h> > > +#include <ctype.h> > > #include <libdevmapper.h> > > #include <libudev.h> > > #include "mpath_cmd.h" > > @@ -476,9 +477,17 @@ trigger_paths_udev_change(struct multipath > > *mpp, bool is_mpath) > > env = udev_device_get_property_value( > > pp->udev, > > "DM_MULTIPATH_DEVICE_PATH"); > > > > - if (is_mpath && env != NULL && > > !strcmp(env, "1")) > > - continue; > > - else if (!is_mpath && > > If DM_MULTIPATH_DEVICE_PATH=1 then there has already been a uevent > where > udev recognized that the device should be claimed. Wouldn't udev > have > stopped the timer then? I don't see why this is necessary. I set DM_MULTIPATH_DEVICE_PATH=1 in the "pretend_mpath" section in multipath.rules in the "maybe" case. The value DM_MULTIPATH_DEVICE_PATH=2 is never passed on to other udev rules, and never seen by multipathd. The reason I did that was that rules may have checks like 'DM_MULTIPATH_DEVICE_PATH!="1", ...' and I wanted to avoid these to be run in the "maybe" case, which, for all actors above multipath, should be temporarily treated like "yes". I hope this explains it. Martin
On Fri, Apr 13, 2018 at 12:27:29AM +0200, Martin Wilck wrote: > On Thu, 2018-04-12 at 13:47 -0500, Benjamin Marzinski wrote: > > On Wed, Apr 04, 2018 at 06:16:26PM +0200, Martin Wilck wrote: > > > This activates "smart" path detection. This is similar to > > > "find_multipaths yes", but doesn't generally ignore single paths > > > that are not listed in the WWIDs file. Rather, such paths are > > > temporarily treated like multipath members. If no additional paths > > > are detected after a certain time, the paths are re-added to the > > > system as non-multipath. This needs support by the udev rules, to > > > be added in a follow-up patch. > > > > > > If a multipath map is successfully successfully created, and paths > > > are > > > in waiting state, trigger path uevents to update their status. > > > > > > Signed-off-by: Martin Wilck <mwilck@suse.com> > > > --- > > > libmultipath/configure.c | 15 ++++++++++++--- > > > libmultipath/dict.c | 1 + > > > multipath/multipath.conf.5 | 13 +++++++++++++ > > > 3 files changed, 26 insertions(+), 3 deletions(-) > > > > > > diff --git a/libmultipath/configure.c b/libmultipath/configure.c > > > index 9aa3d21..17c2fa1 100644 > > > --- a/libmultipath/configure.c > > > +++ b/libmultipath/configure.c > > > @@ -12,6 +12,7 @@ > > > #include <string.h> > > > #include <sys/file.h> > > > #include <errno.h> > > > +#include <ctype.h> > > > #include <libdevmapper.h> > > > #include <libudev.h> > > > #include "mpath_cmd.h" > > > @@ -476,9 +477,17 @@ trigger_paths_udev_change(struct multipath > > > *mpp, bool is_mpath) > > > env = udev_device_get_property_value( > > > pp->udev, > > > "DM_MULTIPATH_DEVICE_PATH"); > > > > > > - if (is_mpath && env != NULL && > > > !strcmp(env, "1")) > > > - continue; > > > - else if (!is_mpath && > > > > If DM_MULTIPATH_DEVICE_PATH=1 then there has already been a uevent > > where > > udev recognized that the device should be claimed. Wouldn't udev > > have > > stopped the timer then? I don't see why this is necessary. > > I set DM_MULTIPATH_DEVICE_PATH=1 in the "pretend_mpath" section > in multipath.rules in the "maybe" case. The value > DM_MULTIPATH_DEVICE_PATH=2 is never passed on to other udev rules, > and never seen by multipathd. > > The reason I did that was that rules may have checks like > 'DM_MULTIPATH_DEVICE_PATH!="1", ...' and I wanted to avoid these to be > run in the "maybe" case, which, for all actors above multipath, > should be temporarily treated like "yes". > > I hope this explains it. Yeah, I probably should have looked back over the code I was confused about after I read the udev rules patch. I apparently figured that out last time I reviewed the patch, and just forgot it. Reviewed-by: Benjamin Marzinski <bmarzins@redhat.com> > > Martin > > -- > Dr. Martin Wilck <mwilck@suse.com>, Tel. +49 (0)911 74053 2107 > SUSE Linux GmbH, GF: Felix Imendörffer, Jane Smithard, Graham Norton > HRB 21284 (AG Nürnberg) -- dm-devel mailing list dm-devel@redhat.com https://www.redhat.com/mailman/listinfo/dm-devel
diff --git a/libmultipath/configure.c b/libmultipath/configure.c index 9aa3d21..17c2fa1 100644 --- a/libmultipath/configure.c +++ b/libmultipath/configure.c @@ -12,6 +12,7 @@ #include <string.h> #include <sys/file.h> #include <errno.h> +#include <ctype.h> #include <libdevmapper.h> #include <libudev.h> #include "mpath_cmd.h" @@ -476,9 +477,17 @@ trigger_paths_udev_change(struct multipath *mpp, bool is_mpath) env = udev_device_get_property_value( pp->udev, "DM_MULTIPATH_DEVICE_PATH"); - if (is_mpath && env != NULL && !strcmp(env, "1")) - continue; - else if (!is_mpath && + if (is_mpath && env != NULL && !strcmp(env, "1")) { + /* + * If FIND_MULTIPATHS_WAIT_UNTIL is not "0", + * path is in "maybe" state and timer is running + * Send uevent now (see multipath.rules). + */ + env = udev_device_get_property_value( + pp->udev, "FIND_MULTIPATHS_WAIT_UNTIL"); + if (env == NULL || !strcmp(env, "0")) + continue; + } else if (!is_mpath && (env == NULL || !strcmp(env, "0"))) continue; diff --git a/libmultipath/dict.c b/libmultipath/dict.c index 4be808d..8a18b1f 100644 --- a/libmultipath/dict.c +++ b/libmultipath/dict.c @@ -239,6 +239,7 @@ static const char *find_multipaths_optvals[] = { [FIND_MULTIPATHS_ON] = "on", [FIND_MULTIPATHS_STRICT] = "strict", [FIND_MULTIPATHS_GREEDY] = "greedy", + [FIND_MULTIPATHS_SMART] = "smart", }; static int diff --git a/multipath/multipath.conf.5 b/multipath/multipath.conf.5 index 94c419a..641ba43 100644 --- a/multipath/multipath.conf.5 +++ b/multipath/multipath.conf.5 @@ -978,6 +978,19 @@ with the same WWID have been detected. Both multipathd and multipath treat every non-blacklisted device as multipath device path. .TP +.I smart +This differs from \fIfind_multipaths yes\fR only in +the way it treats new devices for which only one path has been +detected yet. When such a device is first encounted in udev rules, it is +treated as a multipath device. multipathd waits whether additional paths with +the same WWID appears. If that happens, it sets up a multipath map. If it +doesn\'t happen until a +timeout expires, or if setting up the map fails, a new uevent is triggered for +the device; at second encounter in the udev rules, the device will be treated +as non-multipath and passed on to upper layers. +\fBNote:\fR this may cause delays during device detection if +there are single-path devices which aren\'t blacklisted. +.TP The default is: \fBstrict\fR .RE .
This activates "smart" path detection. This is similar to "find_multipaths yes", but doesn't generally ignore single paths that are not listed in the WWIDs file. Rather, such paths are temporarily treated like multipath members. If no additional paths are detected after a certain time, the paths are re-added to the system as non-multipath. This needs support by the udev rules, to be added in a follow-up patch. If a multipath map is successfully successfully created, and paths are in waiting state, trigger path uevents to update their status. Signed-off-by: Martin Wilck <mwilck@suse.com> --- libmultipath/configure.c | 15 ++++++++++++--- libmultipath/dict.c | 1 + multipath/multipath.conf.5 | 13 +++++++++++++ 3 files changed, 26 insertions(+), 3 deletions(-)