From e4dab80e802241e416170b9686d8484eaa1f90f4 Mon Sep 17 00:00:00 2001 From: Maxim Dounin Date: Tue, 20 Sep 2011 09:55:27 +0000 Subject: [PATCH] Fix of cpu hog in event pipe. If client closed connection in ngx_event_pipe_write_to_downstream(), buffers in the "out" chain were lost. This caused cpu hog if all available buffers were in the "out" chain. Fix is to call ngx_chain_update_chains() before checking return code of output filter to avoid loosing buffers in the "out" chain. Note that this situation (all available buffers in the "out" chain) isn't normal, it should be prevented by busy buffers limit. Though right now it may happen with complex protocols like fastcgi. This should be addressed separately. --- src/event/ngx_event_pipe.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/event/ngx_event_pipe.c b/src/event/ngx_event_pipe.c index 802c65ee9..fb00bcc77 100644 --- a/src/event/ngx_event_pipe.c +++ b/src/event/ngx_event_pipe.c @@ -656,13 +656,13 @@ ngx_event_pipe_write_to_downstream(ngx_event_pipe_t *p) rc = p->output_filter(p->output_ctx, out); + ngx_chain_update_chains(p->pool, &p->free, &p->busy, &out, p->tag); + if (rc == NGX_ERROR) { p->downstream_error = 1; return ngx_event_pipe_drain_chains(p); } - ngx_chain_update_chains(p->pool, &p->free, &p->busy, &out, p->tag); - for (cl = p->free; cl; cl = cl->next) { if (cl->buf->temp_file) {