summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristopher Faulet <cfaulet@haproxy.com>2023-05-09 16:31:01 +0200
committerChristopher Faulet <cfaulet@haproxy.com>2023-05-09 16:36:45 +0200
commita236c582236e835070e422eefe67db737caa5cdc (patch)
treec774d256611635e28c0348c77cd5317543ecdcfa
parent557146ccc89f7370ec5f41272aa1fcdc78b55f18 (diff)
downloadhaproxy-a236c582236e835070e422eefe67db737caa5cdc.tar.gz
BUG/MEDIUM: stats: Require more room if buffer is almost full
This was lost with commit f4258bdf3 ("MINOR: stats: Use the applet API to write data"). When the buffer is almost full, the stats applet gives up. When this happens, the applet must require more room. Otherwise, data in the channel buffer are sent to the client but the applet is not woken up in return. It is a 2.8-specific bug, no backport needed.
-rw-r--r--src/stats.c16
1 files changed, 12 insertions, 4 deletions
diff --git a/src/stats.c b/src/stats.c
index 0f2e027c1..dae6921fc 100644
--- a/src/stats.c
+++ b/src/stats.c
@@ -3228,12 +3228,16 @@ more:
/* obj2 points to listeners list as initialized above */
for (; ctx->obj2 != &px->conf.listeners; ctx->obj2 = l->by_fe.n) {
if (htx) {
- if (htx_almost_full(htx))
+ if (htx_almost_full(htx)) {
+ sc_need_room(sc, htx->size / 2);
goto full;
+ }
}
else {
- if (buffer_almost_full(&rep->buf))
+ if (buffer_almost_full(&rep->buf)) {
+ sc_need_room(sc, b_size(&rep->buf) / 2);
goto full;
+ }
}
l = LIST_ELEM(ctx->obj2, struct listener *, by_fe);
@@ -3294,12 +3298,16 @@ more:
srv_take(sv);
if (htx) {
- if (htx_almost_full(htx))
+ if (htx_almost_full(htx)) {
+ sc_need_room(sc, htx->size / 2);
goto full;
+ }
}
else {
- if (buffer_almost_full(&rep->buf))
+ if (buffer_almost_full(&rep->buf)) {
+ sc_need_room(sc, b_size(&rep->buf) / 2);
goto full;
+ }
}
if (ctx->flags & STAT_BOUND) {