[PATCH] skip apply "ngx_http_upstream_process_accel_expires" when a request responeded by cache
Maxim Dounin
mdounin at mdounin.ru
Mon Jun 22 10:37:49 UTC 2020
Hello!
On Mon, Jun 22, 2020 at 05:09:16PM +0900, Sokichi Takada wrote:
> > The cache validity time as obtained from cached responses is used
> > while processing 304 responses during cache revalidation, so the
> > suggested change looks wrong to me.
>
> When processing 304 responses during cache revalidation,
> ngx_http_upstream_process_accel_expires is called twice.
>
> 1st time, in "ngx_http_upstream_process_header" function.
> src/http/ngx_http_upstream.c: 2387 rc = u->process_header(r);
> # process_header = ngx_http_upstream_process_accel_expires
>
> This calculates the exact valid_sec value by x-accel-expires of upstream's
> response, It doesn't use a value of the cache data.
> Also, the r->cached is 0 at this time.
>
> 2nd time, in "ngx_http_upstream_process_header" ->
> "ngx_http_upstream_test_next" -> "ngx_http_upstream_cache_send" function.
> src/http/ngx_http_upstream.c: 2423 if
> (ngx_http_upstream_test_next(r, u) == NGX_OK) ->
> src/http/ngx_http_upstream.c: 2535 rc =
> ngx_http_upstream_cache_send(r, u); ->
> src/http/ngx_http_upstream.c: 1073 rc = u->process_header(r);
>
> This calculates unnecessary valid_sec value by x-accel-expires of the cache
> data.
> Also, this calculation can skip by this patch since the r->cached is 1 at
> this time.
>
> Please look into ngx_http_upstream_test_next.
> It keeps the valid_sec value of 1st time into "valid" variable at "2523
> valid = r->cache->valid_sec;".
> After that, it "calls ngx_http_upstream_cache_send", then updates cache
> data with the "valid" variable at "2560 r->cache->valid_sec =
> valid;".
Backend is not required to return cache control headers along with
the 304 response. If it doesn't - nginx uses the headers returned
in the cached response.
--
Maxim Dounin
http://mdounin.ru/
More information about the nginx-devel
mailing list