100% with upstream / backup server

Maxim Dounin mdounin at mdounin.ru
Tue Jan 26 21:56:19 MSK 2010


Hello!

On Tue, Jan 26, 2010 at 06:31:43PM +0100, Piotr Sikora wrote:

> Hi Maxim,
> 
> >This patch has at least two problems I see right now:
> >
> >1. It doesn't handle backup peers.
> 
> You are right, fixed version attached.
> 
> >2. It does extra unneeded work on each request.
> 
> This is done on purpose. This patch is part of patch distributed
> with ngx_supervisord which enables you to start/stop backend servers
> on demand.
> 
> But I agree that it could be optimized for mainstream release with
> something like peers->none;

Doing unneeded work on purpose scares me.

I belive correct fix would be to integrate relevant checks into 
peer selection loop.  This way extra work will be avoided on 
normal path and it will be still possible to eventually have 
upstreams dynamically configured.

Something like this will do the trick:

--- a/src/http/ngx_http_upstream_round_robin.c
+++ b/src/http/ngx_http_upstream_round_robin.c
@@ -578,7 +578,7 @@ failed:
 static ngx_uint_t
 ngx_http_upstream_get_peer(ngx_http_upstream_rr_peers_t *peers)
 {
-    ngx_uint_t                    i, n;
+    ngx_uint_t                    i, n, reset = 0;
     ngx_http_upstream_rr_peer_t  *peer;

     peer = &peers->peer[0];
@@ -617,6 +617,10 @@ ngx_http_upstream_get_peer(ngx_http_upst
             return n;
         }

+        if (reset++) {
+            return 0;
+        }
+
         for (i = 0; i < peers->number; i++) {
             peer[i].current_weight = peer[i].weight;
         }


Maxim Dounin



More information about the nginx mailing list