[PATCH] Upstream: ignore read-readiness if request wasn't sent
Maxim Dounin
mdounin at mdounin.ru
Thu Jun 8 16:19:50 UTC 2017
Hello!
On Sat, Jun 03, 2017 at 08:04:05PM -0700, Piotr Sikora via nginx-devel wrote:
> # HG changeset patch
> # User Piotr Sikora <piotrsikora at google.com>
> # Date 1491296505 25200
> # Tue Apr 04 02:01:45 2017 -0700
> # Node ID bff5ac3da350d8d9225d4204d8aded90fb670f3f
> # Parent 716852cce9136d977b81a2d1b8b6f9fbca0dce49
> Upstream: ignore read-readiness if request wasn't sent.
>
> Signed-off-by: Piotr Sikora <piotrsikora at google.com>
>
> diff -r 716852cce913 -r bff5ac3da350 src/http/ngx_http_upstream.c
> --- a/src/http/ngx_http_upstream.c
> +++ b/src/http/ngx_http_upstream.c
> @@ -2179,8 +2179,12 @@ ngx_http_upstream_process_header(ngx_htt
> return;
> }
>
> - if (!u->request_sent && ngx_http_upstream_test_connect(c) != NGX_OK) {
> - ngx_http_upstream_next(r, u, NGX_HTTP_UPSTREAM_FT_ERROR);
> + if (!u->request_sent) {
> + if (ngx_http_upstream_test_connect(c) != NGX_OK) {
> + ngx_http_upstream_next(r, u, NGX_HTTP_UPSTREAM_FT_ERROR);
> + return;
> + }
> +
> return;
> }
This change looks wrong, as
1) a response may happen to be received even before we've sent a
request - for example, the other side may simply close the
connection for its own reasons;
2) in the resulting code we return from a read event handler
without calling ngx_handle_read_event(), and this will result
in CPU hog when used with level-triggered events.
--
Maxim Dounin
http://nginx.org/
More information about the nginx-devel
mailing list