From e0d1bfb4c1136c1f7087ffe24bf0ae4c2f3f79f8 Mon Sep 17 00:00:00 2001 From: Simon Horman Date: Tue, 21 Jun 2011 14:34:58 +0900 Subject: [PATCH] [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. --- doc/configuration.txt | 9 +++++++++ include/types/checks.h | 6 ++++++ include/types/server.h | 1 + src/cfgparse.c | 14 +++++++++++++- src/checks.c | 22 ++++++++++++++++++++++ 5 files changed, 51 insertions(+), 1 deletion(-) diff --git a/doc/configuration.txt b/doc/configuration.txt index f35971fa7c..f397f411c6 100644 --- a/doc/configuration.txt +++ b/doc/configuration.txt @@ -6667,6 +6667,15 @@ on-error See also the "check", "observe" and "error-limit". +on-marked-down + 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 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 diff --git a/include/types/checks.h b/include/types/checks.h index 75e32b6b4b..a41463062f 100644 --- a/include/types/checks.h +++ b/include/types/checks.h @@ -73,6 +73,12 @@ enum { HANA_ONERR_MARKDWN, /* Mark this server down, now! */ }; +enum { + HANA_ONMARKEDDOWN_NONE = 0, + + HANA_ONMARKEDDOWN_SHUTDOWNSESSIONS, /* Shutdown peer sessions */ +}; + enum { HANA_OBS_NONE = 0, diff --git a/include/types/server.h b/include/types/server.h index cf0a0df06a..1a9d60d327 100644 --- a/include/types/server.h +++ b/include/types/server.h @@ -125,6 +125,7 @@ struct server { int rise, fall; /* time in iterations */ 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 onmarkeddown; /* what to do when marked down: on of HANA_ONMARKEDDOWN_* */ int inter, fastinter, downinter; /* checks: time in milliseconds */ int slowstart; /* slowstart time in seconds (ms in the conf) */ int result; /* health-check result : SRV_CHK_* */ diff --git a/src/cfgparse.c b/src/cfgparse.c index cd05d83807..7b46df0bf2 100644 --- a/src/cfgparse.c +++ b/src/cfgparse.c @@ -4251,6 +4251,18 @@ stats_error_parsing: 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")) { if (!*args[cur_arg + 1]) { Alert("parsing [%s:%d]: '%s' expects an integer argument.\n", @@ -4430,7 +4442,7 @@ stats_error_parsing: } else { 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); 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", diff --git a/src/checks.c b/src/checks.c index 82aceaaa2b..6b34a377be 100644 --- a/src/checks.c +++ b/src/checks.c @@ -45,6 +45,7 @@ #include #include #include +#include #include #include @@ -357,6 +358,24 @@ static int check_for_pending(struct server *s) 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 down, notifies by all available means, recounts the * remaining servers on the proxy and transfers queued sessions whenever * 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->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 * a connection. Those which are redispatchable will be queued * to another server or to the proxy itself. -- 2.39.5