]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
[MEDIUM] stats: offer the possibility to kill sessions by server
authorWilly Tarreau <w@1wt.eu>
Wed, 7 Sep 2011 21:48:48 +0000 (23:48 +0200)
committerWilly Tarreau <w@1wt.eu>
Wed, 7 Sep 2011 21:56:16 +0000 (23:56 +0200)
It's now possible to issue "shutdown sessions server <back/srv>" and have
all this server's sessions immediately killed.

doc/configuration.txt
src/dumpstats.c

index a1fa9baf57bc7581b32cefc4022119a80d027b3e..c5b7c61431637b0fdd8293023586b1b792b70688 100644 (file)
@@ -9838,6 +9838,12 @@ shutdown session <id>
   endless transfer is ongoing. Such terminated sessions are reported with a 'K'
   flag in the logs.
 
+shutdown sessions <backend>/<server>
+  Immediately terminate all the sessions attached to the specified server. This
+  can be used to terminate long-running sessions after a server is put into
+  maintenance mode, for instance. Such terminated sessions are reported with a
+  'K' flag in the logs.
+
 /*
  * Local variables:
  *  fill-column: 79
index 1e49dc7708fca9ed0c937f9fbb2b798940c68287..5dcd8c4b7285b39a6ce3e21732fc7d14e4ba8968 100644 (file)
@@ -1313,8 +1313,30 @@ static int stats_sock_parse_request(struct stream_interface *si, char *line)
                        session_shutdown(sess, SN_ERR_KILLED);
                        return 1;
                }
+               else if (strcmp(args[1], "sessions") == 0) {
+                       if (strcmp(args[2], "server") == 0) {
+                               struct server *sv;
+                               struct session *sess, *sess_bck;
+
+                               sv = expect_server_admin(s, si, args[3]);
+                               if (!sv)
+                                       return 1;
+
+                               /* kill all the session that are on this server */
+                               list_for_each_entry_safe(sess, sess_bck, &sv->actconns, by_srv)
+                                       if (sess->srv_conn == sv)
+                                               session_shutdown(sess, SN_ERR_KILLED);
+
+                               return 1;
+                       }
+                       else {
+                               si->applet.ctx.cli.msg = "'shutdown sessions' only supports 'server'.\n";
+                               si->applet.st0 = STAT_CLI_PRINT;
+                               return 1;
+                       }
+               }
                else { /* unknown "disable" parameter */
-                       si->applet.ctx.cli.msg = "'shutdown' only supports 'frontend' and 'session'.\n";
+                       si->applet.ctx.cli.msg = "'shutdown' only supports 'frontend', 'session' and 'sessions'.\n";
                        si->applet.st0 = STAT_CLI_PRINT;
                        return 1;
                }