aboutsummaryrefslogtreecommitdiff
path: root/src/http/ngx_http_upstream.c
diff options
context:
space:
mode:
authorMaxim Dounin <mdounin@mdounin.ru>2017-03-28 18:15:41 +0300
committerMaxim Dounin <mdounin@mdounin.ru>2017-03-28 18:15:41 +0300
commita450865b5adc377f9fd9ca2bf082c34760de408f (patch)
treee63a9598fb093ba8f44b32b1e0123dadb51baed6 /src/http/ngx_http_upstream.c
parentff33d9fa55afa10674b60d4b36af1410c6870015 (diff)
downloadnginx-a450865b5adc377f9fd9ca2bf082c34760de408f.tar.gz
nginx-a450865b5adc377f9fd9ca2bf082c34760de408f.zip
Threads: fixed request hang with aio_write and subrequests.
If the subrequest is already finalized, the handler set with aio_write may still be used by sendfile in threads when using range requests (see also e4c1f5b32868, and the original note in 9fd738b85fad). Calling already finalized subrequest's r->write_event_handler in practice results in request hang in some cases. Fix is to trigger connection event handler if the subrequest was already finalized.
Diffstat (limited to 'src/http/ngx_http_upstream.c')
-rw-r--r--src/http/ngx_http_upstream.c14
1 files changed, 12 insertions, 2 deletions
diff --git a/src/http/ngx_http_upstream.c b/src/http/ngx_http_upstream.c
index 14046935f..2725984c4 100644
--- a/src/http/ngx_http_upstream.c
+++ b/src/http/ngx_http_upstream.c
@@ -3736,9 +3736,19 @@ ngx_http_upstream_thread_event_handler(ngx_event_t *ev)
r->main->blocked--;
r->aio = 0;
- r->write_event_handler(r);
+ if (r->done) {
+ /*
+ * trigger connection event handler if the subrequest was
+ * already finalized; this can happen if the handler is used
+ * for sendfile() in threads
+ */
- ngx_http_run_posted_requests(c);
+ c->write->handler(c->write);
+
+ } else {
+ r->write_event_handler(r);
+ ngx_http_run_posted_requests(c);
+ }
}
#endif