# # 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 "
}
}
+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)
{
}
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
*/
}
pp->state = newstate;
}
+ defered_failback_tick(allpaths->mpvec);
unlock(allpaths->lock);
sleep(1);
}