Mercurial > hg > nginx
diff src/http/ngx_http_upstream.c @ 8942:5c86189a1c1b quic
Merged with the default branch.
author | Ruslan Ermilov <ru@nginx.com> |
---|---|
date | Fri, 24 Dec 2021 15:53:59 +0300 |
parents | 33226ac61076 a7a77549265e |
children | 8d0753760546 |
line wrap: on
line diff
--- a/src/http/ngx_http_upstream.c +++ b/src/http/ngx_http_upstream.c @@ -3867,6 +3867,7 @@ ngx_http_upstream_thread_handler(ngx_thr { ngx_str_t name; ngx_event_pipe_t *p; + ngx_connection_t *c; ngx_thread_pool_t *tp; ngx_http_request_t *r; ngx_http_core_loc_conf_t *clcf; @@ -3874,6 +3875,27 @@ ngx_http_upstream_thread_handler(ngx_thr r = file->thread_ctx; p = r->upstream->pipe; + if (r->aio) { + /* + * tolerate sendfile() calls if another operation is already + * running; this can happen due to subrequests, multiple calls + * of the next body filter from a filter, or in HTTP/2 due to + * a write event on the main connection + */ + + c = r->connection; + +#if (NGX_HTTP_V2) + if (r->stream) { + c = r->stream->connection->connection; + } +#endif + + if (task == c->sendfile_task) { + return NGX_OK; + } + } + clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module); tp = clcf->thread_pool; @@ -3925,6 +3947,20 @@ ngx_http_upstream_thread_event_handler(n r->main->blocked--; r->aio = 0; +#if (NGX_HTTP_V2) + + if (r->stream) { + /* + * for HTTP/2, update write event to make sure processing will + * reach the main connection to handle sendfile() in threads + */ + + c->write->ready = 1; + c->write->active = 0; + } + +#endif + if (r->done) { /* * trigger connection event handler if the subrequest was