comparison src/http/ngx_http_upstream_round_robin.c @ 676:bfa81a0490a2 NGINX_1_3_1

nginx 1.3.1 *) Security: now nginx/Windows ignores trailing dot in URI path component, and does not allow URIs with ":$" in it. Thanks to Vladimir Kochetkov, Positive Research Center. *) Feature: the "proxy_pass", "fastcgi_pass", "scgi_pass", "uwsgi_pass" directives, and the "server" directive inside the "upstream" block, now support IPv6 addresses. *) Feature: the "resolver" directive now support IPv6 addresses and an optional port specification. *) Feature: the "least_conn" directive inside the "upstream" block. *) Feature: it is now possible to specify a weight for servers while using the "ip_hash" directive. *) Bugfix: a segmentation fault might occur in a worker process if the "image_filter" directive was used; the bug had appeared in 1.3.0. *) Bugfix: nginx could not be built with ngx_cpp_test_module; the bug had appeared in 1.1.12. *) Bugfix: access to variables from SSI and embedded perl module might not work after reconfiguration. Thanks to Yichun Zhang. *) Bugfix: in the ngx_http_xslt_filter_module. Thanks to Kuramoto Eiji. *) Bugfix: memory leak if $geoip_org variable was used. Thanks to Denis F. Latypoff. *) Bugfix: in the "proxy_cookie_domain" and "proxy_cookie_path" directives.
author Igor Sysoev <http://sysoev.ru>
date Tue, 05 Jun 2012 00:00:00 +0400
parents 4dcaf40cc702
children 6db6e93f55ee
comparison
equal deleted inserted replaced
675:7052a9379344 676:bfa81a0490a2
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;