[multipath] express the failback delay in seconds
authorroot <root@xa-s05.(none)>
Wed, 22 Jun 2005 09:49:52 +0000 (11:49 +0200)
committerroot <root@xa-s05.(none)>
Wed, 22 Jun 2005 09:49:52 +0000 (11:49 +0200)
Failback is still scheduled upon path going up and canceled upon paths
going down.

multipath.conf.annotated
multipathd/main.c

index 04e7880..253ac3f 100644 (file)
@@ -83,7 +83,7 @@
 #      # scope   : multipathd
 #      # desc    : tell the daemon to manage path group failback, or not to.
 #      #           0 means immediate failback, values >0 means deffered failback
-#      #           expressed in number of consecutive sucessful checks.
+#      #           expressed in seconds.
 #      # values  : manual|immediate|n > 0
 #      # default : immediate
 #      #
 #              # scope   : multipathd
 #              # desc    : tell the daemon to manage path group failback, or not to.
 #              #           0 means immediate failback, values >0 means deffered failback
-#              #           expressed in number of consecutive sucessful checks.
+#              #           expressed in seconds.
 #              # values  : manual|immediate|n > 0
 #              # default : immediate
 #              #
 #              # scope   : multipathd
 #              # desc    : tell the daemon to manage path group failback, or not to.
 #              #           0 means immediate failback, values >0 means deffered failback
-#              #           expressed in number of consecutive sucessful checks.
+#              #           expressed in seconds.
 #              # values  : manual|immediate|n > 0
 #              # default : immediate
 #              #
-#              failback                15
+#              failback                30
 #      }
 #      device {
 #              vendor                  "COMPAQ  "
index b43f863..a3d16a4 100644 (file)
@@ -903,6 +903,25 @@ enable_group(struct path * pp)
        }
 }
 
+static void
+defered_failback_tick (vector mpvec)
+{
+       struct multipath * mpp;
+       int i;
+
+       vector_foreach_slot (mpvec, mpp, i) {
+               /*
+                * defered failback getting sooner
+                */
+               if (mpp->pgfailback > 0 && mpp->failback_tick > 0) {
+                       mpp->failback_tick--;
+
+                       if (!mpp->failback_tick)
+                               switch_pathgroup(mpp);
+               }
+       }
+}
+
 static void *
 checkerloop (void *ap)
 {
@@ -1008,19 +1027,6 @@ checkerloop (void *ap)
                        }
                        else if (newstate == PATH_UP || newstate == PATH_GHOST) {
                                /*
-                                * PATH_UP for last two checks
-                                * defered failback getting sooner
-                                */
-                               if (pp->mpp->pgfailback > 0) {
-                                       if (pp->mpp->failback_tick > 0) {
-                                               pp->mpp->failback_tick--;
-
-                                               if (!pp->mpp->failback_tick)
-                                                       switch_pathgroup(pp->mpp);
-                                       }
-                               }
-                               
-                               /*
                                 * and double the next check delay.
                                 * max at conf->max_checkint
                                 */
@@ -1036,6 +1042,7 @@ checkerloop (void *ap)
                        }
                        pp->state = newstate;
                }
+               defered_failback_tick(allpaths->mpvec);
                unlock(allpaths->lock);
                sleep(1);
        }