From: Christopher Faulet Date: Thu, 24 Apr 2025 13:48:57 +0000 (+0200) Subject: MINOR: cache: Add a pointer on the cache in the cache applet context X-Git-Tag: v3.2-dev12~16 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=e05074f632e017bb424cb05d20246adbc63bccb5;p=thirdparty%2Fhaproxy.git MINOR: cache: Add a pointer on the cache in the cache applet context Thanks to this change, when a response is delivered from the cache, it is no longer necessary to get the cache filter configuration from the http "use-cache" rule saved in the appctx to get the currently used cache. It was a bit complex to get an info that can be directly and naturally stored in the cache applet context. --- diff --git a/src/cache.c b/src/cache.c index d4d74d3a4..c2b374933 100644 --- a/src/cache.c +++ b/src/cache.c @@ -70,6 +70,7 @@ struct cache { /* the appctx context of a cache applet, stored in appctx->svcctx */ struct cache_appctx { + struct cache *cache; struct cache_tree *cache_tree; struct cache_entry *entry; /* Entry to be sent from cache. */ unsigned int sent; /* The number of bytes already sent for this cache entry. */ @@ -1464,10 +1465,8 @@ out: static void http_cache_applet_release(struct appctx *appctx) { struct cache_appctx *ctx = appctx->svcctx; - struct cache_flt_conf *cconf = appctx->rule->arg.act.p[0]; struct cache_entry *cache_ptr = ctx->entry; - struct cache *cache = cconf->c.cache; - struct shared_context *shctx = shctx_ptr(cache); + struct shared_context *shctx = shctx_ptr(ctx->cache); struct shared_block *first = block_ptr(cache_ptr); release_entry(ctx->cache_tree, cache_ptr, 1); @@ -1482,8 +1481,7 @@ static unsigned int htx_cache_dump_blk(struct appctx *appctx, struct htx *htx, e uint32_t info, struct shared_block *shblk, unsigned int offset) { struct cache_appctx *ctx = appctx->svcctx; - struct cache_flt_conf *cconf = appctx->rule->arg.act.p[0]; - struct shared_context *shctx = shctx_ptr(cconf->c.cache); + struct shared_context *shctx = shctx_ptr(ctx->cache); struct htx_blk *blk; char *ptr; unsigned int max, total; @@ -1527,8 +1525,7 @@ static unsigned int htx_cache_dump_data_blk(struct appctx *appctx, struct htx *h uint32_t info, struct shared_block *shblk, unsigned int offset) { struct cache_appctx *ctx = appctx->svcctx; - struct cache_flt_conf *cconf = appctx->rule->arg.act.p[0]; - struct shared_context *shctx = shctx_ptr(cconf->c.cache); + struct shared_context *shctx = shctx_ptr(ctx->cache); unsigned int max, total, rem_data, data_len; uint32_t blksz; @@ -1580,8 +1577,7 @@ static size_t htx_cache_dump_msg(struct appctx *appctx, struct htx *htx, unsigne enum htx_blk_type mark) { struct cache_appctx *ctx = appctx->svcctx; - struct cache_flt_conf *cconf = appctx->rule->arg.act.p[0]; - struct shared_context *shctx = shctx_ptr(cconf->c.cache); + struct shared_context *shctx = shctx_ptr(ctx->cache); struct shared_block *shblk; unsigned int offset, sz; unsigned int ret, total = 0; @@ -1633,8 +1629,7 @@ static unsigned int ff_cache_dump_data_blk(struct appctx *appctx, struct buffer uint32_t info, struct shared_block *shblk, unsigned int offset) { struct cache_appctx *ctx = appctx->svcctx; - struct cache_flt_conf *cconf = appctx->rule->arg.act.p[0]; - struct shared_context *shctx = shctx_ptr(cconf->c.cache); + struct shared_context *shctx = shctx_ptr(ctx->cache); unsigned int total, rem_data, data_len; uint32_t blksz; @@ -1682,8 +1677,7 @@ static size_t ff_cache_dump_msg(struct appctx *appctx, struct buffer *buf, unsig struct cache_appctx *ctx = appctx->svcctx; struct cache_entry *cache_ptr = ctx->entry; struct shared_block *first = block_ptr(cache_ptr); - struct cache_flt_conf *cconf = appctx->rule->arg.act.p[0]; - struct shared_context *shctx = shctx_ptr(cconf->c.cache); + struct shared_context *shctx = shctx_ptr(ctx->cache); struct shared_block *shblk; unsigned int offset, sz; unsigned int ret, total = 0; @@ -2219,7 +2213,7 @@ enum act_return http_action_req_cache_use(struct act_rule *rule, struct proxy *p struct cache_appctx *ctx = applet_reserve_svcctx(appctx, sizeof(*ctx)); appctx->st0 = HTX_CACHE_INIT; - appctx->rule = rule; + ctx->cache = cache; ctx->cache_tree = cache_tree; ctx->entry = res; ctx->next = NULL; @@ -3082,25 +3076,19 @@ smp_fetch_res_cache_name(const struct arg *args, struct sample *smp, { struct appctx *appctx = NULL; - struct cache_flt_conf *cconf = NULL; - struct cache *cache = NULL; - if (!smp->strm || smp->strm->target != &http_cache_applet.obj_type) return 0; /* Get appctx from the stream connector. */ appctx = sc_appctx(smp->strm->scb); - if (appctx && appctx->rule) { - cconf = appctx->rule->arg.act.p[0]; - if (cconf) { - cache = cconf->c.cache; - - smp->data.type = SMP_T_STR; - smp->flags = SMP_F_CONST; - smp->data.u.str.area = cache->id; - smp->data.u.str.data = strlen(cache->id); - return 1; - } + if (appctx) { + struct cache_appctx *ctx = appctx->svcctx; + + smp->data.type = SMP_T_STR; + smp->flags = SMP_F_CONST; + smp->data.u.str.area = ctx->cache->id; + smp->data.u.str.data = strlen(ctx->cache->id); + return 1; } return 0;