mirror of
https://git.haproxy.org/git/haproxy.git/
synced 2025-09-23 06:41:32 +02:00
BUG/MEDIUM: server: unwanted behavior leaving maintenance mode on tracked stopping server
Leaving the maintenance state and if the server remains in stopping mode due to a tracked one: - We mistakenly try to grab some pending conns and shutdown backup sessions. - The proxy down time and last change were also mistakenly updated
This commit is contained in:
parent
2ba672726c
commit
e1e3947e7e
51
src/server.c
51
src/server.c
@ -1183,41 +1183,44 @@ void srv_clr_admin_flag(struct server *s, enum srv_admin mode)
|
|||||||
if ((!s->track || s->track->next_state != SRV_ST_STOPPED) &&
|
if ((!s->track || s->track->next_state != SRV_ST_STOPPED) &&
|
||||||
(!(s->agent.state & CHK_ST_ENABLED) || (s->agent.health >= s->agent.rise)) &&
|
(!(s->agent.state & CHK_ST_ENABLED) || (s->agent.health >= s->agent.rise)) &&
|
||||||
(!(s->check.state & CHK_ST_ENABLED) || (s->check.health >= s->check.rise))) {
|
(!(s->check.state & CHK_ST_ENABLED) || (s->check.health >= s->check.rise))) {
|
||||||
if (s->proxy->srv_bck == 0 && s->proxy->srv_act == 0) {
|
|
||||||
if (s->proxy->last_change < now.tv_sec) // ignore negative times
|
|
||||||
s->proxy->down_time += now.tv_sec - s->proxy->last_change;
|
|
||||||
s->proxy->last_change = now.tv_sec;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (s->last_change < now.tv_sec) // ignore negative times
|
|
||||||
s->down_time += now.tv_sec - s->last_change;
|
|
||||||
s->last_change = now.tv_sec;
|
|
||||||
|
|
||||||
if (s->track && s->track->next_state == SRV_ST_STOPPING)
|
if (s->track && s->track->next_state == SRV_ST_STOPPING)
|
||||||
|
s->last_change = now.tv_sec;
|
||||||
s->next_state = SRV_ST_STOPPING;
|
s->next_state = SRV_ST_STOPPING;
|
||||||
else {
|
else {
|
||||||
|
if (s->proxy->srv_bck == 0 && s->proxy->srv_act == 0) {
|
||||||
|
if (s->proxy->last_change < now.tv_sec) // ignore negative times
|
||||||
|
s->proxy->down_time += now.tv_sec - s->proxy->last_change;
|
||||||
|
s->proxy->last_change = now.tv_sec;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (s->last_change < now.tv_sec) // ignore negative times
|
||||||
|
s->down_time += now.tv_sec - s->last_change;
|
||||||
|
|
||||||
|
s->last_change = now.tv_sec;
|
||||||
s->next_state = SRV_ST_STARTING;
|
s->next_state = SRV_ST_STARTING;
|
||||||
if (s->slowstart > 0)
|
if (s->slowstart > 0)
|
||||||
task_schedule(s->warmup, tick_add(now_ms, MS_TO_TICKS(MAX(1000, s->slowstart / 20))));
|
task_schedule(s->warmup, tick_add(now_ms, MS_TO_TICKS(MAX(1000, s->slowstart / 20))));
|
||||||
else
|
else
|
||||||
s->next_state = SRV_ST_RUNNING;
|
s->next_state = SRV_ST_RUNNING;
|
||||||
|
|
||||||
|
server_recalc_eweight(s);
|
||||||
|
|
||||||
|
/* 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,
|
||||||
|
* then it can accept new connections, so we shut down all streams
|
||||||
|
* on all backup servers.
|
||||||
|
*/
|
||||||
|
if ((s->onmarkedup & HANA_ONMARKEDUP_SHUTDOWNBACKUPSESSIONS) &&
|
||||||
|
!(s->flags & SRV_F_BACKUP) && s->next_eweight)
|
||||||
|
srv_shutdown_backup_streams(s->proxy, SF_ERR_UP);
|
||||||
|
|
||||||
|
/* check if we can handle some connections queued at the proxy. We
|
||||||
|
* will take as many as we can handle.
|
||||||
|
*/
|
||||||
|
xferred = pendconn_grab_from_px(s);
|
||||||
}
|
}
|
||||||
|
|
||||||
server_recalc_eweight(s);
|
|
||||||
|
|
||||||
/* 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,
|
|
||||||
* then it can accept new connections, so we shut down all streams
|
|
||||||
* on all backup servers.
|
|
||||||
*/
|
|
||||||
if ((s->onmarkedup & HANA_ONMARKEDUP_SHUTDOWNBACKUPSESSIONS) &&
|
|
||||||
!(s->flags & SRV_F_BACKUP) && s->next_eweight)
|
|
||||||
srv_shutdown_backup_streams(s->proxy, SF_ERR_UP);
|
|
||||||
|
|
||||||
/* check if we can handle some connections queued at the proxy. We
|
|
||||||
* will take as many as we can handle.
|
|
||||||
*/
|
|
||||||
xferred = pendconn_grab_from_px(s);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (mode & SRV_ADMF_FMAINT) {
|
if (mode & SRV_ADMF_FMAINT) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user