MEDIUM: lua: Set the analyse expiration date with smaller wake_time only
If a lua action yields for any reason and if the wake timeout is set, it only
override the analyse expiration date if it is smaller. This way, a lower
inspect-delay will be respected, if any.
diff --git a/src/hlua.c b/src/hlua.c
index 63ca26b..a3726ca 100644
--- a/src/hlua.c
+++ b/src/hlua.c
@@ -6534,7 +6534,6 @@
return 0;
}
-
/* This function is a wrapper to execute each LUA function declared as an action
* wrapper during the initialisation period. This function may return any
* ACT_RET_* value. On error ACT_RET_CONT is returned and the action is
@@ -6631,15 +6630,6 @@
s->hlua->max_time = hlua_timeout_session;
}
- /* Always reset the analyse expiration timeout for the corresponding
- * channel in case the lua script yield, to be sure to not keep an
- * expired timeout.
- */
- if (dir == SMP_OPT_DIR_REQ)
- s->req.analyse_exp = TICK_ETERNITY;
- else
- s->res.analyse_exp = TICK_ETERNITY;
-
/* Execute the function. */
switch (hlua_ctx_resume(s->hlua, !(flags & ACT_OPT_FINAL))) {
/* finished. */
@@ -6653,24 +6643,25 @@
if (flags & ACT_OPT_FINAL)
goto err_yield;
- if (s->hlua->wake_time != TICK_ETERNITY) {
- if (dir == SMP_OPT_DIR_REQ)
- s->req.analyse_exp = s->hlua->wake_time;
- else
- s->res.analyse_exp = s->hlua->wake_time;
- }
+ if (dir == SMP_OPT_DIR_REQ)
+ s->req.analyse_exp = tick_first((tick_is_expired(s->req.analyse_exp, now_ms) ? 0 : s->req.analyse_exp),
+ s->hlua->wake_time);
+ else
+ s->res.analyse_exp = tick_first((tick_is_expired(s->res.analyse_exp, now_ms) ? 0 : s->res.analyse_exp),
+ s->hlua->wake_time);
}
goto end;
/* yield. */
case HLUA_E_AGAIN:
/* Set timeout in the required channel. */
- if (s->hlua->wake_time != TICK_ETERNITY) {
- if (dir == SMP_OPT_DIR_REQ)
- s->req.analyse_exp = s->hlua->wake_time;
- else
- s->res.analyse_exp = s->hlua->wake_time;
- }
+ if (dir == SMP_OPT_DIR_REQ)
+ s->req.analyse_exp = tick_first((tick_is_expired(s->req.analyse_exp, now_ms) ? 0 : s->req.analyse_exp),
+ s->hlua->wake_time);
+ else
+ s->res.analyse_exp = tick_first((tick_is_expired(s->res.analyse_exp, now_ms) ? 0 : s->res.analyse_exp),
+ s->hlua->wake_time);
+
/* Some actions can be wake up when a "write" event
* is detected on a response channel. This is useful
* only for actions targeted on the requests.
@@ -6715,6 +6706,8 @@
}
end:
+ if (act_ret != ACT_RET_YIELD)
+ s->hlua->wake_time = TICK_ETERNITY;
return act_ret;
}