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