From f8130b2de25f51bd950a33344f94ed19f3df8b35 Mon Sep 17 00:00:00 2001 From: Christopher Faulet Date: Fri, 31 Mar 2023 10:11:39 +0200 Subject: [PATCH] MEDIUM: cache: Use the sedesc to report and detect end of processing We now try, as far as possible, to rely on the SE descriptor to detect end of processing. Idea is to no longer rely on the channel or the SC to do so. First, we now set SE_FL_EOS instead of calling and cf_shutr() to report the end of the stream. It happens when the response is fully sent (SE_FL_EOI is already set in this case) or when an error is reported. In this last case, SE_FL_ERROR is also set. Thanks to this change, it is now possible to detect the applet must only consume the request waiting for the upper layer releases it. So, if SE_FL_EOS or SE_FL_ERROR are set, it means the reponse was fully handled. And if SE_FL_SHR or SE_FL_SHW are set, it means the applet was released by upper layer and is waiting to be freed. --- src/cache.c | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/src/cache.c b/src/cache.c index 36ecf18..39e9478 100644 --- a/src/cache.c +++ b/src/cache.c @@ -1466,7 +1466,7 @@ static void http_cache_io_handler(struct appctx *appctx) res_htx = htx_from_buf(&res->buf); total = res_htx->data; - if (unlikely(sc->state == SC_ST_DIS || sc->state == SC_ST_CLO)) + if (unlikely(se_fl_test(appctx->sedesc, (SE_FL_EOS|SE_FL_ERROR|SE_FL_SHR|SE_FL_SHW)))) goto out; /* Check if the input buffer is available. */ @@ -1475,9 +1475,6 @@ static void http_cache_io_handler(struct appctx *appctx) goto out; } - if (res->flags & (CF_SHUTW|CF_SHUTR|CF_SHUTW_NOW)) - appctx->st0 = HTX_CACHE_END; - if (appctx->st0 == HTX_CACHE_INIT) { ctx->next = block_ptr(cache_ptr); ctx->offset = sizeof(*cache_ptr); @@ -1531,8 +1528,8 @@ static void http_cache_io_handler(struct appctx *appctx) } end: - if (!(res->flags & CF_SHUTR) && appctx->st0 == HTX_CACHE_END) - sc_shutr(sc); + if (appctx->st0 == HTX_CACHE_END) + se_fl_set(appctx->sedesc, SE_FL_EOS); out: total = res_htx->data - total; @@ -1557,6 +1554,7 @@ static void http_cache_io_handler(struct appctx *appctx) res_htx = htx_from_buf(&res->buf); total = 0; + se_fl_set(appctx->sedesc, SE_FL_ERROR); appctx->st0 = HTX_CACHE_END; goto end; } -- 1.7.10.4