MINOR: quic: add "clo" filter on show quic

Add a new filter "clo" for "show quic" command. Its purpose is to filter
output to only list closing frontend connections.
This commit is contained in:
Amaury Denoyelle
2025-11-24 14:58:55 +01:00
parent 49e6fca51b
commit 3685681373
2 changed files with 33 additions and 14 deletions

View File

@@ -3343,8 +3343,8 @@ show quic [<format>] [<filter>]
The final argument is used to restrict or extend the connection list. By
default, active frontend connections only are displayed. Use the extra
argument "all" to list all connections, including the ones in closing state.
It's also possible to restrict to a single connection by specifying its
argument "clo" to list instead closing frontend connections, or "all" for
both. It's also possible to restrict to a single connection by specifying its
hexadecimal address.
show servers conn [<backend>]

View File

@@ -39,7 +39,8 @@ struct show_quic_ctx {
int fields;
};
#define QC_CLI_FL_SHOW_ALL 0x1 /* show closing/draining connections */
#define QC_CLI_FL_SHOW_ALL 0x0001 /* show closing/draining connections */
#define QC_CLI_FL_SHOW_CLO 0x0002 /* show closing/draining connections */
/* Returns the output format for show quic. If specified explicitly use it as
* set. Else format depends if filtering on a single connection instance. If
@@ -94,6 +95,7 @@ static int cli_parse_show_quic(char **args, char *payload, struct appctx *appctx
" help display this help\n"
"Available output filters:\n"
" all dump all connections\n"
" clo dump frontend closing connections\n"
" <id> dump only the connection matching this identifier (0x...)\n"
"Without any argument, active frontend connections are dumped using the oneline format.\n");
return cli_err(appctx, trash.area);
@@ -162,6 +164,9 @@ static int cli_parse_show_quic(char **args, char *payload, struct appctx *appctx
else if (istmatch(istarg, ist("all"))) {
ctx->flags |= QC_CLI_FL_SHOW_ALL;
}
else if (istmatch(istarg, ist("clo"))) {
ctx->flags |= QC_CLI_FL_SHOW_CLO;
}
else {
cli_err(appctx, "Invalid argument, use 'help' for more options.\n");
return 1;
@@ -434,8 +439,18 @@ static void dump_quic_full(struct show_quic_ctx *ctx, struct quic_conn *qc)
chunk_appendf(&trash, "\n");
}
static inline struct list *cli_quic_get_list(int flags, int thr)
{
if (flags & QC_CLI_FL_SHOW_CLO)
return &ha_thread_ctx[thr].quic_conns_clo;
else
return &ha_thread_ctx[thr].quic_conns_fe;
}
static int cli_io_handler_dump_quic(struct appctx *appctx)
{
struct list *qc_list;
struct show_quic_ctx *ctx = appctx->svcctx;
struct quic_conn *qc;
@@ -452,7 +467,8 @@ static int cli_io_handler_dump_quic(struct appctx *appctx)
}
else if (!ctx->bref.ref) {
/* First invocation. */
ctx->bref.ref = ha_thread_ctx[ctx->thr].quic_conns_fe.n;
qc_list = cli_quic_get_list(ctx->flags, ctx->thr);
ctx->bref.ref = qc_list->n;
/* Print legend for oneline format. */
if (cli_show_quic_format(ctx) == QUIC_DUMP_FMT_ONELINE) {
@@ -470,25 +486,27 @@ static int cli_io_handler_dump_quic(struct appctx *appctx)
while (1) {
int done = 0;
if (ctx->bref.ref == &ha_thread_ctx[ctx->thr].quic_conns_fe) {
if (ctx->bref.ref == qc_list) {
/* If closing connections requested through "all" or a
* specific connection is filtered, move to
* quic_conns_clo list after browsing quic_conns. Else
* move directly to the next quic_conns thread.
*/
if (ctx->flags & QC_CLI_FL_SHOW_ALL || ctx->ptr) {
ctx->bref.ref = ha_thread_ctx[ctx->thr].quic_conns_clo.n;
if (ctx->bref.ref == &ha_thread_ctx[ctx->thr].quic_conns_clo) {
/* Closing list entirely browsed, go to next
* quic_conns thread.
*/
done = 1;
}
else if ((ctx->flags & QC_CLI_FL_SHOW_ALL) || ctx->ptr) {
if (ctx->bref.ref == &ha_thread_ctx[ctx->thr].quic_conns_fe)
qc_list = &ha_thread_ctx[ctx->thr].quic_conns_clo;
ctx->bref.ref = qc_list->n;
continue;
}
done = 1;
}
else if (ctx->bref.ref == &ha_thread_ctx[ctx->thr].quic_conns_clo) {
/* Closing list entirely browsed, go to next quic_conns
* thread.
*/
done = 1;
}
else {
/* Retrieve next element of the current list. */
qc = LIST_ELEM(ctx->bref.ref, struct quic_conn *, el_th_ctx);
@@ -505,7 +523,8 @@ static int cli_io_handler_dump_quic(struct appctx *appctx)
if (ctx->thr >= global.nbthread)
break;
/* Switch to next thread quic_conns list. */
ctx->bref.ref = ha_thread_ctx[ctx->thr].quic_conns_fe.n;
qc_list = cli_quic_get_list(ctx->flags, ctx->thr);
ctx->bref.ref = qc_list->n;
continue;
}