diff options
author | Roman Arutyunyan <arut@nginx.com> | 2015-04-22 19:55:04 +0300 |
---|---|---|
committer | Roman Arutyunyan <arut@nginx.com> | 2015-04-22 19:55:04 +0300 |
commit | 39386c951c6e2e898b4871156e61227c348e8bba (patch) | |
tree | 98706d020b00acc882c00d6b76bb8d1100339a94 /src/stream/ngx_stream_proxy_module.c | |
parent | 25ddb49dbe00561d63242f6d2fcef43bfc7214c4 (diff) | |
download | nginx-39386c951c6e2e898b4871156e61227c348e8bba.tar.gz nginx-39386c951c6e2e898b4871156e61227c348e8bba.zip |
Stream: prevent repeated event notifications after eof.
When client or upstream connection is closed, level-triggered read event
remained active until the end of the session leading to cpu hog. Now the flag
NGX_CLOSE_EVENT is used to unschedule the event.
Diffstat (limited to 'src/stream/ngx_stream_proxy_module.c')
-rw-r--r-- | src/stream/ngx_stream_proxy_module.c | 5 |
1 files changed, 4 insertions, 1 deletions
diff --git a/src/stream/ngx_stream_proxy_module.c b/src/stream/ngx_stream_proxy_module.c index 98a9aba06..8727629fd 100644 --- a/src/stream/ngx_stream_proxy_module.c +++ b/src/stream/ngx_stream_proxy_module.c @@ -814,6 +814,7 @@ ngx_stream_proxy_process(ngx_stream_session_t *s, ngx_uint_t from_upstream, size_t size; ssize_t n; ngx_buf_t *b; + ngx_uint_t flags; ngx_connection_t *c, *pc, *src, *dst; ngx_log_handler_pt handler; ngx_stream_upstream_t *u; @@ -911,7 +912,9 @@ ngx_stream_proxy_process(ngx_stream_session_t *s, ngx_uint_t from_upstream, return NGX_DONE; } - if (ngx_handle_read_event(src->read, 0) != NGX_OK) { + flags = src->read->eof ? NGX_CLOSE_EVENT : 0; + + if (ngx_handle_read_event(src->read, flags) != NGX_OK) { ngx_stream_proxy_finalize(s, NGX_ERROR); return NGX_ERROR; } |