Welcome! Log In Create A New Profile

Advanced

[nginx] Upstream: fixed error handling of stale and revalidated cache send.

Sergey Kandaurov
October 09, 2017 06:28PM
details: http://hg.nginx.org/nginx/rev/77fe752b4586
branches:
changeset: 7126:77fe752b4586
user: Sergey Kandaurov <pluknet@nginx.com>
date: Tue Oct 10 01:04:54 2017 +0300
description:
Upstream: fixed error handling of stale and revalidated cache send.

The NGX_DONE value returned from ngx_http_upstream_cache_send() indicates
that upstream was already finalized in ngx_http_upstream_process_headers().
It was treated as a generic error which resulted in duplicate finalization.

Handled NGX_HTTP_UPSTREAM_INVALID_HEADER from ngx_http_upstream_cache_send().
Previously, it could return within ngx_http_upstream_finalize_request(), and
since it's below NGX_HTTP_SPECIAL_RESPONSE, a client connection could stuck.

diffstat:

src/http/ngx_http_upstream.c | 42 ++++++++++++++++++++++++++++++++++++------
1 files changed, 36 insertions(+), 6 deletions(-)

diffs (66 lines):

diff -r b8fc701daf8e -r 77fe752b4586 src/http/ngx_http_upstream.c
--- a/src/http/ngx_http_upstream.c Mon Oct 09 15:59:10 2017 +0300
+++ b/src/http/ngx_http_upstream.c Tue Oct 10 01:04:54 2017 +0300
@@ -2404,9 +2404,20 @@ ngx_http_upstream_test_next(ngx_http_req

rc = u->reinit_request(r);

- if (rc == NGX_OK) {
- u->cache_status = NGX_HTTP_CACHE_STALE;
- rc = ngx_http_upstream_cache_send(r, u);
+ if (rc != NGX_OK) {
+ ngx_http_upstream_finalize_request(r, u, rc);
+ return NGX_OK;
+ }
+
+ u->cache_status = NGX_HTTP_CACHE_STALE;
+ rc = ngx_http_upstream_cache_send(r, u);
+
+ if (rc == NGX_DONE) {
+ return NGX_OK;
+ }
+
+ if (rc == NGX_HTTP_UPSTREAM_INVALID_HEADER) {
+ rc = NGX_HTTP_INTERNAL_SERVER_ERROR;
}

ngx_http_upstream_finalize_request(r, u, rc);
@@ -2444,6 +2455,14 @@ ngx_http_upstream_test_next(ngx_http_req
u->cache_status = NGX_HTTP_CACHE_REVALIDATED;
rc = ngx_http_upstream_cache_send(r, u);

+ if (rc == NGX_DONE) {
+ return NGX_OK;
+ }
+
+ if (rc == NGX_HTTP_UPSTREAM_INVALID_HEADER) {
+ rc = NGX_HTTP_INTERNAL_SERVER_ERROR;
+ }
+
if (valid == 0) {
valid = r->cache->valid_sec;
updating = r->cache->updating_sec;
@@ -4150,9 +4169,20 @@ ngx_http_upstream_next(ngx_http_request_

rc = u->reinit_request(r);

- if (rc == NGX_OK) {
- u->cache_status = NGX_HTTP_CACHE_STALE;
- rc = ngx_http_upstream_cache_send(r, u);
+ if (rc != NGX_OK) {
+ ngx_http_upstream_finalize_request(r, u, rc);
+ return;
+ }
+
+ u->cache_status = NGX_HTTP_CACHE_STALE;
+ rc = ngx_http_upstream_cache_send(r, u);
+
+ if (rc == NGX_DONE) {
+ return;
+ }
+
+ if (rc == NGX_HTTP_UPSTREAM_INVALID_HEADER) {
+ rc = NGX_HTTP_INTERNAL_SERVER_ERROR;
}

ngx_http_upstream_finalize_request(r, u, rc);
_______________________________________________
nginx-devel mailing list
nginx-devel@nginx.org
http://mailman.nginx.org/mailman/listinfo/nginx-devel
Subject Author Views Posted

[nginx] Upstream: fixed error handling of stale and revalidated cache send.

Sergey Kandaurov 281 October 09, 2017 06:28PM



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

Online Users

Guests: 72
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