Mercurial > hg > nginx
comparison src/http/ngx_http_upstream_round_robin.c @ 4655:382c523d253a
Upstream: weights support in ip_hash balancer.
author | Maxim Dounin <mdounin@mdounin.ru> |
---|---|
date | Sun, 03 Jun 2012 23:22:41 +0000 |
parents | 0dfdc3f732cb |
children | dcb853acae97 |
comparison
equal
deleted
inserted
replaced
4654:a2ca3a6ee680 | 4655:382c523d253a |
---|---|
28 ngx_int_t | 28 ngx_int_t |
29 ngx_http_upstream_init_round_robin(ngx_conf_t *cf, | 29 ngx_http_upstream_init_round_robin(ngx_conf_t *cf, |
30 ngx_http_upstream_srv_conf_t *us) | 30 ngx_http_upstream_srv_conf_t *us) |
31 { | 31 { |
32 ngx_url_t u; | 32 ngx_url_t u; |
33 ngx_uint_t i, j, n; | 33 ngx_uint_t i, j, n, w; |
34 ngx_http_upstream_server_t *server; | 34 ngx_http_upstream_server_t *server; |
35 ngx_http_upstream_rr_peers_t *peers, *backup; | 35 ngx_http_upstream_rr_peers_t *peers, *backup; |
36 | 36 |
37 us->peer.init = ngx_http_upstream_init_round_robin_peer; | 37 us->peer.init = ngx_http_upstream_init_round_robin_peer; |
38 | 38 |
39 if (us->servers) { | 39 if (us->servers) { |
40 server = us->servers->elts; | 40 server = us->servers->elts; |
41 | 41 |
42 n = 0; | 42 n = 0; |
43 w = 0; | |
43 | 44 |
44 for (i = 0; i < us->servers->nelts; i++) { | 45 for (i = 0; i < us->servers->nelts; i++) { |
45 if (server[i].backup) { | 46 if (server[i].backup) { |
46 continue; | 47 continue; |
47 } | 48 } |
48 | 49 |
49 n += server[i].naddrs; | 50 n += server[i].naddrs; |
51 w += server[i].naddrs * server[i].weight; | |
50 } | 52 } |
51 | 53 |
52 if (n == 0) { | 54 if (n == 0) { |
53 ngx_log_error(NGX_LOG_EMERG, cf->log, 0, | 55 ngx_log_error(NGX_LOG_EMERG, cf->log, 0, |
54 "no servers in upstream \"%V\" in %s:%ui", | 56 "no servers in upstream \"%V\" in %s:%ui", |
62 return NGX_ERROR; | 64 return NGX_ERROR; |
63 } | 65 } |
64 | 66 |
65 peers->single = (n == 1); | 67 peers->single = (n == 1); |
66 peers->number = n; | 68 peers->number = n; |
69 peers->weighted = (w != n); | |
70 peers->total_weight = w; | |
67 peers->name = &us->host; | 71 peers->name = &us->host; |
68 | 72 |
69 n = 0; | 73 n = 0; |
70 | 74 |
71 for (i = 0; i < us->servers->nelts; i++) { | 75 for (i = 0; i < us->servers->nelts; i++) { |
94 ngx_http_upstream_cmp_servers); | 98 ngx_http_upstream_cmp_servers); |
95 | 99 |
96 /* backup servers */ | 100 /* backup servers */ |
97 | 101 |
98 n = 0; | 102 n = 0; |
103 w = 0; | |
99 | 104 |
100 for (i = 0; i < us->servers->nelts; i++) { | 105 for (i = 0; i < us->servers->nelts; i++) { |
101 if (!server[i].backup) { | 106 if (!server[i].backup) { |
102 continue; | 107 continue; |
103 } | 108 } |
104 | 109 |
105 n += server[i].naddrs; | 110 n += server[i].naddrs; |
111 w += server[i].naddrs * server[i].weight; | |
106 } | 112 } |
107 | 113 |
108 if (n == 0) { | 114 if (n == 0) { |
109 return NGX_OK; | 115 return NGX_OK; |
110 } | 116 } |
116 } | 122 } |
117 | 123 |
118 peers->single = 0; | 124 peers->single = 0; |
119 backup->single = 0; | 125 backup->single = 0; |
120 backup->number = n; | 126 backup->number = n; |
127 backup->weighted = (w != n); | |
128 backup->total_weight = w; | |
121 backup->name = &us->host; | 129 backup->name = &us->host; |
122 | 130 |
123 n = 0; | 131 n = 0; |
124 | 132 |
125 for (i = 0; i < us->servers->nelts; i++) { | 133 for (i = 0; i < us->servers->nelts; i++) { |
183 return NGX_ERROR; | 191 return NGX_ERROR; |
184 } | 192 } |
185 | 193 |
186 peers->single = (n == 1); | 194 peers->single = (n == 1); |
187 peers->number = n; | 195 peers->number = n; |
196 peers->weighted = 0; | |
197 peers->total_weight = n; | |
188 peers->name = &us->host; | 198 peers->name = &us->host; |
189 | 199 |
190 for (i = 0; i < u.naddrs; i++) { | 200 for (i = 0; i < u.naddrs; i++) { |
191 peers->peer[i].sockaddr = u.addrs[i].sockaddr; | 201 peers->peer[i].sockaddr = u.addrs[i].sockaddr; |
192 peers->peer[i].socklen = u.addrs[i].socklen; | 202 peers->peer[i].socklen = u.addrs[i].socklen; |