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.
This commit is contained in:
Willy Tarreau 2019-07-18 10:41:36 +02:00
parent 45726fd458
commit 8280ea97a0
3 changed files with 10 additions and 10 deletions

View File

@ -25,12 +25,13 @@
#include <stdlib.h>
#include <common/config.h>
#include <common/memory.h>
#include <common/mini-clist.h>
#include <types/applet.h>
#include <proto/connection.h>
#include <proto/task.h>
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. <applet> is assigned as the applet, but it can be NULL.
* appctx_free(). <applet> 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);
}

View File

@ -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);

View File

@ -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
* <appctx> is woken up if an input buffer was requested for the associated
* stream interface. In this case the buffer is immediately allocated and the