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 }