CLEANUP: cache/cli: make use of a locally defined context for "show cache"

The command uses a pointer to a cache instance and the next key to dump,
they were in cli.p0/i0 respectively, let's move them to a struct
show_cache_ctx.
This commit is contained in:
Willy Tarreau 2022-05-05 16:46:13 +02:00
parent 12d5228a44
commit c6dfef7a0b

View File

@ -15,6 +15,7 @@
#include <haproxy/action-t.h>
#include <haproxy/api.h>
#include <haproxy/applet.h>
#include <haproxy/cfgparse.h>
#include <haproxy/channel.h>
#include <haproxy/cli.h>
@ -65,6 +66,12 @@ struct cache_flt_conf {
unsigned int flags; /* CACHE_FLT_F_* */
};
/* CLI context used during "show cache" */
struct show_cache_ctx {
struct cache *cache;
uint next_key;
};
/*
* Vary-related structures and functions
@ -2556,30 +2563,32 @@ parse_cache_flt(char **args, int *cur_arg, struct proxy *px,
return -1;
}
/* It reserves a struct show_cache_ctx for the local variables */
static int cli_parse_show_cache(char **args, char *payload, struct appctx *appctx, void *private)
{
struct show_cache_ctx *ctx = applet_reserve_svcctx(appctx, sizeof(*ctx));
if (!cli_has_level(appctx, ACCESS_LVL_ADMIN))
return 1;
ctx->cache = LIST_ELEM((caches).n, typeof(struct cache *), list);
return 0;
}
/* It uses a struct show_cache_ctx for the local variables */
static int cli_io_handler_show_cache(struct appctx *appctx)
{
struct cache* cache = appctx->ctx.cli.p0;
struct show_cache_ctx *ctx = appctx->svcctx;
struct cache* cache = ctx->cache;
struct conn_stream *cs = appctx->owner;
if (cache == NULL) {
cache = LIST_ELEM((caches).n, typeof(struct cache *), list);
}
list_for_each_entry_from(cache, &caches, list) {
struct eb32_node *node = NULL;
unsigned int next_key;
struct cache_entry *entry;
unsigned int i;
next_key = appctx->ctx.cli.i0;
next_key = ctx->next_key;
if (!next_key) {
chunk_printf(&trash, "%p: %s (shctx:%p, available blocks:%d)\n", cache, cache->id, shctx_ptr(cache), shctx_ptr(cache)->nbav);
if (ci_putchk(cs_ic(cs), &trash) == -1) {
@ -2588,7 +2597,7 @@ static int cli_io_handler_show_cache(struct appctx *appctx)
}
}
appctx->ctx.cli.p0 = cache;
ctx->cache = cache;
while (1) {
@ -2596,7 +2605,7 @@ static int cli_io_handler_show_cache(struct appctx *appctx)
node = eb32_lookup_ge(&cache->entries, next_key);
if (!node) {
shctx_unlock(shctx_ptr(cache));
appctx->ctx.cli.i0 = 0;
ctx->next_key = 0;
break;
}
@ -2616,7 +2625,7 @@ static int cli_io_handler_show_cache(struct appctx *appctx)
entry->eb.key = 0;
}
appctx->ctx.cli.i0 = next_key;
ctx->next_key = next_key;
shctx_unlock(shctx_ptr(cache));