Welcome! Log In Create A New Profile

Advanced

[nginx] Upstream: background cache update before cache send (ticket #1782).

Roman Arutyunyan
June 04, 2019 04:58AM
details: https://hg.nginx.org/nginx/rev/319242d2ddc9
branches:
changeset: 7514:319242d2ddc9
user: Roman Arutyunyan <arut@nginx.com>
date: Mon Jun 03 20:33:26 2019 +0300
description:
Upstream: background cache update before cache send (ticket #1782).

In case of filter finalization, essential request fields like r->uri,
r->args etc could be changed, which affected the cache update subrequest.
Also, after filter finalization r->cache could be set to NULL, leading to
null pointer dereference in ngx_http_upstream_cache_background_update().
The fix is to create background cache update subrequest before sending the
cached response.

Since initial introduction in 1aeaae6e9446 (1.11.10) background cache update
subrequest was created after sending the cached response because otherwise it
blocked the parent request output. In 9552758a786e (1.13.1) background
subrequests were introduced to eliminate the delay before sending the final
part of the cached response. This also made it possible to create the
background cache update subrequest before sending the response.

Note that creating the subrequest earlier does not change the fact that in case
of filter finalization the background cache update subrequest will likely not
have enough time to successfully update the cache entry. Filter finalization
leads to the main request termination as soon the current iteration of request
processing is complete.

diffstat:

src/http/ngx_http_upstream.c | 19 ++++++++-----------
1 files changed, 8 insertions(+), 11 deletions(-)

diffs (43 lines):

diff -r d964b0aee8e7 -r 319242d2ddc9 src/http/ngx_http_upstream.c
--- a/src/http/ngx_http_upstream.c Thu May 23 16:49:22 2019 +0300
+++ b/src/http/ngx_http_upstream.c Mon Jun 03 20:33:26 2019 +0300
@@ -597,10 +597,6 @@ ngx_http_upstream_init_request(ngx_http_
u->cache_status = NGX_HTTP_CACHE_MISS;
u->request_sent = 1;
}
-
- if (ngx_http_upstream_cache_background_update(r, u) != NGX_OK) {
- rc = NGX_ERROR;
- }
}

if (rc != NGX_DECLINED) {
@@ -902,9 +898,14 @@ ngx_http_upstream_cache(ngx_http_request
|| c->stale_updating) && !r->background
&& u->conf->cache_background_update)
{
- r->cache->background = 1;
- u->cache_status = rc;
- rc = NGX_OK;
+ if (ngx_http_upstream_cache_background_update(r, u) == NGX_OK) {
+ r->cache->background = 1;
+ u->cache_status = rc;
+ rc = NGX_OK;
+
+ } else {
+ rc = NGX_ERROR;
+ }
}

break;
@@ -1106,10 +1107,6 @@ ngx_http_upstream_cache_background_updat
{
ngx_http_request_t *sr;

- if (!r->cached || !r->cache->background) {
- return NGX_OK;
- }
-
if (r == r->main) {
r->preserve_body = 1;
}
_______________________________________________
nginx-devel mailing list
nginx-devel@nginx.org
http://mailman.nginx.org/mailman/listinfo/nginx-devel
Subject Author Views Posted

[nginx] Upstream: background cache update before cache send (ticket #1782).

Roman Arutyunyan 89 June 04, 2019 04:58AM



Sorry, you do not have permission to post/reply in this forum.

Online Users

Guests: 70
Record Number of Users: 6 on February 13, 2018
Record Number of Guests: 421 on December 02, 2018
Powered by nginx      Powered by FreeBSD      PHP Powered      Powered by MariaDB      ipv6 ready