]> git.kaiwu.me - nginx.git/commitdiff
Fix of cpu hog in event pipe.
authorMaxim Dounin <mdounin@mdounin.ru>
Tue, 20 Sep 2011 09:55:27 +0000 (09:55 +0000)
committerMaxim Dounin <mdounin@mdounin.ru>
Tue, 20 Sep 2011 09:55:27 +0000 (09:55 +0000)
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

index 802c65ee99c2226b2a2392bf600b33d2e84be714..fb00bcc774156d9c21680eee370e27e2c705f2c5 100644 (file)
@@ -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) {