changeset 1379:cc8ac1936aa4

sort upstream weights
author Igor Sysoev <igor@sysoev.ru>
date Thu, 09 Aug 2007 15:28:17 +0000
parents 0be898896d1a
children b590a528fd41
files src/http/ngx_http_upstream_round_robin.c
diffstat 1 files changed, 21 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/src/http/ngx_http_upstream_round_robin.c
+++ b/src/http/ngx_http_upstream_round_robin.c
@@ -9,6 +9,7 @@
 #include <ngx_http.h>
 
 
+static int ngx_http_upstream_cmp_servers(const void *one, const void *two);
 static ngx_uint_t
 ngx_http_upstream_get_peer(ngx_http_upstream_rr_peers_t *peers);
 
@@ -69,6 +70,10 @@ ngx_http_upstream_init_round_robin(ngx_c
 
         us->peer.data = peers;
 
+        ngx_sort(&peers->peer[0], (size_t) n,
+                 sizeof(ngx_http_upstream_rr_peer_t),
+                 ngx_http_upstream_cmp_servers);
+
         /* backup servers */
 
         n = 0;
@@ -118,6 +123,10 @@ ngx_http_upstream_init_round_robin(ngx_c
 
         peers->next = backup;
 
+        ngx_sort(&backup->peer[0], (size_t) n,
+                 sizeof(ngx_http_upstream_rr_peer_t),
+                 ngx_http_upstream_cmp_servers);
+
         return NGX_OK;
     }
 
@@ -179,6 +188,18 @@ ngx_http_upstream_init_round_robin(ngx_c
 }
 
 
+static int
+ngx_http_upstream_cmp_servers(const void *one, const void *two)
+{
+    ngx_http_upstream_rr_peer_t  *first, *second;
+
+    first = (ngx_http_upstream_rr_peer_t *) one;
+    second = (ngx_http_upstream_rr_peer_t *) two;
+
+    return (first->weight < second->weight);
+}
+
+
 ngx_int_t
 ngx_http_upstream_init_round_robin_peer(ngx_http_request_t *r,
     ngx_http_upstream_srv_conf_t *us)