Mercurial > hg > nginx-quic
comparison src/http/modules/ngx_http_limit_req_module.c @ 6961:903fb1ddc07f
Moved handling of wev->delayed to the connection event handler.
With post_action or subrequests, it is possible that the timer set for
wev->delayed will expire while the active subrequest write event handler
is not ready to handle this. This results in request hangs as observed
with limit_rate / sendfile_max_chunk and post_action (ticket #776) or
subrequests (ticket #1228).
Moving the handling to the connection event handler fixes the hangs observed,
and also slightly simplifies the code.
author | Maxim Dounin <mdounin@mdounin.ru> |
---|---|
date | Sun, 02 Apr 2017 14:32:29 +0300 |
parents | 7fcf209d40c8 |
children | bd6563e81cea |
comparison
equal
deleted
inserted
replaced
6960:1c5e5e5b008d | 6961:903fb1ddc07f |
---|---|
292 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, | 292 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, |
293 "limit_req delay"); | 293 "limit_req delay"); |
294 | 294 |
295 wev = r->connection->write; | 295 wev = r->connection->write; |
296 | 296 |
297 if (wev->delayed && !wev->timedout) { | 297 if (wev->delayed) { |
298 | 298 |
299 if (ngx_handle_write_event(wev, 0) != NGX_OK) { | 299 if (ngx_handle_write_event(wev, 0) != NGX_OK) { |
300 ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR); | 300 ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR); |
301 } | 301 } |
302 | 302 |
303 return; | 303 return; |
304 } | 304 } |
305 | |
306 wev->delayed = 0; | |
307 wev->timedout = 0; | |
308 | 305 |
309 if (ngx_handle_read_event(r->connection->read, 0) != NGX_OK) { | 306 if (ngx_handle_read_event(r->connection->read, 0) != NGX_OK) { |
310 ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR); | 307 ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR); |
311 return; | 308 return; |
312 } | 309 } |