mirror of
https://git.haproxy.org/git/haproxy.git/
synced 2025-08-08 16:17:09 +02:00
[MINOR] Allow shutdown of sessions when a server becomes unavailable
This adds the "on-marked-down shutdown-sessions" statement on "server" lines, which causes all sessions established on a server to be killed at once when the server goes down. The task's priority is reniced to the highest value (1024) so that servers holding many tasks don't cause a massive slowdown due to the wakeup storm.
This commit is contained in:
parent
af51495397
commit
e0d1bfb4c1
@ -6667,6 +6667,15 @@ on-error <mode>
|
|||||||
|
|
||||||
See also the "check", "observe" and "error-limit".
|
See also the "check", "observe" and "error-limit".
|
||||||
|
|
||||||
|
on-marked-down <action>
|
||||||
|
Modify what occurs when a server is marked down.
|
||||||
|
Currently one action is available:
|
||||||
|
- shutdown-sessions: Shutdown peer sessions
|
||||||
|
|
||||||
|
Actions are disabled by default
|
||||||
|
|
||||||
|
Supported in default-server: Yes
|
||||||
|
|
||||||
port <port>
|
port <port>
|
||||||
Using the "port" parameter, it becomes possible to use a different port to
|
Using the "port" parameter, it becomes possible to use a different port to
|
||||||
send health-checks. On some servers, it may be desirable to dedicate a port
|
send health-checks. On some servers, it may be desirable to dedicate a port
|
||||||
|
@ -73,6 +73,12 @@ enum {
|
|||||||
HANA_ONERR_MARKDWN, /* Mark this server down, now! */
|
HANA_ONERR_MARKDWN, /* Mark this server down, now! */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
enum {
|
||||||
|
HANA_ONMARKEDDOWN_NONE = 0,
|
||||||
|
|
||||||
|
HANA_ONMARKEDDOWN_SHUTDOWNSESSIONS, /* Shutdown peer sessions */
|
||||||
|
};
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
HANA_OBS_NONE = 0,
|
HANA_OBS_NONE = 0,
|
||||||
|
|
||||||
|
@ -125,6 +125,7 @@ struct server {
|
|||||||
int rise, fall; /* time in iterations */
|
int rise, fall; /* time in iterations */
|
||||||
int consecutive_errors_limit; /* number of consecutive errors that triggers an event */
|
int consecutive_errors_limit; /* number of consecutive errors that triggers an event */
|
||||||
short observe, onerror; /* observing mode: one of HANA_OBS_*; what to do on error: on of ANA_ONERR_* */
|
short observe, onerror; /* observing mode: one of HANA_OBS_*; what to do on error: on of ANA_ONERR_* */
|
||||||
|
short onmarkeddown; /* what to do when marked down: on of HANA_ONMARKEDDOWN_* */
|
||||||
int inter, fastinter, downinter; /* checks: time in milliseconds */
|
int inter, fastinter, downinter; /* checks: time in milliseconds */
|
||||||
int slowstart; /* slowstart time in seconds (ms in the conf) */
|
int slowstart; /* slowstart time in seconds (ms in the conf) */
|
||||||
int result; /* health-check result : SRV_CHK_* */
|
int result; /* health-check result : SRV_CHK_* */
|
||||||
|
@ -4251,6 +4251,18 @@ int cfg_parse_listen(const char *file, int linenum, char **args, int kwm)
|
|||||||
|
|
||||||
cur_arg += 2;
|
cur_arg += 2;
|
||||||
}
|
}
|
||||||
|
else if (!strcmp(args[cur_arg], "on-marked-down")) {
|
||||||
|
if (!strcmp(args[cur_arg + 1], "shutdown-sessions"))
|
||||||
|
newsrv->onmarkeddown = HANA_ONMARKEDDOWN_SHUTDOWNSESSIONS;
|
||||||
|
else {
|
||||||
|
Alert("parsing [%s:%d]: '%s' expects 'shutdown-sessions' but got '%s'\n",
|
||||||
|
file, linenum, args[cur_arg], args[cur_arg + 1]);
|
||||||
|
err_code |= ERR_ALERT | ERR_FATAL;
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
cur_arg += 2;
|
||||||
|
}
|
||||||
else if (!strcmp(args[cur_arg], "error-limit")) {
|
else if (!strcmp(args[cur_arg], "error-limit")) {
|
||||||
if (!*args[cur_arg + 1]) {
|
if (!*args[cur_arg + 1]) {
|
||||||
Alert("parsing [%s:%d]: '%s' expects an integer argument.\n",
|
Alert("parsing [%s:%d]: '%s' expects an integer argument.\n",
|
||||||
@ -4430,7 +4442,7 @@ int cfg_parse_listen(const char *file, int linenum, char **args, int kwm)
|
|||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
if (!defsrv)
|
if (!defsrv)
|
||||||
Alert("parsing [%s:%d] : server %s only supports options 'backup', 'cookie', 'redir', 'observer', 'on-error', 'error-limit', 'check', 'disabled', 'track', 'id', 'inter', 'fastinter', 'downinter', 'rise', 'fall', 'addr', 'port', 'source', 'send-proxy', 'minconn', 'maxconn', 'maxqueue', 'slowstart' and 'weight'.\n",
|
Alert("parsing [%s:%d] : server %s only supports options 'backup', 'cookie', 'redir', 'observer', 'on-error', 'on-marked-down', 'error-limit', 'check', 'disabled', 'track', 'id', 'inter', 'fastinter', 'downinter', 'rise', 'fall', 'addr', 'port', 'source', 'send-proxy', 'minconn', 'maxconn', 'maxqueue', 'slowstart' and 'weight'.\n",
|
||||||
file, linenum, newsrv->id);
|
file, linenum, newsrv->id);
|
||||||
else
|
else
|
||||||
Alert("parsing [%s:%d]: default-server only supports options 'on-error', 'error-limit', 'inter', 'fastinter', 'downinter', 'rise', 'fall', 'port', 'minconn', 'maxconn', 'maxqueue', 'slowstart' and 'weight'.\n",
|
Alert("parsing [%s:%d]: default-server only supports options 'on-error', 'error-limit', 'inter', 'fastinter', 'downinter', 'rise', 'fall', 'port', 'minconn', 'maxconn', 'maxqueue', 'slowstart' and 'weight'.\n",
|
||||||
|
22
src/checks.c
22
src/checks.c
@ -45,6 +45,7 @@
|
|||||||
#include <proto/proto_tcp.h>
|
#include <proto/proto_tcp.h>
|
||||||
#include <proto/proxy.h>
|
#include <proto/proxy.h>
|
||||||
#include <proto/server.h>
|
#include <proto/server.h>
|
||||||
|
#include <proto/session.h>
|
||||||
#include <proto/stream_interface.h>
|
#include <proto/stream_interface.h>
|
||||||
#include <proto/task.h>
|
#include <proto/task.h>
|
||||||
|
|
||||||
@ -357,6 +358,24 @@ static int check_for_pending(struct server *s)
|
|||||||
return xferred;
|
return xferred;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Shutdown connections when their server goes down.
|
||||||
|
*/
|
||||||
|
static void shutdown_sessions(struct server *srv)
|
||||||
|
{
|
||||||
|
struct session *session, *session_bck;
|
||||||
|
|
||||||
|
list_for_each_entry_safe(session, session_bck,
|
||||||
|
&srv->actconns, by_srv) {
|
||||||
|
if (session->srv_conn == srv &&
|
||||||
|
!(session->req->flags & (BF_SHUTW|BF_SHUTW_NOW))) {
|
||||||
|
buffer_shutw_now(session->req);
|
||||||
|
buffer_shutr_now(session->rep);
|
||||||
|
session->task->nice = 1024;
|
||||||
|
task_wakeup(session->task, TASK_WOKEN_OTHER);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* Sets server <s> down, notifies by all available means, recounts the
|
/* Sets server <s> down, notifies by all available means, recounts the
|
||||||
* remaining servers on the proxy and transfers queued sessions whenever
|
* remaining servers on the proxy and transfers queued sessions whenever
|
||||||
* possible to other servers. It automatically recomputes the number of
|
* possible to other servers. It automatically recomputes the number of
|
||||||
@ -380,6 +399,9 @@ void set_server_down(struct server *s)
|
|||||||
s->state &= ~(SRV_RUNNING | SRV_GOINGDOWN);
|
s->state &= ~(SRV_RUNNING | SRV_GOINGDOWN);
|
||||||
s->proxy->lbprm.set_server_status_down(s);
|
s->proxy->lbprm.set_server_status_down(s);
|
||||||
|
|
||||||
|
if (s->onmarkeddown & HANA_ONMARKEDDOWN_SHUTDOWNSESSIONS)
|
||||||
|
shutdown_sessions(s);
|
||||||
|
|
||||||
/* we might have sessions queued on this server and waiting for
|
/* we might have sessions queued on this server and waiting for
|
||||||
* a connection. Those which are redispatchable will be queued
|
* a connection. Those which are redispatchable will be queued
|
||||||
* to another server or to the proxy itself.
|
* to another server or to the proxy itself.
|
||||||
|
Loading…
Reference in New Issue
Block a user