Copy filter: wake up subrequests after aio operations.

Previously, connection write handler was called, resulting in wake up
of the active subrequest.  This change makes it possible to read data
in non-active subrequests as well.  For example, this allows SSI to
process instructions in non-active subrequests earlier and start
additional subrequests if needed, reducing overall response time.
This commit is contained in:
Maxim Dounin 2017-03-28 18:15:42 +03:00
parent a450865b5a
commit 1f76260583

View File

@ -187,15 +187,24 @@ static void
ngx_http_copy_aio_event_handler(ngx_event_t *ev) ngx_http_copy_aio_event_handler(ngx_event_t *ev)
{ {
ngx_event_aio_t *aio; ngx_event_aio_t *aio;
ngx_connection_t *c;
ngx_http_request_t *r; ngx_http_request_t *r;
aio = ev->data; aio = ev->data;
r = aio->data; r = aio->data;
c = r->connection;
ngx_http_set_log_request(c->log, r);
ngx_log_debug2(NGX_LOG_DEBUG_HTTP, c->log, 0,
"http aio: \"%V?%V\"", &r->uri, &r->args);
r->main->blocked--; r->main->blocked--;
r->aio = 0; r->aio = 0;
r->connection->write->handler(r->connection->write); r->write_event_handler(r);
ngx_http_run_posted_requests(c);
} }
@ -300,14 +309,33 @@ ngx_http_copy_thread_handler(ngx_thread_task_t *task, ngx_file_t *file)
static void static void
ngx_http_copy_thread_event_handler(ngx_event_t *ev) ngx_http_copy_thread_event_handler(ngx_event_t *ev)
{ {
ngx_connection_t *c;
ngx_http_request_t *r; ngx_http_request_t *r;
r = ev->data; r = ev->data;
c = r->connection;
ngx_http_set_log_request(c->log, r);
ngx_log_debug2(NGX_LOG_DEBUG_HTTP, c->log, 0,
"http thread: \"%V?%V\"", &r->uri, &r->args);
r->main->blocked--; r->main->blocked--;
r->aio = 0; r->aio = 0;
r->connection->write->handler(r->connection->write); 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
*/
c->write->handler(c->write);
} else {
r->write_event_handler(r);
ngx_http_run_posted_requests(c);
}
} }
#endif #endif