Skip to contentSkip to conversation

multipath: add detect_prio option to autodetect prioitizer

PATCH In review Benjamin Marzinski 3 participants 4 messages Jan 10, 2013 – Jan 14, 2013 Device mapper

lore
Share & tools
lore

Benjamin Marzinski

author maintainer
#0 lore raw

PATCH v2 1/1 multipath: add detect_prio option to autodetect prioitizer

This patch adds a new multipath.conf option, detect_prio. If set to yes, multipathd will try to determine the correct prioritizer for the device. If it finds one, that will be used instead of its configured prioritizer. If none is found, the configured prioritizer will be used. It can currently only detect ALUA devices.

Also fixed and issue with select_prio where in the devices section, it was passing in the prio name string instead of the prio args string to prio_get()

---
 libmultipath/Makefile    |    2 -
 libmultipath/config.c    |    3 +
 libmultipath/config.h    |    2 +
 libmultipath/defaults.h  |    1 
 libmultipath/dict.c      |   74 +++++++++++++++++++++++++++++++++++++++++++++++
 libmultipath/discovery.c |    1 
 libmultipath/propsel.c   |   39 ++++++++++++++++++++++++
 libmultipath/propsel.h   |    1 
 libmultipath/structs.h   |    7 ++++
 9 files changed, 128 insertions(+), 2 deletions(-)
libmultipath/config.c +3 -0
Index: multipath-tools-130109/libmultipath/config.c
===================================================================
@@ -330,6 +330,7 @@ merge_hwe (struct hwentry * dst, struct
 	merge_num(dev_loss);
 	merge_num(user_friendly_names);
 	merge_num(retain_hwhandler);
+	merge_num(detect_prio);
 
 	return 0;
 }
