aboutsummaryrefslogtreecommitdiff
path: root/src/stream/ngx_stream_proxy_module.c
diff options
context:
space:
mode:
authorRoman Arutyunyan <arut@nginx.com>2015-04-22 19:55:04 +0300
committerRoman Arutyunyan <arut@nginx.com>2015-04-22 19:55:04 +0300
commit39386c951c6e2e898b4871156e61227c348e8bba (patch)
tree98706d020b00acc882c00d6b76bb8d1100339a94 /src/stream/ngx_stream_proxy_module.c
parent25ddb49dbe00561d63242f6d2fcef43bfc7214c4 (diff)
downloadnginx-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.c5
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;
}