mirror of
https://git.haproxy.org/git/haproxy.git/
synced 2025-08-07 07:37:02 +02:00
[MEDIUM] redispatch queued sessions if possible when a server goes down.
This commit is contained in:
parent
45526ed05b
commit
2812edcde8
107
haproxy.c
107
haproxy.c
@ -5797,6 +5797,63 @@ int process_session(struct task *t) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* Sets server <s> down, notifies by all available means, recounts the
|
||||||
|
* remaining servers on the proxy and transfers queued sessions whenever
|
||||||
|
* possible to other servers.
|
||||||
|
*/
|
||||||
|
void set_server_down(struct server *s) {
|
||||||
|
struct pendconn *pc, *pc_bck, *pc_end;
|
||||||
|
struct session *sess;
|
||||||
|
int xferred;
|
||||||
|
|
||||||
|
s->state &= ~SRV_RUNNING;
|
||||||
|
|
||||||
|
if (s->health == s->rise) {
|
||||||
|
recount_servers(s->proxy);
|
||||||
|
recalc_server_map(s->proxy);
|
||||||
|
|
||||||
|
/* we might have sessions queued on this server and waiting for
|
||||||
|
* a connection. Those which are redispatchable will be queued
|
||||||
|
* to another server or to the proxy itself.
|
||||||
|
*/
|
||||||
|
xferred = 0;
|
||||||
|
FOREACH_ITEM_SAFE(pc, pc_bck, &s->pendconns, pc_end, struct pendconn *, list) {
|
||||||
|
sess = pc->sess;
|
||||||
|
if ((sess->proxy->options & PR_O_REDISP)) {
|
||||||
|
/* The REDISP option was specified. We will ignore
|
||||||
|
* cookie and force to balance or use the dispatcher.
|
||||||
|
*/
|
||||||
|
sess->flags &= ~(SN_DIRECT | SN_ASSIGNED | SN_ADDR_SET);
|
||||||
|
sess->srv = NULL; /* it's left to the dispatcher to choose a server */
|
||||||
|
if ((sess->flags & SN_CK_MASK) == SN_CK_VALID) {
|
||||||
|
sess->flags &= ~SN_CK_MASK;
|
||||||
|
sess->flags |= SN_CK_DOWN;
|
||||||
|
}
|
||||||
|
pendconn_free(pc);
|
||||||
|
task_wakeup(&rq, sess->task);
|
||||||
|
xferred++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
sprintf(trash, "%sServer %s/%s is DOWN. %d active and %d backup servers left.%s"
|
||||||
|
" %d sessions active, %d requeued, %d remaining in queue.\n",
|
||||||
|
s->state & SRV_BACKUP ? "Backup " : "",
|
||||||
|
s->proxy->id, s->id, s->proxy->srv_act, s->proxy->srv_bck,
|
||||||
|
(s->proxy->srv_bck && !s->proxy->srv_act) ? " Running on backup." : "",
|
||||||
|
s->cur_sess, xferred, s->nbpend);
|
||||||
|
|
||||||
|
Warning(trash);
|
||||||
|
send_log(s->proxy, LOG_ALERT, trash);
|
||||||
|
|
||||||
|
if (s->proxy->srv_bck == 0 && s->proxy->srv_act == 0) {
|
||||||
|
Alert("Proxy %s has no server available !\n", s->proxy->id);
|
||||||
|
send_log(s->proxy, LOG_EMERG, "Proxy %s has no server available !\n", s->proxy->id);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
s->health = 0; /* failure */
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* manages a server health-check. Returns
|
* manages a server health-check. Returns
|
||||||
@ -5900,28 +5957,8 @@ int process_chk(struct task *t) {
|
|||||||
/* here, we have seen a failure */
|
/* here, we have seen a failure */
|
||||||
if (s->health > s->rise)
|
if (s->health > s->rise)
|
||||||
s->health--; /* still good */
|
s->health--; /* still good */
|
||||||
else {
|
else
|
||||||
s->state &= ~SRV_RUNNING;
|
set_server_down(s);
|
||||||
if (s->health == s->rise) {
|
|
||||||
recount_servers(s->proxy);
|
|
||||||
recalc_server_map(s->proxy);
|
|
||||||
Warning("%sServer %s/%s DOWN. %d active and %d backup servers left.%s\n",
|
|
||||||
s->state & SRV_BACKUP ? "Backup " : "",
|
|
||||||
s->proxy->id, s->id, s->proxy->srv_act, s->proxy->srv_bck,
|
|
||||||
(s->proxy->srv_bck && !s->proxy->srv_act) ? " Running on backup." : "");
|
|
||||||
send_log(s->proxy, LOG_ALERT,
|
|
||||||
"%sServer %s/%s is DOWN. %d active and %d backup servers left.%s\n",
|
|
||||||
s->state & SRV_BACKUP ? "Backup " : "",
|
|
||||||
s->proxy->id, s->id, s->proxy->srv_act, s->proxy->srv_bck,
|
|
||||||
(s->proxy->srv_bck && !s->proxy->srv_act) ? " Running on backup." : "");
|
|
||||||
|
|
||||||
if (s->proxy->srv_bck == 0 && s->proxy->srv_act == 0) {
|
|
||||||
Alert("Proxy %s has no server available !\n", s->proxy->id);
|
|
||||||
send_log(s->proxy, LOG_EMERG, "Proxy %s has no server available !\n", s->proxy->id);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
s->health = 0; /* failure */
|
|
||||||
}
|
|
||||||
|
|
||||||
//fprintf(stderr, "process_chk: 7\n");
|
//fprintf(stderr, "process_chk: 7\n");
|
||||||
/* FIXME: we allow up to <inter> for a connection to establish, but we should use another parameter */
|
/* FIXME: we allow up to <inter> for a connection to establish, but we should use another parameter */
|
||||||
@ -5966,30 +6003,8 @@ int process_chk(struct task *t) {
|
|||||||
/* failure or timeout detected */
|
/* failure or timeout detected */
|
||||||
if (s->health > s->rise)
|
if (s->health > s->rise)
|
||||||
s->health--; /* still good */
|
s->health--; /* still good */
|
||||||
else {
|
else
|
||||||
s->state &= ~SRV_RUNNING;
|
set_server_down(s);
|
||||||
|
|
||||||
if (s->health == s->rise) {
|
|
||||||
recount_servers(s->proxy);
|
|
||||||
recalc_server_map(s->proxy);
|
|
||||||
Warning("%sServer %s/%s DOWN. %d active and %d backup servers left.%s\n",
|
|
||||||
s->state & SRV_BACKUP ? "Backup " : "",
|
|
||||||
s->proxy->id, s->id, s->proxy->srv_act, s->proxy->srv_bck,
|
|
||||||
(s->proxy->srv_bck && !s->proxy->srv_act) ? " Running on backup." : "");
|
|
||||||
send_log(s->proxy, LOG_ALERT,
|
|
||||||
"%sServer %s/%s is DOWN. %d active and %d backup servers left.%s\n",
|
|
||||||
s->state & SRV_BACKUP ? "Backup " : "",
|
|
||||||
s->proxy->id, s->id, s->proxy->srv_act, s->proxy->srv_bck,
|
|
||||||
(s->proxy->srv_bck && !s->proxy->srv_act) ? " Running on backup." : "");
|
|
||||||
|
|
||||||
if (s->proxy->srv_bck == 0 && s->proxy->srv_act == 0) {
|
|
||||||
Alert("Proxy %s has no server available !\n", s->proxy->id);
|
|
||||||
send_log(s->proxy, LOG_EMERG, "Proxy %s has no server available !\n", s->proxy->id);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
s->health = 0; /* failure */
|
|
||||||
}
|
|
||||||
s->curfd = -1;
|
s->curfd = -1;
|
||||||
//FD_CLR(fd, StaticWriteEvent);
|
//FD_CLR(fd, StaticWriteEvent);
|
||||||
fd_delete(fd);
|
fd_delete(fd);
|
||||||
|
Loading…
Reference in New Issue
Block a user