From: Willy Tarreau Date: Thu, 18 Jul 2019 08:41:36 +0000 (+0200) Subject: MINOR: applet: make appctx use their own pool X-Git-Tag: v2.1-dev2~396 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=8280ea97a013ea7fd265da8d8c2e83e2e1324ef4;p=thirdparty%2Fhaproxy.git MINOR: applet: make appctx use their own pool A long time ago, applets were seen as an alternative to connections, and since their respective sizes were roughly equal it appeared wise to share the same pool. Nowadays, connections got significantly larger but applets are not that often used, except for the cache. However applets are mostly complementary and not alternatives anymore, as it's very possible not to have a back connection or to share one with other streams. The connections will soon lose their addresses and their size will shrink so much that appctx won't fit anymore. Given that the old benefits of sharing these pools have long disappeared, let's stop doing this and have a dedicated pool for appctx. --- diff --git a/include/proto/applet.h b/include/proto/applet.h index 62612b5546..b4e9396e0d 100644 --- a/include/proto/applet.h +++ b/include/proto/applet.h @@ -25,12 +25,13 @@ #include #include +#include #include #include -#include #include extern unsigned int nb_applets; +extern struct pool_head *pool_head_appctx; struct task *task_run_applet(struct task *t, void *context, unsigned short state); @@ -56,21 +57,20 @@ static inline void appctx_init(struct appctx *appctx, unsigned long thread_mask) /* Tries to allocate a new appctx and initialize its main fields. The appctx * is returned on success, NULL on failure. The appctx must be released using - * pool_free(connection) or appctx_free(), since it's allocated from the - * connection pool. is assigned as the applet, but it can be NULL. + * appctx_free(). is assigned as the applet, but it can be NULL. */ static inline struct appctx *appctx_new(struct applet *applet, unsigned long thread_mask) { struct appctx *appctx; - appctx = pool_alloc(pool_head_connection); + appctx = pool_alloc(pool_head_appctx); if (likely(appctx != NULL)) { appctx->obj_type = OBJ_TYPE_APPCTX; appctx->applet = applet; appctx_init(appctx, thread_mask); appctx->t = task_new(thread_mask); if (unlikely(appctx->t == NULL)) { - pool_free(pool_head_connection, appctx); + pool_free(pool_head_appctx, appctx); return NULL; } appctx->t->process = task_run_applet; @@ -83,9 +83,7 @@ static inline struct appctx *appctx_new(struct applet *applet, unsigned long thr return appctx; } -/* Releases an appctx previously allocated by appctx_new(). Note that - * we share the connection pool. - */ +/* Releases an appctx previously allocated by appctx_new(). */ static inline void __appctx_free(struct appctx *appctx) { task_destroy(appctx->t); @@ -96,7 +94,7 @@ static inline void __appctx_free(struct appctx *appctx) HA_SPIN_UNLOCK(BUF_WQ_LOCK, &buffer_wq_lock); } - pool_free(pool_head_connection, appctx); + pool_free(pool_head_appctx, appctx); _HA_ATOMIC_SUB(&nb_applets, 1); } diff --git a/include/proto/stream_interface.h b/include/proto/stream_interface.h index 63f1738bcc..6727921ebc 100644 --- a/include/proto/stream_interface.h +++ b/include/proto/stream_interface.h @@ -188,7 +188,7 @@ static inline void si_release_endpoint(struct stream_interface *si) else if ((appctx = objt_appctx(si->end))) { if (appctx->applet->release && !si_state_in(si->state, SI_SB_DIS|SI_SB_CLO)) appctx->applet->release(appctx); - appctx_free(appctx); /* we share the connection pool */ + appctx_free(appctx); } else if ((conn = objt_conn(si->end))) { conn_stop_tracking(conn); conn_full_close(conn); diff --git a/src/applet.c b/src/applet.c index 4832a748f4..f6cc08809b 100644 --- a/src/applet.c +++ b/src/applet.c @@ -23,6 +23,8 @@ unsigned int nb_applets = 0; +DECLARE_POOL(pool_head_appctx, "appctx", sizeof(struct appctx)); + /* Callback used to wake up an applet when a buffer is available. The applet * is woken up if an input buffer was requested for the associated * stream interface. In this case the buffer is immediately allocated and the