[dm-devel] Re: DM configuration
Kiyoshi Ueda
k-ueda at ct.jp.nec.com
Wed Oct 12 17:25:30 UTC 2005
Hi Christophe,
On Wed, 12 Oct 2005 07:16:12 +0200, Christophe Varoqui <christophe.varoqui at free.fr> wrote:
> > OK.
> > I extended the scope of the "no_path_retry" option to the multipath
> > command so that we can phase out the "features" option, because
> > the multipath command also sees the "features" option.
> >
> > And fixed some bugs of the patch.
> > o Initialization issue of retry_tick.
> > o Missing status update of retry_tick in waiteventloop and reconfigure.
> >
> > The new patch is below.
> > This patch doesn't change current behavior of multipath command by default.
> > The "no_path_option" option overrides the "features" option.
> >
> Thanks,
>
> I already merged the previous patch, with a little renaming.
> Can you rebase this one on korg git tree ?
Sure. I attach 2 patches.
1). Extend the scope of the "no_path_retry" option to the multipath.
2). Fix some bugs of missing retry_tick initialization/update in multipathd.
o Initialization by wrong value in update_queue_mode_del_path.
o Missing status update in update_multipath for events from kernel.
o Missing re-initialization in reconfigure.
====== 1). Extension of the "no_path_retry" scope to the multipath ======
diff -rup git/multipath/main.c no_path_retry_multipath/multipath/main.c
--- git/multipath/main.c 2005-10-12 10:08:28.000000000 -0400
+++ no_path_retry_multipath/multipath/main.c 2005-10-12 10:39:20.000000000 -0400
@@ -393,6 +393,7 @@ setup_map (struct multipath * mpp)
select_features(mpp);
select_hwhandler(mpp);
select_rr_weight(mpp);
+ select_no_path_retry(mpp);
/*
* apply selected grouping policy to valid paths
@@ -592,6 +593,12 @@ reinstate_paths (struct multipath * mpp)
return 0;
}
+/*
+ * Return value:
+ * 0: DM_DEVICE_CREATE or DM_DEVICE_RELOAD failed, or dry_run mode.
+ * 1: DM_DEVICE_CREATE or DM_DEVICE_RELOAD succeeded.
+ * 2: Map is already existing.
+ */
static int
domap (struct multipath * mpp)
{
@@ -607,7 +614,7 @@ domap (struct multipath * mpp)
switch (mpp->action) {
case ACT_NOTHING:
- return 0;
+ return 2;
case ACT_SWITCHPG:
dm_switchgroup(mpp->alias, mpp->nextpg);
@@ -617,7 +624,7 @@ domap (struct multipath * mpp)
* retry.
*/
reinstate_paths(mpp);
- return 0;
+ return 2;
case ACT_CREATE:
r = dm_addmap(DM_DEVICE_CREATE, mpp->alias, DEFAULT_TARGET,
@@ -746,7 +753,13 @@ coalesce_paths (vector curmp, vector pat
condlog(3, "action set to %i", mpp->action);
- domap(mpp);
+ if (domap(mpp) && mpp->no_path_retry != NO_PATH_RETRY_UNDEF) {
+ if (mpp->no_path_retry == NO_PATH_RETRY_FAIL)
+ dm_queue_if_no_path(mpp->alias, 0);
+ else
+ dm_queue_if_no_path(mpp->alias, 1);
+ }
+
next:
drop_multipath(curmp, mpp->wwid, KEEP_PATHS);
free_multipath(mpp, KEEP_PATHS);
diff -rup git/multipath.conf.annotated no_path_retry_multipath/multipath.conf.annotated
--- git/multipath.conf.annotated 2005-10-12 10:08:28.000000000 -0400
+++ no_path_retry_multipath/multipath.conf.annotated 2005-10-12 10:40:19.000000000 -0400
@@ -102,7 +102,7 @@
#
# #
# # name : no_path_retry
-# # scope : multipathd
+# # scope : multipath & multipathd
# # desc : tell the number of retries until disable queueing, or
# # "fail" means immediate failure (no queueing),
# # "queue" means never stop queueing
@@ -191,7 +191,7 @@
#
# #
# # name : no_path_retry
-# # scope : multipathd
+# # scope : multipath & multipathd
# # desc : tell the number of retries until disable queueing, or
# # "fail" means immediate failure (no queueing),
# # "queue" means never stop queueing
==========================================================================
====== 2). retry_tick bug fix for multipathd =============================
diff -rup git/multipathd/main.c no_path_retry_fix/multipathd/main.c
--- git/multipathd/main.c 2005-10-12 10:08:28.000000000 -0400
+++ no_path_retry_fix/multipathd/main.c 2005-10-12 11:09:11.000000000 -0400
@@ -223,6 +223,70 @@ pathcount (struct multipath *mpp, int st
return count;
}
+/*
+ * mpp->no_path_retry:
+ * -2 (QUEUE) : queue_if_no_path enabled, never turned off
+ * -1 (FAIL) : fail_if_no_path
+ * 0 (UNDEF) : nothing
+ * >0 : queue_if_no_path enabled, turned off after polling n times
+ */
+static void
+update_queue_mode_del_path(struct multipath *mpp)
+{
+ if (--mpp->nr_active == 0 && mpp->no_path_retry > 0) {
+ /*
+ * Enter retry mode.
+ * meaning of +1: retry_tick may be decremented in
+ * checkerloop before starting retry.
+ */
+ mpp->retry_tick = mpp->no_path_retry * conf->checkint + 1;
+ condlog(1, "%s: Entering recovery mode: max_retries=%d",
+ mpp->alias, mpp->no_path_retry);
+ }
+ condlog(2, "%s: remaining active paths: %d", mpp->alias, mpp->nr_active);
+}
+
+static void
+update_queue_mode_add_path(struct multipath *mpp)
+{
+ if (mpp->nr_active++ == 0 && mpp->no_path_retry > 0) {
+ /* come back to normal mode from retry mode */
+ mpp->retry_tick = 0;
+ dm_queue_if_no_path(mpp->alias, 1);
+ condlog(2, "%s: queue_if_no_path enabled", mpp->alias);
+ condlog(1, "%s: Recovered to normal mode", mpp->alias);
+ }
+ condlog(2, "%s: remaining active paths: %d", mpp->alias, mpp->nr_active);
+}
+
+static void
+set_no_path_retry(struct multipath *mpp)
+{
+ mpp->retry_tick = 0;
+ mpp->nr_active = pathcount(mpp, PATH_UP);
+ select_no_path_retry(mpp);
+
+ switch (mpp->no_path_retry) {
+ case NO_PATH_RETRY_UNDEF:
+ break;
+ case NO_PATH_RETRY_FAIL:
+ dm_queue_if_no_path(mpp->alias, 0);
+ break;
+ case NO_PATH_RETRY_QUEUE:
+ dm_queue_if_no_path(mpp->alias, 1);
+ break;
+ default:
+ dm_queue_if_no_path(mpp->alias, 1);
+ if (mpp->nr_active == 0) {
+ /* Enter retry mode */
+ mpp->retry_tick = mpp->no_path_retry * conf->checkint;
+ condlog(1, "%s: Entering recovery mode: max_retries=%d",
+ mpp->alias, mpp->no_path_retry);
+ }
+ break;
+ }
+}
+
static int
setup_multipath (struct vectors * vecs, struct multipath * mpp)
{
@@ -237,14 +301,7 @@ setup_multipath (struct vectors * vecs,
set_paths_owner(vecs, mpp);
select_pgfailback(mpp);
- mpp->nr_active = pathcount(mpp, PATH_UP);
- select_no_path_retry(mpp);
- if (mpp->no_path_retry != NO_PATH_RETRY_UNDEF) {
- if (mpp->no_path_retry == NO_PATH_RETRY_FAIL)
- dm_queue_if_no_path(mpp->alias, 0);
- else
- dm_queue_if_no_path(mpp->alias, 1);
- }
+ set_no_path_retry(mpp);
return 0;
out:
@@ -331,6 +388,7 @@ update_multipath (struct vectors *vecs,
if (pp->state != PATH_DOWN) {
condlog(2, "%s: mark as failed", pp->dev_t);
pp->state = PATH_DOWN;
+ update_queue_mode_del_path(pp->mpp);
/*
* if opportune,
@@ -370,38 +428,6 @@ static sigset_t unblock_sighup(void)
}
/*
- * mpp->no_path_retry:
- * -2 : queue_if_no_path enabled, never turned off
- * -1 : fail_if_no_path
- * 0 : nothing
- * >0 : queue_if_no_path enabled, turned off after polling n times
- */
-static void
-update_queue_mode_del_path(struct multipath *mpp)
-{
- if (--mpp->nr_active == 0 && mpp->no_path_retry > 0) {
- /* Enter retry mode */
- mpp->retry_tick = mpp->no_path_retry * conf->checkint;
- condlog(1, "%s: Entering recovery mode: max_retries=%d",
- mpp->alias, mpp->no_path_retry);
- }
- condlog(2, "%s: remaining active paths: %d", mpp->alias, mpp->nr_active);
-}
-
-static void
-update_queue_mode_add_path(struct multipath *mpp)
-{
- if (mpp->nr_active++ == 0 && mpp->no_path_retry > 0) {
- /* come back to normal mode from retry mode */
- mpp->retry_tick = 0;
- dm_queue_if_no_path(mpp->alias, 1);
- condlog(2, "%s: queue_if_no_path enabled", mpp->alias);
- condlog(1, "%s: Recovered to normal mode", mpp->alias);
- }
- condlog(2, "%s: remaining active paths: %d", mpp->alias, mpp->nr_active);
-}
-
-/*
* returns the reschedule delay
* negative means *stop*
*/
@@ -876,13 +902,7 @@ reconfigure (struct vectors * vecs)
vector_foreach_slot (vecs->mpvec, mpp, i) {
mpp->mpe = find_mpe(mpp->wwid);
set_paths_owner(vecs, mpp);
- select_no_path_retry(mpp);
- if (mpp->no_path_retry != NO_PATH_RETRY_UNDEF) {
- if (mpp->no_path_retry == NO_PATH_RETRY_FAIL)
- dm_queue_if_no_path(mpp->alias, 0);
- else
- dm_queue_if_no_path(mpp->alias, 1);
- }
+ set_no_path_retry(mpp);
}
vector_foreach_slot (vecs->pathvec, pp, i) {
select_checkfn(pp);
==========================================================================
Regards,
Kiyoshi Ueda
More information about the dm-devel
mailing list