@@ -390,6 +391,7 @@ store_hwe (vector hwtable, struct hwentr
 	hwe->dev_loss = dhwe->dev_loss;
 	hwe->user_friendly_names = dhwe->user_friendly_names;
 	hwe->retain_hwhandler = dhwe->retain_hwhandler;
+	hwe->detect_prio = dhwe->detect_prio;
 
 	if (dhwe->bl_product && !(hwe->bl_product = set_param_str(dhwe->bl_product)))
 		goto out;
@@ -530,6 +532,7 @@ load_config (char * file)
 	conf->max_checkint = MAX_CHECKINT(conf->checkint);
 	conf->fast_io_fail = 5;
 	conf->retain_hwhandler = DEFAULT_RETAIN_HWHANDLER;
+	conf->detect_prio = DEFAULT_DETECT_PRIO;
 
 	/*
 	 * preload default hwtable
libmultipath/config.h +2 -0
Index: multipath-tools-130109/libmultipath/config.h
===================================================================
@@ -47,6 +47,7 @@ struct hwentry {
 	unsigned int dev_loss;
 	int user_friendly_names;
 	int retain_hwhandler;
+	int detect_prio;
 	char * bl_product;
 };
 
@@ -110,6 +111,7 @@ struct config {
 	uint32_t cookie;
 	int reassign_maps;
 	int retain_hwhandler;
+	int detect_prio;
 	unsigned int version[3];
 
 	char * dev;
libmultipath/defaults.h +1 -0
Index: multipath-tools-130109/libmultipath/defaults.h
===================================================================
@@ -16,6 +16,7 @@
 #define DEFAULT_VERBOSITY	2
 #define DEFAULT_REASSIGN_MAPS	1
 #define DEFAULT_RETAIN_HWHANDLER RETAIN_HWHANDLER_OFF
+#define DEFAULT_DETECT_PRIO DETECT_PRIO_OFF
 
 #define DEFAULT_CHECKINT	5
 #define MAX_CHECKINT(a)		(a << 2)
libmultipath/dict.c +74 -0

110 lines not on this page · raw message

libmultipath/structs.h +7 -0
Index: multipath-tools-130109/libmultipath/structs.h
===================================================================
@@ -107,6 +107,12 @@ enum retain_hwhandler_states {
 	RETAIN_HWHANDLER_ON,
 };
 
+enum detect_prio_states {
+	DETECT_PRIO_UNDEF,
+	DETECT_PRIO_OFF,
+	DETECT_PRIO_ON,
+};
+
 struct scsi_idlun {
 	int dev_id;
 	int host_unique_id;
@@ -165,6 +171,7 @@ struct path {
 	int failcount;
 	int priority;
 	int pgindex;
+	int detect_prio;
 	char * uid_attribute;
 	struct prio prio;
 	char * prio_args;
libmultipath/propsel.c +38 -1
Index: multipath-tools-130109/libmultipath/propsel.c
===================================================================
@@ -17,6 +17,7 @@
 #include "devmapper.h"
 #include "prio.h"
 #include "discovery.h"
+#include "prioritizers/alua_rtpg.h"
 #include <inttypes.h>
 
 pgpolicyfn *pgpolicies[] = {
@@ -382,12 +383,30 @@ select_getuid (struct path * pp)
 	return 0;
 }
 
+void
+detect_prio(struct path * pp)
+{
+	struct prio *p = &pp->prio;
+
+	if (get_target_port_group_support(pp->fd) > 0)
+		prio_get(p, PRIO_ALUA, DEFAULT_PRIO_ARGS);
+}
+
 extern int
 select_prio (struct path * pp)
 {
 	struct mpentry * mpe;
 	struct prio * p = &pp->prio;
 
+	if (pp->detect_prio == DETECT_PRIO_ON) {
+		detect_prio(pp);
+		if (prio_selected(p)) {
+			condlog(3, "%s: prio = %s (detected setting)",
+				pp->dev, prio_name(p));
+			return 0;
+		}
+	}
+
 	if ((mpe = find_mpe(pp->wwid))) {
 		if (mpe->prio_name) {
 			prio_get(p, mpe->prio_name, mpe->prio_args);
@@ -398,7 +417,7 @@ select_prio (struct path * pp)
 	}
 
 	if (pp->hwe && pp->hwe->prio_name) {
-		prio_get(p, pp->hwe->prio_name, pp->hwe->prio_name);
+		prio_get(p, pp->hwe->prio_name, pp->hwe->prio_args);
 		condlog(3, "%s: prio = %s (controller setting)",
 			pp->dev, pp->hwe->prio_name);
 		condlog(3, "%s: prio args = %s (controller setting)",
@@ -706,3 +725,21 @@ select_retain_hwhandler (struct multipat
 	condlog(3, "%s: retain_attached_hw_handler = %d (compiled in default)", mp->alias, mp->retain_hwhandler);
 	return 0;
 }
+
+extern int
+select_detect_prio (struct path * pp)
+{
+	if (pp->hwe && pp->hwe->detect_prio) {
+		pp->detect_prio = pp->hwe->detect_prio;
+		condlog(3, "%s: detect_prio = %d (controller default)", pp->dev, pp->detect_prio);
+		return 0;
+	}
+	if (conf->detect_prio) {
+		pp->detect_prio = conf->detect_prio;
+		condlog(3, "%s: detect_prio = %d (config file default)", pp->dev, pp->detect_prio);
+		return 0;
+	}
+	pp->detect_prio = 0;
+	condlog(3, "%s: detect_prio = %d (compiled in default)", pp->dev, pp->detect_prio);
+	return 0;
+}
libmultipath/Makefile +1 -1
Index: multipath-tools-130109/libmultipath/Makefile
===================================================================
@@ -15,7 +15,7 @@ OBJS = memory.o parser.o vector.o devmap
        pgpolicies.o debug.o regex.o defaults.o uevent.o \
        switchgroup.o uxsock.o print.o alias.o log_pthread.o \
        log.o configure.o structs_vec.o sysfs.o prio.o checkers.o \
-       lock.o waiter.o file.o wwids.o
+       lock.o waiter.o file.o wwids.o prioritizers/alua_rtpg.o
 
 LIBDM_API_FLUSH = $(shell grep -Ecs '^[a-z]*[[:space:]]+dm_task_no_flush' /usr/include/libdevmapper.h)
 
libmultipath/discovery.c +1 -0
Index: multipath-tools-130109/libmultipath/discovery.c
===================================================================
@@ -782,6 +782,7 @@ get_prio (struct path * pp)
 	struct prio * p = &pp->prio;
 
 	if (!prio_selected(p)) {
+		select_detect_prio(pp);
 		select_prio(pp);
 		if (!prio_selected(p)) {
 			condlog(3, "%s: no prio selected", pp->dev);
libmultipath/propsel.h +1 -0
Index: multipath-tools-130109/libmultipath/propsel.h
===================================================================
@@ -19,3 +19,4 @@ int select_fast_io_fail(struct multipath
 int select_dev_loss(struct multipath *mp);
 int select_reservation_key(struct multipath *mp);
 int select_retain_hwhandler (struct multipath * mp);
+int select_detect_prio(struct path * pp);
Acked-by on v2 1/1
#1 lore raw
Quoted 10 lines · Benjamin Marzinski

This patch adds a new multipath.conf option, detect_prio. If set to yes, multipathd will try to determine the correct prioritizer for the device. If it finds one, that will be used instead of its configured prioritizer. If none is found, the configured prioritizer will be used. It can currently only detect ALUA devices.

Also fixed and issue with select_prio where in the devices section, it was passing in the prio name string instead of the prio args string to prio_get()

Good idea.

Cheers,

Hannes

Signature · 4 lines
Dr. Hannes Reinecke		      zSeries & Storage
[email protected]			      +49 911 74053 688
SUSE LINUX Products GmbH, Maxfeldstr. 5, 90409 Nürnberg
GF: J. Hawn, J. Guild, F. Imendörffer, HRB 16746 (AG Nürnberg)
#2 lore raw
Quoted 7 lines · Hannes Reinecke
Quoted 6 lines · Benjamin Marzinski

This patch adds a new multipath.conf option, detect_prio. If set to yes, multipathd will try to determine the correct prioritizer for the device. If it finds one, that will be used instead of its configured prioritizer. If none is found, the configured prioritizer will be used. It can currently only detect ALUA devices.

Quoted 7 lines
Quoted 4 lines

Also fixed and issue with select_prio where in the devices section, it was passing in the prio name string instead of the prio args string to prio_get()

Good idea.

Don"t you think it would be fair to fallback to autodetection if no prioritizer is set, instead ? Admins would expect the values they care to set in the config file are honored.

Best regards,
Christophe Varoqui
www.opensvc.com

#3 lore raw
Quoted 11 lines · Christophe Varoqui
Quoted 10 lines · Hannes Reinecke
Quoted 9 lines · Benjamin Marzinski

This patch adds a new multipath.conf option, detect_prio. If set to yes, multipathd will try to determine the correct prioritizer for the device. If it finds one, that will be used instead of its configured prioritizer. If none is found, the configured prioritizer will be used. It can currently only detect ALUA devices.

Also fixed and issue with select_prio where in the devices section, it was passing in the prio name string instead of the prio args string to prio_get()

Quoted 8 lines
Quoted 4 lines
Quoted 1 line

Good idea.

Don"t you think it would be fair to fallback to autodetection if no prioritizer is set, instead ? Admins would expect the values they care to set in the config file are honored.

It would, if we had autodetection for more (or, better, all) hardware handlers. Shouldn't be too hard.

I'll give it a go at it once this patchset is merged.

Cheers,

Hannes

Signature · 4 lines
Dr. Hannes Reinecke		      zSeries & Storage
[email protected]			      +49 911 74053 688
SUSE LINUX Products GmbH, Maxfeldstr. 5, 90409 Nürnberg
GF: J. Hawn, J. Guild, F. Imendörffer, HRB 16746 (AG Nürnberg)