From ee7241ed1872dec9dbe14fb15083f840a2b6a40a Mon Sep 17 00:00:00 2001 From: Amaury Denoyelle Date: Thu, 7 Nov 2024 17:15:47 +0100 Subject: [PATCH] MINOR: stats: use stress mode to force reentrant dumps Provide alternative code during stats dump when stress mode is active. The objective is to force the applet to yield on every output line. This allows to easily test reentrant code paths, in particular while adding and removing server instances. To support this, output is interrupted every time the output buffer (or its equivalent) is not empty. Use COND_STRESS() macro to provide default and stress alternative conditions. --- src/stats.c | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/src/stats.c b/src/stats.c index 97efa938f..970895c4f 100644 --- a/src/stats.c +++ b/src/stats.c @@ -60,6 +60,7 @@ #include #include #include +#include #include #include #include @@ -231,7 +232,8 @@ int stats_putchk(struct appctx *appctx, struct buffer *buf, struct htx *htx) struct buffer *chk = &ctx->chunk; if (htx) { - if (b_data(chk) > htx_free_data_space(htx)) { + if (STRESS_RUN1(!htx_is_empty(htx), + b_data(chk) > htx_free_data_space(htx))) { applet_fl_set(appctx, APPCTX_FL_OUTBLK_FULL); return 0; } @@ -242,7 +244,7 @@ int stats_putchk(struct appctx *appctx, struct buffer *buf, struct htx *htx) chunk_reset(chk); } else if (buf) { - if (b_data(chk) > b_room(buf)) { + if (STRESS_RUN1(b_data(buf), b_data(chk) > b_room(buf))) { se_fl_set(appctx->sedesc, SE_FL_RCV_MORE | SE_FL_WANT_ROOM); return 0; } @@ -250,29 +252,31 @@ int stats_putchk(struct appctx *appctx, struct buffer *buf, struct htx *htx) chunk_reset(chk); } else { - if (applet_putchk(appctx, chk) == -1) + if (STRESS_RUN1(applet_putchk_stress(appctx, chk) == -1, + applet_putchk(appctx, chk) == -1)) { return 0; + } } return 1; } - int stats_is_full(struct appctx *appctx, struct buffer *buf, struct htx *htx) { if (htx) { - if (htx_almost_full(htx)) { + if (STRESS_RUN1(!htx_is_empty(htx), htx_almost_full(htx))) { applet_fl_set(appctx, APPCTX_FL_OUTBLK_FULL); goto full; } } else if (buf) { - if (buffer_almost_full(buf)) { + if (STRESS_RUN1(b_data(buf), buffer_almost_full(buf))) { se_fl_set(appctx->sedesc, SE_FL_RCV_MORE | SE_FL_WANT_ROOM); goto full; } } else { - if (buffer_almost_full(&appctx->outbuf)) { + if (STRESS_RUN1(b_data(&appctx->outbuf), + buffer_almost_full(&appctx->outbuf))) { applet_fl_set(appctx, APPCTX_FL_OUTBLK_FULL); goto full; }