BUG/MINOR: server: update last_change on maint->ready transitions too
Nenad noticed that when leaving maintenance, the servers' last_change
field was not updated. This is visible in the Status column of the stats
page in front of the state, as the cumuled time spent in the current state
is wrong, it starts from the last transition (typically ready->maint). In
addition, the backend's state was not updated either, because the down
transition is performed by set_backend_down() which also emits a log, and
it is this function which was extended to update the backend's last_change,
but it's not called for down->up transitions so that was not done.
The most visible (and unpleasant) effect of this bug is that it affects
slowstart so such a server could immediately restart with a significant
load ratio.
This should likely be backported to all stable releases.
(cherry picked from commit d332f1396b101f3f03e9fef405d42f03fc3647b6)
Signed-off-by: Willy Tarreau <w@1wt.eu>
(cherry picked from commit f79c4cf84967ffcc96e375c48afcb472ad246876)
Signed-off-by: Willy Tarreau <w@1wt.eu>
(cherry picked from commit c6c8cd92a1ef8ac360f51ce5c9d0a7b784c64d65)
Signed-off-by: Willy Tarreau <w@1wt.eu>
(cherry picked from commit d91ef4e3047a8bb90c6863df7c0b37a3d95d9797)
Signed-off-by: Willy Tarreau <w@1wt.eu>
diff --git a/src/server.c b/src/server.c
index d5a0c6b..8c290b5 100644
--- a/src/server.c
+++ b/src/server.c
@@ -5242,6 +5242,7 @@
s->next_state = SRV_ST_STOPPING;
}
else {
+ s->last_change = now.tv_sec;
s->next_state = SRV_ST_STARTING;
if (s->slowstart > 0) {
if (s->warmup)
@@ -5301,6 +5302,8 @@
if (prev_srv_count && s->proxy->srv_bck == 0 && s->proxy->srv_act == 0)
set_backend_down(s->proxy);
+ else if (!prev_srv_count && (s->proxy->srv_bck || s->proxy->srv_act))
+ s->proxy->last_change = now.tv_sec;
/* If the server is set with "on-marked-up shutdown-backup-sessions",
* and it's not a backup server and its effective weight is > 0,