]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
MEDIUM: cache: Use the sedesc to report and detect end of processing
authorChristopher Faulet <cfaulet@haproxy.com>
Fri, 31 Mar 2023 08:11:39 +0000 (10:11 +0200)
committerChristopher Faulet <cfaulet@haproxy.com>
Wed, 5 Apr 2023 06:57:05 +0000 (08:57 +0200)
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

index 36ecf185aac3ee1ffa08ce198c405b300b1bae27..39e947820a75c6c1f1966b6afdb63385f32136b4 100644 (file)
@@ -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;
 }