[PATCH 03 of 15] Workaround for cpu hog on errors with cached connections

Maxim Dounin mdounin at mdounin.ru
Sun Sep 4 11:33:50 UTC 2011

# HG changeset patch
# User Maxim Dounin <mdounin at mdounin.ru>
# Date 1314894208 -14400
# Node ID aab344fc305b4447f03461e04c1de291cce6caf9
# Parent  028614c84148775551b669785a1b4d637b831678
Workaround for cpu hog on errors with cached connections.

Just doing another connect isn't safe as peer.get() may expect peer.tries
to be strictly positive (this is the case e.g. with round robin with multiple
upstream servers).  Increment peer.tries to at least avoid cpu hog in
round robin balancer (with the patch alert will be seen instead).

This is not enough to fully address the problem though, hence TODO.  We
should be able to inform balancer that the error wasn't considered fatal
and it may make sense to retry the same peer.

diff --git a/src/http/ngx_http_upstream.c b/src/http/ngx_http_upstream.c
--- a/src/http/ngx_http_upstream.c
+++ b/src/http/ngx_http_upstream.c
@@ -2812,6 +2812,10 @@ ngx_http_upstream_next(ngx_http_request_
     if (u->peer.cached && ft_type == NGX_HTTP_UPSTREAM_FT_ERROR) {
         status = 0;
+        /* TODO: inform balancer instead */
+        u->peer.tries++;
     } else {
         switch(ft_type) {

More information about the nginx-devel mailing list