From ac57bb527af05c0eb5b71b0f10ba8b4a4eedd2fd Mon Sep 17 00:00:00 2001 From: Christopher Faulet Date: Mon, 9 May 2022 08:08:26 +0200 Subject: [PATCH] MINOR: applet: Prepare appctx to own the session on frontend side Applets were moved at the same level than multiplexers. Thus, gradually, applets code is changed to be less dependent from the stream. With this commit, the frontend appctx are ready to own the session. It means a frontend appctx will be responsible to release the session. --- include/haproxy/applet-t.h | 2 ++ include/haproxy/applet.h | 4 +++- src/applet.c | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/include/haproxy/applet-t.h b/include/haproxy/applet-t.h index e7823e136..2784650d9 100644 --- a/include/haproxy/applet-t.h +++ b/include/haproxy/applet-t.h @@ -39,6 +39,7 @@ struct appctx; struct proxy; struct conn_stream; struct cs_endpoint; +struct session; /* Applet descriptor */ struct applet { @@ -61,6 +62,7 @@ struct appctx { unsigned int st1; /* prompt/payload (bitwise OR of APPCTX_CLI_ST1_*) for stats, session error for peers */ struct buffer *chunk; /* used to store unfinished commands */ struct applet *applet; /* applet this context refers to */ + struct session *sess; /* session for frontend applets (NULL for backend applets) */ struct cs_endpoint *endp; struct act_rule *rule; /* rule associated with the applet. */ int (*io_handler)(struct appctx *appctx); /* used within the cli_io_handler when st0 = CLI_ST_CALLBACK */ diff --git a/include/haproxy/applet.h b/include/haproxy/applet.h index 185c1c19c..2ee368b83 100644 --- a/include/haproxy/applet.h +++ b/include/haproxy/applet.h @@ -29,6 +29,7 @@ #include #include #include +#include #include extern unsigned int nb_applets; @@ -47,7 +48,8 @@ static inline void __appctx_free(struct appctx *appctx) task_destroy(appctx->t); if (LIST_INLIST(&appctx->buffer_wait.list)) LIST_DEL_INIT(&appctx->buffer_wait.list); - + if (appctx->sess) + session_free(appctx->sess); BUG_ON(appctx->endp && !(appctx->endp->flags & CS_EP_ORPHAN)); cs_endpoint_free(appctx->endp); pool_free(pool_head_appctx, appctx); diff --git a/src/applet.c b/src/applet.c index 9e15c7eb7..b7711b1bd 100644 --- a/src/applet.c +++ b/src/applet.c @@ -42,7 +42,7 @@ struct appctx *appctx_new(struct applet *applet, struct cs_endpoint *endp) LIST_INIT(&appctx->wait_entry); appctx->obj_type = OBJ_TYPE_APPCTX; appctx->applet = applet; - + appctx->sess = NULL; if (!endp) { endp = cs_endpoint_new(); if (!endp)