|
From 74ffd0cd0cecaeec3cfa848cbc03beb08999cc72 Mon Sep 17 00:00:00 2001
|
|
From: Willy Tarreau <w@1wt.eu>
|
|
Date: Thu, 3 Nov 2016 18:19:49 +0100
|
|
Subject: [PATCH 28/31] BUG/MEDIUM: srv-state: properly restore the DRAIN state
|
|
|
|
There were seveal reports about the DRAIN state not being properly
|
|
restored upon reload.
|
|
|
|
It happens that the condition in the code does exactly the opposite
|
|
of what the comment says, and the comment is right so the code is
|
|
wrong.
|
|
|
|
It's worth noting that the conditions are complex here due to the 2
|
|
available methods to set the drain state (CLI/agent, and config's
|
|
weight). To paraphrase the updated comment in the code, there are
|
|
two possible reasons for FDRAIN to have been present :
|
|
- previous config weight was zero
|
|
- "set server b/s drain" was sent to the CLI
|
|
|
|
In the first case, we simply want to drop this drain state if the new
|
|
weight is not zero anymore, meaning the administrator has intentionally
|
|
turned the weight back to a positive value to enable the server again
|
|
after an operation. In the second case, the drain state was forced on
|
|
the CLI regardless of the config's weight so we don't want a change to
|
|
the config weight to lose this status. What this means is :
|
|
- if previous weight was 0 and new one is >0, drop the DRAIN state.
|
|
- if the previous weight was >0, keep it.
|
|
|
|
This fix must be backported to 1.6.
|
|
(cherry picked from commit 22cace2f4c3cbeca27c1941c647e7ae38ec8c0c0)
|
|
---
|
|
src/server.c | 22 +++++++++++++++-------
|
|
1 file changed, 15 insertions(+), 7 deletions(-)
|
|
|
|
diff --git a/src/server.c b/src/server.c
|
|
index 79b3cb2..b9e72b7 100644
|
|
--- a/src/server.c
|
|
+++ b/src/server.c
|
|
@@ -2093,15 +2093,23 @@ static void srv_update_state(struct server *srv, int version, char **params)
|
|
/* apply drain mode if server is currently enabled */
|
|
if (!(srv->admin & SRV_ADMF_FMAINT) && (srv_admin_state & SRV_ADMF_FDRAIN)) {
|
|
/* The SRV_ADMF_FDRAIN flag is inherited when srv->iweight is 0
|
|
- * (srv->iweight is the weight set up in configuration)
|
|
- * so we don't want to apply it when srv_iweight is 0 and
|
|
- * srv->iweight is greater than 0. Purpose is to give the
|
|
- * chance to the admin to re-enable this server from configuration
|
|
- * file by setting a new weight > 0.
|
|
+ * (srv->iweight is the weight set up in configuration).
|
|
+ * There are two possible reasons for FDRAIN to have been present :
|
|
+ * - previous config weight was zero
|
|
+ * - "set server b/s drain" was sent to the CLI
|
|
+ *
|
|
+ * In the first case, we simply want to drop this drain state
|
|
+ * if the new weight is not zero anymore, meaning the administrator
|
|
+ * has intentionally turned the weight back to a positive value to
|
|
+ * enable the server again after an operation. In the second case,
|
|
+ * the drain state was forced on the CLI regardless of the config's
|
|
+ * weight so we don't want a change to the config weight to lose this
|
|
+ * status. What this means is :
|
|
+ * - if previous weight was 0 and new one is >0, drop the DRAIN state.
|
|
+ * - if the previous weight was >0, keep it.
|
|
*/
|
|
- if ((srv_iweight == 0) && (srv->iweight > 0)) {
|
|
+ if (srv_iweight > 0 || srv->iweight == 0)
|
|
srv_adm_set_drain(srv);
|
|
- }
|
|
}
|
|
|
|
srv->last_change = date.tv_sec - srv_last_time_change;
|
|
--
|
|
2.7.3
|
|
|