annotate src/http/ngx_http_upstream_round_robin.c @ 4458:2d4ff8bd5649

Limit conn: returned to the old behavior of using the first actual limit on the way. It was unintentionally changed in r4272, so that it could only limit the first location where the processing of the request has reached PREACCESS phase.
author Valentin Bartenev <vbart@nginx.com>
date Fri, 10 Feb 2012 10:48:58 +0000
parents d620f497c50f
children 1db899642518
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2 /*
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3 * Copyright (C) Igor Sysoev
4412
d620f497c50f Copyright updated.
Maxim Konovalov <maxim@nginx.com>
parents: 4207
diff changeset
4 * Copyright (C) Nginx, Inc.
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
5 */
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
6
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
7
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
8 #include <ngx_config.h>
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
9 #include <ngx_core.h>
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
10 #include <ngx_http.h>
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
11
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
12
1956
cb8c0c8e0c27 use ngx_int_t in ngx_sort() callback
Igor Sysoev <igor@sysoev.ru>
parents: 1887
diff changeset
13 static ngx_int_t ngx_http_upstream_cmp_servers(const void *one,
cb8c0c8e0c27 use ngx_int_t in ngx_sort() callback
Igor Sysoev <igor@sysoev.ru>
parents: 1887
diff changeset
14 const void *two);
1344
8f5b5641966c fair upstream weight balancer
Igor Sysoev <igor@sysoev.ru>
parents: 1284
diff changeset
15 static ngx_uint_t
8f5b5641966c fair upstream weight balancer
Igor Sysoev <igor@sysoev.ru>
parents: 1284
diff changeset
16 ngx_http_upstream_get_peer(ngx_http_upstream_rr_peers_t *peers);
8f5b5641966c fair upstream weight balancer
Igor Sysoev <igor@sysoev.ru>
parents: 1284
diff changeset
17
3964
ff127ba3b091 do not try to reuse and save a SSL session for a peer created on the fly
Igor Sysoev <igor@sysoev.ru>
parents: 2422
diff changeset
18 #if (NGX_HTTP_SSL)
ff127ba3b091 do not try to reuse and save a SSL session for a peer created on the fly
Igor Sysoev <igor@sysoev.ru>
parents: 2422
diff changeset
19
ff127ba3b091 do not try to reuse and save a SSL session for a peer created on the fly
Igor Sysoev <igor@sysoev.ru>
parents: 2422
diff changeset
20 static ngx_int_t ngx_http_upstream_empty_set_session(ngx_peer_connection_t *pc,
ff127ba3b091 do not try to reuse and save a SSL session for a peer created on the fly
Igor Sysoev <igor@sysoev.ru>
parents: 2422
diff changeset
21 void *data);
ff127ba3b091 do not try to reuse and save a SSL session for a peer created on the fly
Igor Sysoev <igor@sysoev.ru>
parents: 2422
diff changeset
22 static void ngx_http_upstream_empty_save_session(ngx_peer_connection_t *pc,
ff127ba3b091 do not try to reuse and save a SSL session for a peer created on the fly
Igor Sysoev <igor@sysoev.ru>
parents: 2422
diff changeset
23 void *data);
ff127ba3b091 do not try to reuse and save a SSL session for a peer created on the fly
Igor Sysoev <igor@sysoev.ru>
parents: 2422
diff changeset
24
ff127ba3b091 do not try to reuse and save a SSL session for a peer created on the fly
Igor Sysoev <igor@sysoev.ru>
parents: 2422
diff changeset
25 #endif
ff127ba3b091 do not try to reuse and save a SSL session for a peer created on the fly
Igor Sysoev <igor@sysoev.ru>
parents: 2422
diff changeset
26
1344
8f5b5641966c fair upstream weight balancer
Igor Sysoev <igor@sysoev.ru>
parents: 1284
diff changeset
27
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
28 ngx_int_t
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
29 ngx_http_upstream_init_round_robin(ngx_conf_t *cf,
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
30 ngx_http_upstream_srv_conf_t *us)
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
31 {
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
32 ngx_url_t u;
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
33 ngx_uint_t i, j, n;
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
34 ngx_http_upstream_server_t *server;
1378
0be898896d1a backup upstream servers
Igor Sysoev <igor@sysoev.ru>
parents: 1376
diff changeset
35 ngx_http_upstream_rr_peers_t *peers, *backup;
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
36
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
37 us->peer.init = ngx_http_upstream_init_round_robin_peer;
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
38
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
39 if (us->servers) {
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
40 server = us->servers->elts;
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
41
1378
0be898896d1a backup upstream servers
Igor Sysoev <igor@sysoev.ru>
parents: 1376
diff changeset
42 n = 0;
0be898896d1a backup upstream servers
Igor Sysoev <igor@sysoev.ru>
parents: 1376
diff changeset
43
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
44 for (i = 0; i < us->servers->nelts; i++) {
1378
0be898896d1a backup upstream servers
Igor Sysoev <igor@sysoev.ru>
parents: 1376
diff changeset
45 if (server[i].backup) {
0be898896d1a backup upstream servers
Igor Sysoev <igor@sysoev.ru>
parents: 1376
diff changeset
46 continue;
0be898896d1a backup upstream servers
Igor Sysoev <igor@sysoev.ru>
parents: 1376
diff changeset
47 }
0be898896d1a backup upstream servers
Igor Sysoev <igor@sysoev.ru>
parents: 1376
diff changeset
48
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
49 n += server[i].naddrs;
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
50 }
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
51
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
52 peers = ngx_pcalloc(cf->pool, sizeof(ngx_http_upstream_rr_peers_t)
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
53 + sizeof(ngx_http_upstream_rr_peer_t) * (n - 1));
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
54 if (peers == NULL) {
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
55 return NGX_ERROR;
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
56 }
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
57
1378
0be898896d1a backup upstream servers
Igor Sysoev <igor@sysoev.ru>
parents: 1376
diff changeset
58 peers->single = (n == 1);
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
59 peers->number = n;
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
60 peers->name = &us->host;
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
61
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
62 n = 0;
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
63
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
64 for (i = 0; i < us->servers->nelts; i++) {
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
65 for (j = 0; j < server[i].naddrs; j++) {
1378
0be898896d1a backup upstream servers
Igor Sysoev <igor@sysoev.ru>
parents: 1376
diff changeset
66 if (server[i].backup) {
0be898896d1a backup upstream servers
Igor Sysoev <igor@sysoev.ru>
parents: 1376
diff changeset
67 continue;
0be898896d1a backup upstream servers
Igor Sysoev <igor@sysoev.ru>
parents: 1376
diff changeset
68 }
0be898896d1a backup upstream servers
Igor Sysoev <igor@sysoev.ru>
parents: 1376
diff changeset
69
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
70 peers->peer[n].sockaddr = server[i].addrs[j].sockaddr;
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
71 peers->peer[n].socklen = server[i].addrs[j].socklen;
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
72 peers->peer[n].name = server[i].addrs[j].name;
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
73 peers->peer[n].max_fails = server[i].max_fails;
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
74 peers->peer[n].fail_timeout = server[i].fail_timeout;
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
75 peers->peer[n].down = server[i].down;
1376
6ff8c0c1e194 "down" server caused endless loop
Igor Sysoev <igor@sysoev.ru>
parents: 1344
diff changeset
76 peers->peer[n].weight = server[i].down ? 0 : server[i].weight;
6ff8c0c1e194 "down" server caused endless loop
Igor Sysoev <igor@sysoev.ru>
parents: 1344
diff changeset
77 peers->peer[n].current_weight = peers->peer[n].weight;
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
78 n++;
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
79 }
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
80 }
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
81
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
82 us->peer.data = peers;
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
83
1379
cc8ac1936aa4 sort upstream weights
Igor Sysoev <igor@sysoev.ru>
parents: 1378
diff changeset
84 ngx_sort(&peers->peer[0], (size_t) n,
cc8ac1936aa4 sort upstream weights
Igor Sysoev <igor@sysoev.ru>
parents: 1378
diff changeset
85 sizeof(ngx_http_upstream_rr_peer_t),
cc8ac1936aa4 sort upstream weights
Igor Sysoev <igor@sysoev.ru>
parents: 1378
diff changeset
86 ngx_http_upstream_cmp_servers);
cc8ac1936aa4 sort upstream weights
Igor Sysoev <igor@sysoev.ru>
parents: 1378
diff changeset
87
1378
0be898896d1a backup upstream servers
Igor Sysoev <igor@sysoev.ru>
parents: 1376
diff changeset
88 /* backup servers */
0be898896d1a backup upstream servers
Igor Sysoev <igor@sysoev.ru>
parents: 1376
diff changeset
89
0be898896d1a backup upstream servers
Igor Sysoev <igor@sysoev.ru>
parents: 1376
diff changeset
90 n = 0;
0be898896d1a backup upstream servers
Igor Sysoev <igor@sysoev.ru>
parents: 1376
diff changeset
91
0be898896d1a backup upstream servers
Igor Sysoev <igor@sysoev.ru>
parents: 1376
diff changeset
92 for (i = 0; i < us->servers->nelts; i++) {
0be898896d1a backup upstream servers
Igor Sysoev <igor@sysoev.ru>
parents: 1376
diff changeset
93 if (!server[i].backup) {
0be898896d1a backup upstream servers
Igor Sysoev <igor@sysoev.ru>
parents: 1376
diff changeset
94 continue;
0be898896d1a backup upstream servers
Igor Sysoev <igor@sysoev.ru>
parents: 1376
diff changeset
95 }
0be898896d1a backup upstream servers
Igor Sysoev <igor@sysoev.ru>
parents: 1376
diff changeset
96
0be898896d1a backup upstream servers
Igor Sysoev <igor@sysoev.ru>
parents: 1376
diff changeset
97 n += server[i].naddrs;
0be898896d1a backup upstream servers
Igor Sysoev <igor@sysoev.ru>
parents: 1376
diff changeset
98 }
0be898896d1a backup upstream servers
Igor Sysoev <igor@sysoev.ru>
parents: 1376
diff changeset
99
0be898896d1a backup upstream servers
Igor Sysoev <igor@sysoev.ru>
parents: 1376
diff changeset
100 if (n == 0) {
0be898896d1a backup upstream servers
Igor Sysoev <igor@sysoev.ru>
parents: 1376
diff changeset
101 return NGX_OK;
0be898896d1a backup upstream servers
Igor Sysoev <igor@sysoev.ru>
parents: 1376
diff changeset
102 }
0be898896d1a backup upstream servers
Igor Sysoev <igor@sysoev.ru>
parents: 1376
diff changeset
103
0be898896d1a backup upstream servers
Igor Sysoev <igor@sysoev.ru>
parents: 1376
diff changeset
104 backup = ngx_pcalloc(cf->pool, sizeof(ngx_http_upstream_rr_peers_t)
0be898896d1a backup upstream servers
Igor Sysoev <igor@sysoev.ru>
parents: 1376
diff changeset
105 + sizeof(ngx_http_upstream_rr_peer_t) * (n - 1));
0be898896d1a backup upstream servers
Igor Sysoev <igor@sysoev.ru>
parents: 1376
diff changeset
106 if (backup == NULL) {
0be898896d1a backup upstream servers
Igor Sysoev <igor@sysoev.ru>
parents: 1376
diff changeset
107 return NGX_ERROR;
0be898896d1a backup upstream servers
Igor Sysoev <igor@sysoev.ru>
parents: 1376
diff changeset
108 }
0be898896d1a backup upstream servers
Igor Sysoev <igor@sysoev.ru>
parents: 1376
diff changeset
109
0be898896d1a backup upstream servers
Igor Sysoev <igor@sysoev.ru>
parents: 1376
diff changeset
110 peers->single = 0;
0be898896d1a backup upstream servers
Igor Sysoev <igor@sysoev.ru>
parents: 1376
diff changeset
111 backup->single = 0;
0be898896d1a backup upstream servers
Igor Sysoev <igor@sysoev.ru>
parents: 1376
diff changeset
112 backup->number = n;
0be898896d1a backup upstream servers
Igor Sysoev <igor@sysoev.ru>
parents: 1376
diff changeset
113 backup->name = &us->host;
0be898896d1a backup upstream servers
Igor Sysoev <igor@sysoev.ru>
parents: 1376
diff changeset
114
0be898896d1a backup upstream servers
Igor Sysoev <igor@sysoev.ru>
parents: 1376
diff changeset
115 n = 0;
0be898896d1a backup upstream servers
Igor Sysoev <igor@sysoev.ru>
parents: 1376
diff changeset
116
0be898896d1a backup upstream servers
Igor Sysoev <igor@sysoev.ru>
parents: 1376
diff changeset
117 for (i = 0; i < us->servers->nelts; i++) {
0be898896d1a backup upstream servers
Igor Sysoev <igor@sysoev.ru>
parents: 1376
diff changeset
118 for (j = 0; j < server[i].naddrs; j++) {
0be898896d1a backup upstream servers
Igor Sysoev <igor@sysoev.ru>
parents: 1376
diff changeset
119 if (!server[i].backup) {
0be898896d1a backup upstream servers
Igor Sysoev <igor@sysoev.ru>
parents: 1376
diff changeset
120 continue;
0be898896d1a backup upstream servers
Igor Sysoev <igor@sysoev.ru>
parents: 1376
diff changeset
121 }
0be898896d1a backup upstream servers
Igor Sysoev <igor@sysoev.ru>
parents: 1376
diff changeset
122
0be898896d1a backup upstream servers
Igor Sysoev <igor@sysoev.ru>
parents: 1376
diff changeset
123 backup->peer[n].sockaddr = server[i].addrs[j].sockaddr;
0be898896d1a backup upstream servers
Igor Sysoev <igor@sysoev.ru>
parents: 1376
diff changeset
124 backup->peer[n].socklen = server[i].addrs[j].socklen;
0be898896d1a backup upstream servers
Igor Sysoev <igor@sysoev.ru>
parents: 1376
diff changeset
125 backup->peer[n].name = server[i].addrs[j].name;
0be898896d1a backup upstream servers
Igor Sysoev <igor@sysoev.ru>
parents: 1376
diff changeset
126 backup->peer[n].weight = server[i].weight;
0be898896d1a backup upstream servers
Igor Sysoev <igor@sysoev.ru>
parents: 1376
diff changeset
127 backup->peer[n].current_weight = server[i].weight;
0be898896d1a backup upstream servers
Igor Sysoev <igor@sysoev.ru>
parents: 1376
diff changeset
128 backup->peer[n].max_fails = server[i].max_fails;
0be898896d1a backup upstream servers
Igor Sysoev <igor@sysoev.ru>
parents: 1376
diff changeset
129 backup->peer[n].fail_timeout = server[i].fail_timeout;
0be898896d1a backup upstream servers
Igor Sysoev <igor@sysoev.ru>
parents: 1376
diff changeset
130 backup->peer[n].down = server[i].down;
0be898896d1a backup upstream servers
Igor Sysoev <igor@sysoev.ru>
parents: 1376
diff changeset
131 n++;
0be898896d1a backup upstream servers
Igor Sysoev <igor@sysoev.ru>
parents: 1376
diff changeset
132 }
0be898896d1a backup upstream servers
Igor Sysoev <igor@sysoev.ru>
parents: 1376
diff changeset
133 }
0be898896d1a backup upstream servers
Igor Sysoev <igor@sysoev.ru>
parents: 1376
diff changeset
134
0be898896d1a backup upstream servers
Igor Sysoev <igor@sysoev.ru>
parents: 1376
diff changeset
135 peers->next = backup;
0be898896d1a backup upstream servers
Igor Sysoev <igor@sysoev.ru>
parents: 1376
diff changeset
136
1379
cc8ac1936aa4 sort upstream weights
Igor Sysoev <igor@sysoev.ru>
parents: 1378
diff changeset
137 ngx_sort(&backup->peer[0], (size_t) n,
cc8ac1936aa4 sort upstream weights
Igor Sysoev <igor@sysoev.ru>
parents: 1378
diff changeset
138 sizeof(ngx_http_upstream_rr_peer_t),
cc8ac1936aa4 sort upstream weights
Igor Sysoev <igor@sysoev.ru>
parents: 1378
diff changeset
139 ngx_http_upstream_cmp_servers);
cc8ac1936aa4 sort upstream weights
Igor Sysoev <igor@sysoev.ru>
parents: 1378
diff changeset
140
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
141 return NGX_OK;
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
142 }
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
143
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
144
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
145 /* an upstream implicitly defined by proxy_pass, etc. */
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
146
906
a0310ac2814f rewritten upstream
Igor Sysoev <igor@sysoev.ru>
parents: 896
diff changeset
147 if (us->port == 0 && us->default_port == 0) {
a0310ac2814f rewritten upstream
Igor Sysoev <igor@sysoev.ru>
parents: 896
diff changeset
148 ngx_log_error(NGX_LOG_EMERG, cf->log, 0,
a0310ac2814f rewritten upstream
Igor Sysoev <igor@sysoev.ru>
parents: 896
diff changeset
149 "no port in upstream \"%V\" in %s:%ui",
1489
56f1ea5baabb u_char* is enough to keep file name
Igor Sysoev <igor@sysoev.ru>
parents: 1465
diff changeset
150 &us->host, us->file_name, us->line);
906
a0310ac2814f rewritten upstream
Igor Sysoev <igor@sysoev.ru>
parents: 896
diff changeset
151 return NGX_ERROR;
a0310ac2814f rewritten upstream
Igor Sysoev <igor@sysoev.ru>
parents: 896
diff changeset
152 }
a0310ac2814f rewritten upstream
Igor Sysoev <igor@sysoev.ru>
parents: 896
diff changeset
153
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
154 ngx_memzero(&u, sizeof(ngx_url_t));
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
155
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
156 u.host = us->host;
916
327aef5c6ac4 fix msvc build failure
Igor Sysoev <igor@sysoev.ru>
parents: 906
diff changeset
157 u.port = (in_port_t) (us->port ? us->port : us->default_port);
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
158
1559
fe11e2a3946d use pool instead of ngx_conf_t
Igor Sysoev <igor@sysoev.ru>
parents: 1556
diff changeset
159 if (ngx_inet_resolve_host(cf->pool, &u) != NGX_OK) {
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
160 if (u.err) {
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
161 ngx_log_error(NGX_LOG_EMERG, cf->log, 0,
896
f247db60fc85 fix fastcgi and memcached upstreams
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
162 "%s in upstream \"%V\" in %s:%ui",
1489
56f1ea5baabb u_char* is enough to keep file name
Igor Sysoev <igor@sysoev.ru>
parents: 1465
diff changeset
163 u.err, &us->host, us->file_name, us->line);
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
164 }
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
165
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
166 return NGX_ERROR;
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
167 }
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
168
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
169 n = u.naddrs;
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
170
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
171 peers = ngx_pcalloc(cf->pool, sizeof(ngx_http_upstream_rr_peers_t)
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
172 + sizeof(ngx_http_upstream_rr_peer_t) * (n - 1));
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
173 if (peers == NULL) {
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
174 return NGX_ERROR;
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
175 }
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
176
1378
0be898896d1a backup upstream servers
Igor Sysoev <igor@sysoev.ru>
parents: 1376
diff changeset
177 peers->single = (n == 1);
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
178 peers->number = n;
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
179 peers->name = &us->host;
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
180
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
181 for (i = 0; i < u.naddrs; i++) {
1564
6725c3f56216 optimization
Igor Sysoev <igor@sysoev.ru>
parents: 1559
diff changeset
182 peers->peer[i].sockaddr = u.addrs[i].sockaddr;
6725c3f56216 optimization
Igor Sysoev <igor@sysoev.ru>
parents: 1559
diff changeset
183 peers->peer[i].socklen = u.addrs[i].socklen;
6725c3f56216 optimization
Igor Sysoev <igor@sysoev.ru>
parents: 1559
diff changeset
184 peers->peer[i].name = u.addrs[i].name;
6725c3f56216 optimization
Igor Sysoev <igor@sysoev.ru>
parents: 1559
diff changeset
185 peers->peer[i].weight = 1;
6725c3f56216 optimization
Igor Sysoev <igor@sysoev.ru>
parents: 1559
diff changeset
186 peers->peer[i].current_weight = 1;
6725c3f56216 optimization
Igor Sysoev <igor@sysoev.ru>
parents: 1559
diff changeset
187 peers->peer[i].max_fails = 1;
6725c3f56216 optimization
Igor Sysoev <igor@sysoev.ru>
parents: 1559
diff changeset
188 peers->peer[i].fail_timeout = 10;
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
189 }
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
190
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
191 us->peer.data = peers;
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
192
1378
0be898896d1a backup upstream servers
Igor Sysoev <igor@sysoev.ru>
parents: 1376
diff changeset
193 /* implicitly defined upstream has no backup servers */
0be898896d1a backup upstream servers
Igor Sysoev <igor@sysoev.ru>
parents: 1376
diff changeset
194
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
195 return NGX_OK;
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
196 }
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
197
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
198
1956
cb8c0c8e0c27 use ngx_int_t in ngx_sort() callback
Igor Sysoev <igor@sysoev.ru>
parents: 1887
diff changeset
199 static ngx_int_t
1379
cc8ac1936aa4 sort upstream weights
Igor Sysoev <igor@sysoev.ru>
parents: 1378
diff changeset
200 ngx_http_upstream_cmp_servers(const void *one, const void *two)
cc8ac1936aa4 sort upstream weights
Igor Sysoev <igor@sysoev.ru>
parents: 1378
diff changeset
201 {
cc8ac1936aa4 sort upstream weights
Igor Sysoev <igor@sysoev.ru>
parents: 1378
diff changeset
202 ngx_http_upstream_rr_peer_t *first, *second;
cc8ac1936aa4 sort upstream weights
Igor Sysoev <igor@sysoev.ru>
parents: 1378
diff changeset
203
cc8ac1936aa4 sort upstream weights
Igor Sysoev <igor@sysoev.ru>
parents: 1378
diff changeset
204 first = (ngx_http_upstream_rr_peer_t *) one;
cc8ac1936aa4 sort upstream weights
Igor Sysoev <igor@sysoev.ru>
parents: 1378
diff changeset
205 second = (ngx_http_upstream_rr_peer_t *) two;
cc8ac1936aa4 sort upstream weights
Igor Sysoev <igor@sysoev.ru>
parents: 1378
diff changeset
206
cc8ac1936aa4 sort upstream weights
Igor Sysoev <igor@sysoev.ru>
parents: 1378
diff changeset
207 return (first->weight < second->weight);
cc8ac1936aa4 sort upstream weights
Igor Sysoev <igor@sysoev.ru>
parents: 1378
diff changeset
208 }
cc8ac1936aa4 sort upstream weights
Igor Sysoev <igor@sysoev.ru>
parents: 1378
diff changeset
209
cc8ac1936aa4 sort upstream weights
Igor Sysoev <igor@sysoev.ru>
parents: 1378
diff changeset
210
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
211 ngx_int_t
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
212 ngx_http_upstream_init_round_robin_peer(ngx_http_request_t *r,
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
213 ngx_http_upstream_srv_conf_t *us)
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
214 {
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
215 ngx_uint_t n;
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
216 ngx_http_upstream_rr_peer_data_t *rrp;
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
217
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
218 rrp = r->upstream->peer.data;
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
219
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
220 if (rrp == NULL) {
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
221 rrp = ngx_palloc(r->pool, sizeof(ngx_http_upstream_rr_peer_data_t));
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
222 if (rrp == NULL) {
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
223 return NGX_ERROR;
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
224 }
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
225
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
226 r->upstream->peer.data = rrp;
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
227 }
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
228
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
229 rrp->peers = us->peer.data;
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
230 rrp->current = 0;
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
231
4011
9d4cbb09ae8b Upstream: properly allocate memory for tried flags.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4010
diff changeset
232 n = rrp->peers->number;
9d4cbb09ae8b Upstream: properly allocate memory for tried flags.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4010
diff changeset
233
9d4cbb09ae8b Upstream: properly allocate memory for tried flags.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4010
diff changeset
234 if (rrp->peers->next && rrp->peers->next->number > n) {
9d4cbb09ae8b Upstream: properly allocate memory for tried flags.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4010
diff changeset
235 n = rrp->peers->next->number;
9d4cbb09ae8b Upstream: properly allocate memory for tried flags.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4010
diff changeset
236 }
9d4cbb09ae8b Upstream: properly allocate memory for tried flags.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4010
diff changeset
237
9d4cbb09ae8b Upstream: properly allocate memory for tried flags.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4010
diff changeset
238 if (n <= 8 * sizeof(uintptr_t)) {
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
239 rrp->tried = &rrp->data;
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
240 rrp->data = 0;
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
241
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
242 } else {
4011
9d4cbb09ae8b Upstream: properly allocate memory for tried flags.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4010
diff changeset
243 n = (n + (8 * sizeof(uintptr_t) - 1)) / (8 * sizeof(uintptr_t));
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
244
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
245 rrp->tried = ngx_pcalloc(r->pool, n * sizeof(uintptr_t));
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
246 if (rrp->tried == NULL) {
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
247 return NGX_ERROR;
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
248 }
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
249 }
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
250
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
251 r->upstream->peer.get = ngx_http_upstream_get_round_robin_peer;
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
252 r->upstream->peer.free = ngx_http_upstream_free_round_robin_peer;
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
253 r->upstream->peer.tries = rrp->peers->number;
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
254 #if (NGX_HTTP_SSL)
1284
be2b895d31e0 fix segfault when session was freed twice
Igor Sysoev <igor@sysoev.ru>
parents: 1206
diff changeset
255 r->upstream->peer.set_session =
be2b895d31e0 fix segfault when session was freed twice
Igor Sysoev <igor@sysoev.ru>
parents: 1206
diff changeset
256 ngx_http_upstream_set_round_robin_peer_session;
be2b895d31e0 fix segfault when session was freed twice
Igor Sysoev <igor@sysoev.ru>
parents: 1206
diff changeset
257 r->upstream->peer.save_session =
be2b895d31e0 fix segfault when session was freed twice
Igor Sysoev <igor@sysoev.ru>
parents: 1206
diff changeset
258 ngx_http_upstream_save_round_robin_peer_session;
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
259 #endif
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
260
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
261 return NGX_OK;
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
262 }
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
263
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
264
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
265 ngx_int_t
1658
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1568
diff changeset
266 ngx_http_upstream_create_round_robin_peer(ngx_http_request_t *r,
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1568
diff changeset
267 ngx_http_upstream_resolved_t *ur)
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1568
diff changeset
268 {
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1568
diff changeset
269 u_char *p;
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1568
diff changeset
270 size_t len;
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1568
diff changeset
271 ngx_uint_t i, n;
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1568
diff changeset
272 struct sockaddr_in *sin;
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1568
diff changeset
273 ngx_http_upstream_rr_peers_t *peers;
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1568
diff changeset
274 ngx_http_upstream_rr_peer_data_t *rrp;
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1568
diff changeset
275
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1568
diff changeset
276 rrp = r->upstream->peer.data;
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1568
diff changeset
277
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1568
diff changeset
278 if (rrp == NULL) {
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1568
diff changeset
279 rrp = ngx_palloc(r->pool, sizeof(ngx_http_upstream_rr_peer_data_t));
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1568
diff changeset
280 if (rrp == NULL) {
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1568
diff changeset
281 return NGX_ERROR;
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1568
diff changeset
282 }
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1568
diff changeset
283
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1568
diff changeset
284 r->upstream->peer.data = rrp;
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1568
diff changeset
285 }
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1568
diff changeset
286
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1568
diff changeset
287 peers = ngx_pcalloc(r->pool, sizeof(ngx_http_upstream_rr_peers_t)
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1568
diff changeset
288 + sizeof(ngx_http_upstream_rr_peer_t) * (ur->naddrs - 1));
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1568
diff changeset
289 if (peers == NULL) {
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1568
diff changeset
290 return NGX_ERROR;
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1568
diff changeset
291 }
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1568
diff changeset
292
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1568
diff changeset
293 peers->single = (ur->naddrs == 1);
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1568
diff changeset
294 peers->number = ur->naddrs;
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1568
diff changeset
295 peers->name = &ur->host;
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1568
diff changeset
296
2422
7af1e5fe102c variable support for unix sockets in fastcgi_pass and proxy_pass
Igor Sysoev <igor@sysoev.ru>
parents: 2204
diff changeset
297 if (ur->sockaddr) {
7af1e5fe102c variable support for unix sockets in fastcgi_pass and proxy_pass
Igor Sysoev <igor@sysoev.ru>
parents: 2204
diff changeset
298 peers->peer[0].sockaddr = ur->sockaddr;
7af1e5fe102c variable support for unix sockets in fastcgi_pass and proxy_pass
Igor Sysoev <igor@sysoev.ru>
parents: 2204
diff changeset
299 peers->peer[0].socklen = ur->socklen;
7af1e5fe102c variable support for unix sockets in fastcgi_pass and proxy_pass
Igor Sysoev <igor@sysoev.ru>
parents: 2204
diff changeset
300 peers->peer[0].name = ur->host;
7af1e5fe102c variable support for unix sockets in fastcgi_pass and proxy_pass
Igor Sysoev <igor@sysoev.ru>
parents: 2204
diff changeset
301 peers->peer[0].weight = 1;
7af1e5fe102c variable support for unix sockets in fastcgi_pass and proxy_pass
Igor Sysoev <igor@sysoev.ru>
parents: 2204
diff changeset
302 peers->peer[0].current_weight = 1;
7af1e5fe102c variable support for unix sockets in fastcgi_pass and proxy_pass
Igor Sysoev <igor@sysoev.ru>
parents: 2204
diff changeset
303 peers->peer[0].max_fails = 1;
7af1e5fe102c variable support for unix sockets in fastcgi_pass and proxy_pass
Igor Sysoev <igor@sysoev.ru>
parents: 2204
diff changeset
304 peers->peer[0].fail_timeout = 10;
1658
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1568
diff changeset
305
2422
7af1e5fe102c variable support for unix sockets in fastcgi_pass and proxy_pass
Igor Sysoev <igor@sysoev.ru>
parents: 2204
diff changeset
306 } else {
7af1e5fe102c variable support for unix sockets in fastcgi_pass and proxy_pass
Igor Sysoev <igor@sysoev.ru>
parents: 2204
diff changeset
307
7af1e5fe102c variable support for unix sockets in fastcgi_pass and proxy_pass
Igor Sysoev <igor@sysoev.ru>
parents: 2204
diff changeset
308 for (i = 0; i < ur->naddrs; i++) {
1658
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1568
diff changeset
309
2422
7af1e5fe102c variable support for unix sockets in fastcgi_pass and proxy_pass
Igor Sysoev <igor@sysoev.ru>
parents: 2204
diff changeset
310 len = NGX_INET_ADDRSTRLEN + sizeof(":65536") - 1;
7af1e5fe102c variable support for unix sockets in fastcgi_pass and proxy_pass
Igor Sysoev <igor@sysoev.ru>
parents: 2204
diff changeset
311
7af1e5fe102c variable support for unix sockets in fastcgi_pass and proxy_pass
Igor Sysoev <igor@sysoev.ru>
parents: 2204
diff changeset
312 p = ngx_pnalloc(r->pool, len);
7af1e5fe102c variable support for unix sockets in fastcgi_pass and proxy_pass
Igor Sysoev <igor@sysoev.ru>
parents: 2204
diff changeset
313 if (p == NULL) {
7af1e5fe102c variable support for unix sockets in fastcgi_pass and proxy_pass
Igor Sysoev <igor@sysoev.ru>
parents: 2204
diff changeset
314 return NGX_ERROR;
7af1e5fe102c variable support for unix sockets in fastcgi_pass and proxy_pass
Igor Sysoev <igor@sysoev.ru>
parents: 2204
diff changeset
315 }
1658
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1568
diff changeset
316
2422
7af1e5fe102c variable support for unix sockets in fastcgi_pass and proxy_pass
Igor Sysoev <igor@sysoev.ru>
parents: 2204
diff changeset
317 len = ngx_inet_ntop(AF_INET, &ur->addrs[i], p, NGX_INET_ADDRSTRLEN);
7af1e5fe102c variable support for unix sockets in fastcgi_pass and proxy_pass
Igor Sysoev <igor@sysoev.ru>
parents: 2204
diff changeset
318 len = ngx_sprintf(&p[len], ":%d", ur->port) - p;
1658
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1568
diff changeset
319
2422
7af1e5fe102c variable support for unix sockets in fastcgi_pass and proxy_pass
Igor Sysoev <igor@sysoev.ru>
parents: 2204
diff changeset
320 sin = ngx_pcalloc(r->pool, sizeof(struct sockaddr_in));
7af1e5fe102c variable support for unix sockets in fastcgi_pass and proxy_pass
Igor Sysoev <igor@sysoev.ru>
parents: 2204
diff changeset
321 if (sin == NULL) {
7af1e5fe102c variable support for unix sockets in fastcgi_pass and proxy_pass
Igor Sysoev <igor@sysoev.ru>
parents: 2204
diff changeset
322 return NGX_ERROR;
7af1e5fe102c variable support for unix sockets in fastcgi_pass and proxy_pass
Igor Sysoev <igor@sysoev.ru>
parents: 2204
diff changeset
323 }
1658
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1568
diff changeset
324
2422
7af1e5fe102c variable support for unix sockets in fastcgi_pass and proxy_pass
Igor Sysoev <igor@sysoev.ru>
parents: 2204
diff changeset
325 sin->sin_family = AF_INET;
7af1e5fe102c variable support for unix sockets in fastcgi_pass and proxy_pass
Igor Sysoev <igor@sysoev.ru>
parents: 2204
diff changeset
326 sin->sin_port = htons(ur->port);
7af1e5fe102c variable support for unix sockets in fastcgi_pass and proxy_pass
Igor Sysoev <igor@sysoev.ru>
parents: 2204
diff changeset
327 sin->sin_addr.s_addr = ur->addrs[i];
7af1e5fe102c variable support for unix sockets in fastcgi_pass and proxy_pass
Igor Sysoev <igor@sysoev.ru>
parents: 2204
diff changeset
328
7af1e5fe102c variable support for unix sockets in fastcgi_pass and proxy_pass
Igor Sysoev <igor@sysoev.ru>
parents: 2204
diff changeset
329 peers->peer[i].sockaddr = (struct sockaddr *) sin;
7af1e5fe102c variable support for unix sockets in fastcgi_pass and proxy_pass
Igor Sysoev <igor@sysoev.ru>
parents: 2204
diff changeset
330 peers->peer[i].socklen = sizeof(struct sockaddr_in);
7af1e5fe102c variable support for unix sockets in fastcgi_pass and proxy_pass
Igor Sysoev <igor@sysoev.ru>
parents: 2204
diff changeset
331 peers->peer[i].name.len = len;
7af1e5fe102c variable support for unix sockets in fastcgi_pass and proxy_pass
Igor Sysoev <igor@sysoev.ru>
parents: 2204
diff changeset
332 peers->peer[i].name.data = p;
7af1e5fe102c variable support for unix sockets in fastcgi_pass and proxy_pass
Igor Sysoev <igor@sysoev.ru>
parents: 2204
diff changeset
333 peers->peer[i].weight = 1;
7af1e5fe102c variable support for unix sockets in fastcgi_pass and proxy_pass
Igor Sysoev <igor@sysoev.ru>
parents: 2204
diff changeset
334 peers->peer[i].current_weight = 1;
7af1e5fe102c variable support for unix sockets in fastcgi_pass and proxy_pass
Igor Sysoev <igor@sysoev.ru>
parents: 2204
diff changeset
335 peers->peer[i].max_fails = 1;
7af1e5fe102c variable support for unix sockets in fastcgi_pass and proxy_pass
Igor Sysoev <igor@sysoev.ru>
parents: 2204
diff changeset
336 peers->peer[i].fail_timeout = 10;
7af1e5fe102c variable support for unix sockets in fastcgi_pass and proxy_pass
Igor Sysoev <igor@sysoev.ru>
parents: 2204
diff changeset
337 }
1658
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1568
diff changeset
338 }
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1568
diff changeset
339
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1568
diff changeset
340 rrp->peers = peers;
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1568
diff changeset
341 rrp->current = 0;
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1568
diff changeset
342
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1568
diff changeset
343 if (rrp->peers->number <= 8 * sizeof(uintptr_t)) {
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1568
diff changeset
344 rrp->tried = &rrp->data;
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1568
diff changeset
345 rrp->data = 0;
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1568
diff changeset
346
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1568
diff changeset
347 } else {
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1568
diff changeset
348 n = (rrp->peers->number + (8 * sizeof(uintptr_t) - 1))
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1568
diff changeset
349 / (8 * sizeof(uintptr_t));
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1568
diff changeset
350
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1568
diff changeset
351 rrp->tried = ngx_pcalloc(r->pool, n * sizeof(uintptr_t));
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1568
diff changeset
352 if (rrp->tried == NULL) {
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1568
diff changeset
353 return NGX_ERROR;
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1568
diff changeset
354 }
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1568
diff changeset
355 }
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1568
diff changeset
356
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1568
diff changeset
357 r->upstream->peer.get = ngx_http_upstream_get_round_robin_peer;
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1568
diff changeset
358 r->upstream->peer.free = ngx_http_upstream_free_round_robin_peer;
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1568
diff changeset
359 r->upstream->peer.tries = rrp->peers->number;
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1568
diff changeset
360 #if (NGX_HTTP_SSL)
3964
ff127ba3b091 do not try to reuse and save a SSL session for a peer created on the fly
Igor Sysoev <igor@sysoev.ru>
parents: 2422
diff changeset
361 r->upstream->peer.set_session = ngx_http_upstream_empty_set_session;
ff127ba3b091 do not try to reuse and save a SSL session for a peer created on the fly
Igor Sysoev <igor@sysoev.ru>
parents: 2422
diff changeset
362 r->upstream->peer.save_session = ngx_http_upstream_empty_save_session;
1658
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1568
diff changeset
363 #endif
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1568
diff changeset
364
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1568
diff changeset
365 return NGX_OK;
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1568
diff changeset
366 }
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1568
diff changeset
367
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1568
diff changeset
368
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1568
diff changeset
369 ngx_int_t
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
370 ngx_http_upstream_get_round_robin_peer(ngx_peer_connection_t *pc, void *data)
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
371 {
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
372 ngx_http_upstream_rr_peer_data_t *rrp = data;
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
373
1378
0be898896d1a backup upstream servers
Igor Sysoev <igor@sysoev.ru>
parents: 1376
diff changeset
374 time_t now;
0be898896d1a backup upstream servers
Igor Sysoev <igor@sysoev.ru>
parents: 1376
diff changeset
375 uintptr_t m;
0be898896d1a backup upstream servers
Igor Sysoev <igor@sysoev.ru>
parents: 1376
diff changeset
376 ngx_int_t rc;
0be898896d1a backup upstream servers
Igor Sysoev <igor@sysoev.ru>
parents: 1376
diff changeset
377 ngx_uint_t i, n;
0be898896d1a backup upstream servers
Igor Sysoev <igor@sysoev.ru>
parents: 1376
diff changeset
378 ngx_connection_t *c;
0be898896d1a backup upstream servers
Igor Sysoev <igor@sysoev.ru>
parents: 1376
diff changeset
379 ngx_http_upstream_rr_peer_t *peer;
0be898896d1a backup upstream servers
Igor Sysoev <igor@sysoev.ru>
parents: 1376
diff changeset
380 ngx_http_upstream_rr_peers_t *peers;
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
381
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
382 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, pc->log, 0,
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
383 "get rr peer, try: %ui", pc->tries);
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
384
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
385 now = ngx_time();
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
386
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
387 /* ngx_lock_mutex(rrp->peers->mutex); */
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
388
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
389 if (rrp->peers->last_cached) {
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
390
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
391 /* cached connection */
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
392
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
393 c = rrp->peers->cached[rrp->peers->last_cached];
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
394 rrp->peers->last_cached--;
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
395
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
396 /* ngx_unlock_mutex(ppr->peers->mutex); */
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
397
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
398 #if (NGX_THREADS)
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
399 c->read->lock = c->read->own_lock;
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
400 c->write->lock = c->write->own_lock;
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
401 #endif
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
402
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
403 pc->connection = c;
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
404 pc->cached = 1;
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
405
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
406 return NGX_OK;
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
407 }
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
408
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
409 pc->cached = 0;
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
410 pc->connection = NULL;
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
411
1378
0be898896d1a backup upstream servers
Igor Sysoev <igor@sysoev.ru>
parents: 1376
diff changeset
412 if (rrp->peers->single) {
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
413 peer = &rrp->peers->peer[0];
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
414
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
415 } else {
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
416
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
417 /* there are several peers */
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
418
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
419 if (pc->tries == rrp->peers->number) {
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
420
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
421 /* it's a first try - get a current peer */
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
422
1419
79f033a89dd4 add guard code to prevent endless loop
Igor Sysoev <igor@sysoev.ru>
parents: 1389
diff changeset
423 i = pc->tries;
79f033a89dd4 add guard code to prevent endless loop
Igor Sysoev <igor@sysoev.ru>
parents: 1389
diff changeset
424
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
425 for ( ;; ) {
1344
8f5b5641966c fair upstream weight balancer
Igor Sysoev <igor@sysoev.ru>
parents: 1284
diff changeset
426 rrp->current = ngx_http_upstream_get_peer(rrp->peers);
8f5b5641966c fair upstream weight balancer
Igor Sysoev <igor@sysoev.ru>
parents: 1284
diff changeset
427
8f5b5641966c fair upstream weight balancer
Igor Sysoev <igor@sysoev.ru>
parents: 1284
diff changeset
428 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, pc->log, 0,
8f5b5641966c fair upstream weight balancer
Igor Sysoev <igor@sysoev.ru>
parents: 1284
diff changeset
429 "get rr peer, current: %ui %i",
8f5b5641966c fair upstream weight balancer
Igor Sysoev <igor@sysoev.ru>
parents: 1284
diff changeset
430 rrp->current,
8f5b5641966c fair upstream weight balancer
Igor Sysoev <igor@sysoev.ru>
parents: 1284
diff changeset
431 rrp->peers->peer[rrp->current].current_weight);
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
432
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
433 n = rrp->current / (8 * sizeof(uintptr_t));
1206
451e34738078 fix worker endless loop on 64-bit platform if 33+ backend has fall
Igor Sysoev <igor@sysoev.ru>
parents: 916
diff changeset
434 m = (uintptr_t) 1 << rrp->current % (8 * sizeof(uintptr_t));
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
435
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
436 if (!(rrp->tried[n] & m)) {
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
437 peer = &rrp->peers->peer[rrp->current];
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
438
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
439 if (!peer->down) {
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
440
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
441 if (peer->max_fails == 0
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
442 || peer->fails < peer->max_fails)
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
443 {
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
444 break;
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
445 }
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
446
4207
4fc91bae6f83 Better recheck of dead upstream servers.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4011
diff changeset
447 if (now - peer->checked > peer->fail_timeout) {
4fc91bae6f83 Better recheck of dead upstream servers.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4011
diff changeset
448 peer->checked = now;
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
449 break;
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
450 }
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
451
1344
8f5b5641966c fair upstream weight balancer
Igor Sysoev <igor@sysoev.ru>
parents: 1284
diff changeset
452 peer->current_weight = 0;
8f5b5641966c fair upstream weight balancer
Igor Sysoev <igor@sysoev.ru>
parents: 1284
diff changeset
453
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
454 } else {
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
455 rrp->tried[n] |= m;
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
456 }
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
457
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
458 pc->tries--;
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
459 }
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
460
1419
79f033a89dd4 add guard code to prevent endless loop
Igor Sysoev <igor@sysoev.ru>
parents: 1389
diff changeset
461 if (pc->tries == 0) {
79f033a89dd4 add guard code to prevent endless loop
Igor Sysoev <igor@sysoev.ru>
parents: 1389
diff changeset
462 goto failed;
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
463 }
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
464
1419
79f033a89dd4 add guard code to prevent endless loop
Igor Sysoev <igor@sysoev.ru>
parents: 1389
diff changeset
465 if (--i == 0) {
79f033a89dd4 add guard code to prevent endless loop
Igor Sysoev <igor@sysoev.ru>
parents: 1389
diff changeset
466 ngx_log_error(NGX_LOG_ALERT, pc->log, 0,
79f033a89dd4 add guard code to prevent endless loop
Igor Sysoev <igor@sysoev.ru>
parents: 1389
diff changeset
467 "round robin upstream stuck on %ui tries",
79f033a89dd4 add guard code to prevent endless loop
Igor Sysoev <igor@sysoev.ru>
parents: 1389
diff changeset
468 pc->tries);
79f033a89dd4 add guard code to prevent endless loop
Igor Sysoev <igor@sysoev.ru>
parents: 1389
diff changeset
469 goto failed;
79f033a89dd4 add guard code to prevent endless loop
Igor Sysoev <igor@sysoev.ru>
parents: 1389
diff changeset
470 }
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
471 }
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
472
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
473 peer->current_weight--;
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
474
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
475 } else {
1419
79f033a89dd4 add guard code to prevent endless loop
Igor Sysoev <igor@sysoev.ru>
parents: 1389
diff changeset
476
79f033a89dd4 add guard code to prevent endless loop
Igor Sysoev <igor@sysoev.ru>
parents: 1389
diff changeset
477 i = pc->tries;
79f033a89dd4 add guard code to prevent endless loop
Igor Sysoev <igor@sysoev.ru>
parents: 1389
diff changeset
478
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
479 for ( ;; ) {
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
480 n = rrp->current / (8 * sizeof(uintptr_t));
1206
451e34738078 fix worker endless loop on 64-bit platform if 33+ backend has fall
Igor Sysoev <igor@sysoev.ru>
parents: 916
diff changeset
481 m = (uintptr_t) 1 << rrp->current % (8 * sizeof(uintptr_t));
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
482
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
483 if (!(rrp->tried[n] & m)) {
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
484
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
485 peer = &rrp->peers->peer[rrp->current];
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
486
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
487 if (!peer->down) {
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
488
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
489 if (peer->max_fails == 0
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
490 || peer->fails < peer->max_fails)
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
491 {
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
492 break;
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
493 }
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
494
4207
4fc91bae6f83 Better recheck of dead upstream servers.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4011
diff changeset
495 if (now - peer->checked > peer->fail_timeout) {
4fc91bae6f83 Better recheck of dead upstream servers.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4011
diff changeset
496 peer->checked = now;
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
497 break;
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
498 }
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
499
1344
8f5b5641966c fair upstream weight balancer
Igor Sysoev <igor@sysoev.ru>
parents: 1284
diff changeset
500 peer->current_weight = 0;
8f5b5641966c fair upstream weight balancer
Igor Sysoev <igor@sysoev.ru>
parents: 1284
diff changeset
501
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
502 } else {
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
503 rrp->tried[n] |= m;
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
504 }
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
505
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
506 pc->tries--;
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
507 }
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
508
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
509 rrp->current++;
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
510
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
511 if (rrp->current >= rrp->peers->number) {
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
512 rrp->current = 0;
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
513 }
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
514
1419
79f033a89dd4 add guard code to prevent endless loop
Igor Sysoev <igor@sysoev.ru>
parents: 1389
diff changeset
515 if (pc->tries == 0) {
79f033a89dd4 add guard code to prevent endless loop
Igor Sysoev <igor@sysoev.ru>
parents: 1389
diff changeset
516 goto failed;
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
517 }
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
518
1419
79f033a89dd4 add guard code to prevent endless loop
Igor Sysoev <igor@sysoev.ru>
parents: 1389
diff changeset
519 if (--i == 0) {
79f033a89dd4 add guard code to prevent endless loop
Igor Sysoev <igor@sysoev.ru>
parents: 1389
diff changeset
520 ngx_log_error(NGX_LOG_ALERT, pc->log, 0,
79f033a89dd4 add guard code to prevent endless loop
Igor Sysoev <igor@sysoev.ru>
parents: 1389
diff changeset
521 "round robin upstream stuck on %ui tries",
79f033a89dd4 add guard code to prevent endless loop
Igor Sysoev <igor@sysoev.ru>
parents: 1389
diff changeset
522 pc->tries);
79f033a89dd4 add guard code to prevent endless loop
Igor Sysoev <igor@sysoev.ru>
parents: 1389
diff changeset
523 goto failed;
79f033a89dd4 add guard code to prevent endless loop
Igor Sysoev <igor@sysoev.ru>
parents: 1389
diff changeset
524 }
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
525 }
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
526
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
527 peer->current_weight--;
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
528 }
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
529
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
530 rrp->tried[n] |= m;
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
531 }
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
532
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
533 pc->sockaddr = peer->sockaddr;
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
534 pc->socklen = peer->socklen;
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
535 pc->name = &peer->name;
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
536
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
537 /* ngx_unlock_mutex(rrp->peers->mutex); */
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
538
1378
0be898896d1a backup upstream servers
Igor Sysoev <igor@sysoev.ru>
parents: 1376
diff changeset
539 if (pc->tries == 1 && rrp->peers->next) {
0be898896d1a backup upstream servers
Igor Sysoev <igor@sysoev.ru>
parents: 1376
diff changeset
540 pc->tries += rrp->peers->next->number;
0be898896d1a backup upstream servers
Igor Sysoev <igor@sysoev.ru>
parents: 1376
diff changeset
541
0be898896d1a backup upstream servers
Igor Sysoev <igor@sysoev.ru>
parents: 1376
diff changeset
542 n = rrp->peers->next->number / (8 * sizeof(uintptr_t)) + 1;
1389
ab553c23bd3a fix long loop
Igor Sysoev <igor@sysoev.ru>
parents: 1379
diff changeset
543 for (i = 0; i < n; i++) {
1378
0be898896d1a backup upstream servers
Igor Sysoev <igor@sysoev.ru>
parents: 1376
diff changeset
544 rrp->tried[i] = 0;
0be898896d1a backup upstream servers
Igor Sysoev <igor@sysoev.ru>
parents: 1376
diff changeset
545 }
0be898896d1a backup upstream servers
Igor Sysoev <igor@sysoev.ru>
parents: 1376
diff changeset
546 }
0be898896d1a backup upstream servers
Igor Sysoev <igor@sysoev.ru>
parents: 1376
diff changeset
547
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
548 return NGX_OK;
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
549
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
550 failed:
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
551
1378
0be898896d1a backup upstream servers
Igor Sysoev <igor@sysoev.ru>
parents: 1376
diff changeset
552 peers = rrp->peers;
0be898896d1a backup upstream servers
Igor Sysoev <igor@sysoev.ru>
parents: 1376
diff changeset
553
0be898896d1a backup upstream servers
Igor Sysoev <igor@sysoev.ru>
parents: 1376
diff changeset
554 if (peers->next) {
0be898896d1a backup upstream servers
Igor Sysoev <igor@sysoev.ru>
parents: 1376
diff changeset
555
0be898896d1a backup upstream servers
Igor Sysoev <igor@sysoev.ru>
parents: 1376
diff changeset
556 /* ngx_unlock_mutex(peers->mutex); */
0be898896d1a backup upstream servers
Igor Sysoev <igor@sysoev.ru>
parents: 1376
diff changeset
557
0be898896d1a backup upstream servers
Igor Sysoev <igor@sysoev.ru>
parents: 1376
diff changeset
558 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, pc->log, 0, "backup servers");
0be898896d1a backup upstream servers
Igor Sysoev <igor@sysoev.ru>
parents: 1376
diff changeset
559
0be898896d1a backup upstream servers
Igor Sysoev <igor@sysoev.ru>
parents: 1376
diff changeset
560 rrp->peers = peers->next;
0be898896d1a backup upstream servers
Igor Sysoev <igor@sysoev.ru>
parents: 1376
diff changeset
561 pc->tries = rrp->peers->number;
0be898896d1a backup upstream servers
Igor Sysoev <igor@sysoev.ru>
parents: 1376
diff changeset
562
0be898896d1a backup upstream servers
Igor Sysoev <igor@sysoev.ru>
parents: 1376
diff changeset
563 n = rrp->peers->number / (8 * sizeof(uintptr_t)) + 1;
1389
ab553c23bd3a fix long loop
Igor Sysoev <igor@sysoev.ru>
parents: 1379
diff changeset
564 for (i = 0; i < n; i++) {
1378
0be898896d1a backup upstream servers
Igor Sysoev <igor@sysoev.ru>
parents: 1376
diff changeset
565 rrp->tried[i] = 0;
0be898896d1a backup upstream servers
Igor Sysoev <igor@sysoev.ru>
parents: 1376
diff changeset
566 }
0be898896d1a backup upstream servers
Igor Sysoev <igor@sysoev.ru>
parents: 1376
diff changeset
567
0be898896d1a backup upstream servers
Igor Sysoev <igor@sysoev.ru>
parents: 1376
diff changeset
568 rc = ngx_http_upstream_get_round_robin_peer(pc, rrp);
0be898896d1a backup upstream servers
Igor Sysoev <igor@sysoev.ru>
parents: 1376
diff changeset
569
0be898896d1a backup upstream servers
Igor Sysoev <igor@sysoev.ru>
parents: 1376
diff changeset
570 if (rc != NGX_BUSY) {
0be898896d1a backup upstream servers
Igor Sysoev <igor@sysoev.ru>
parents: 1376
diff changeset
571 return rc;
0be898896d1a backup upstream servers
Igor Sysoev <igor@sysoev.ru>
parents: 1376
diff changeset
572 }
0be898896d1a backup upstream servers
Igor Sysoev <igor@sysoev.ru>
parents: 1376
diff changeset
573
0be898896d1a backup upstream servers
Igor Sysoev <igor@sysoev.ru>
parents: 1376
diff changeset
574 /* ngx_lock_mutex(peers->mutex); */
0be898896d1a backup upstream servers
Igor Sysoev <igor@sysoev.ru>
parents: 1376
diff changeset
575 }
0be898896d1a backup upstream servers
Igor Sysoev <igor@sysoev.ru>
parents: 1376
diff changeset
576
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
577 /* all peers failed, mark them as live for quick recovery */
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
578
1378
0be898896d1a backup upstream servers
Igor Sysoev <igor@sysoev.ru>
parents: 1376
diff changeset
579 for (i = 0; i < peers->number; i++) {
0be898896d1a backup upstream servers
Igor Sysoev <igor@sysoev.ru>
parents: 1376
diff changeset
580 peers->peer[i].fails = 0;
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
581 }
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
582
1378
0be898896d1a backup upstream servers
Igor Sysoev <igor@sysoev.ru>
parents: 1376
diff changeset
583 /* ngx_unlock_mutex(peers->mutex); */
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
584
1378
0be898896d1a backup upstream servers
Igor Sysoev <igor@sysoev.ru>
parents: 1376
diff changeset
585 pc->name = peers->name;
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
586
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
587 return NGX_BUSY;
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
588 }
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
589
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
590
1344
8f5b5641966c fair upstream weight balancer
Igor Sysoev <igor@sysoev.ru>
parents: 1284
diff changeset
591 static ngx_uint_t
8f5b5641966c fair upstream weight balancer
Igor Sysoev <igor@sysoev.ru>
parents: 1284
diff changeset
592 ngx_http_upstream_get_peer(ngx_http_upstream_rr_peers_t *peers)
8f5b5641966c fair upstream weight balancer
Igor Sysoev <igor@sysoev.ru>
parents: 1284
diff changeset
593 {
4010
74a93d3fdd85 Fixing cpu hog with all upstream servers marked "down".
Maxim Dounin <mdounin@mdounin.ru>
parents: 3964
diff changeset
594 ngx_uint_t i, n, reset = 0;
1344
8f5b5641966c fair upstream weight balancer
Igor Sysoev <igor@sysoev.ru>
parents: 1284
diff changeset
595 ngx_http_upstream_rr_peer_t *peer;
8f5b5641966c fair upstream weight balancer
Igor Sysoev <igor@sysoev.ru>
parents: 1284
diff changeset
596
8f5b5641966c fair upstream weight balancer
Igor Sysoev <igor@sysoev.ru>
parents: 1284
diff changeset
597 peer = &peers->peer[0];
8f5b5641966c fair upstream weight balancer
Igor Sysoev <igor@sysoev.ru>
parents: 1284
diff changeset
598
8f5b5641966c fair upstream weight balancer
Igor Sysoev <igor@sysoev.ru>
parents: 1284
diff changeset
599 for ( ;; ) {
8f5b5641966c fair upstream weight balancer
Igor Sysoev <igor@sysoev.ru>
parents: 1284
diff changeset
600
8f5b5641966c fair upstream weight balancer
Igor Sysoev <igor@sysoev.ru>
parents: 1284
diff changeset
601 for (i = 0; i < peers->number; i++) {
8f5b5641966c fair upstream weight balancer
Igor Sysoev <igor@sysoev.ru>
parents: 1284
diff changeset
602
8f5b5641966c fair upstream weight balancer
Igor Sysoev <igor@sysoev.ru>
parents: 1284
diff changeset
603 if (peer[i].current_weight <= 0) {
8f5b5641966c fair upstream weight balancer
Igor Sysoev <igor@sysoev.ru>
parents: 1284
diff changeset
604 continue;
8f5b5641966c fair upstream weight balancer
Igor Sysoev <igor@sysoev.ru>
parents: 1284
diff changeset
605 }
8f5b5641966c fair upstream weight balancer
Igor Sysoev <igor@sysoev.ru>
parents: 1284
diff changeset
606
8f5b5641966c fair upstream weight balancer
Igor Sysoev <igor@sysoev.ru>
parents: 1284
diff changeset
607 n = i;
8f5b5641966c fair upstream weight balancer
Igor Sysoev <igor@sysoev.ru>
parents: 1284
diff changeset
608
8f5b5641966c fair upstream weight balancer
Igor Sysoev <igor@sysoev.ru>
parents: 1284
diff changeset
609 while (i < peers->number - 1) {
8f5b5641966c fair upstream weight balancer
Igor Sysoev <igor@sysoev.ru>
parents: 1284
diff changeset
610
8f5b5641966c fair upstream weight balancer
Igor Sysoev <igor@sysoev.ru>
parents: 1284
diff changeset
611 i++;
8f5b5641966c fair upstream weight balancer
Igor Sysoev <igor@sysoev.ru>
parents: 1284
diff changeset
612
8f5b5641966c fair upstream weight balancer
Igor Sysoev <igor@sysoev.ru>
parents: 1284
diff changeset
613 if (peer[i].current_weight <= 0) {
8f5b5641966c fair upstream weight balancer
Igor Sysoev <igor@sysoev.ru>
parents: 1284
diff changeset
614 continue;
8f5b5641966c fair upstream weight balancer
Igor Sysoev <igor@sysoev.ru>
parents: 1284
diff changeset
615 }
8f5b5641966c fair upstream weight balancer
Igor Sysoev <igor@sysoev.ru>
parents: 1284
diff changeset
616
8f5b5641966c fair upstream weight balancer
Igor Sysoev <igor@sysoev.ru>
parents: 1284
diff changeset
617 if (peer[n].current_weight * 1000 / peer[i].current_weight
1465
a9132739bb57 balance more fair when there are several servers with equal weights,
Igor Sysoev <igor@sysoev.ru>
parents: 1463
diff changeset
618 > peer[n].weight * 1000 / peer[i].weight)
1344
8f5b5641966c fair upstream weight balancer
Igor Sysoev <igor@sysoev.ru>
parents: 1284
diff changeset
619 {
8f5b5641966c fair upstream weight balancer
Igor Sysoev <igor@sysoev.ru>
parents: 1284
diff changeset
620 return n;
8f5b5641966c fair upstream weight balancer
Igor Sysoev <igor@sysoev.ru>
parents: 1284
diff changeset
621 }
8f5b5641966c fair upstream weight balancer
Igor Sysoev <igor@sysoev.ru>
parents: 1284
diff changeset
622
8f5b5641966c fair upstream weight balancer
Igor Sysoev <igor@sysoev.ru>
parents: 1284
diff changeset
623 n = i;
8f5b5641966c fair upstream weight balancer
Igor Sysoev <igor@sysoev.ru>
parents: 1284
diff changeset
624 }
8f5b5641966c fair upstream weight balancer
Igor Sysoev <igor@sysoev.ru>
parents: 1284
diff changeset
625
8f5b5641966c fair upstream weight balancer
Igor Sysoev <igor@sysoev.ru>
parents: 1284
diff changeset
626 if (peer[i].current_weight > 0) {
8f5b5641966c fair upstream weight balancer
Igor Sysoev <igor@sysoev.ru>
parents: 1284
diff changeset
627 n = i;
8f5b5641966c fair upstream weight balancer
Igor Sysoev <igor@sysoev.ru>
parents: 1284
diff changeset
628 }
8f5b5641966c fair upstream weight balancer
Igor Sysoev <igor@sysoev.ru>
parents: 1284
diff changeset
629
8f5b5641966c fair upstream weight balancer
Igor Sysoev <igor@sysoev.ru>
parents: 1284
diff changeset
630 return n;
8f5b5641966c fair upstream weight balancer
Igor Sysoev <igor@sysoev.ru>
parents: 1284
diff changeset
631 }
8f5b5641966c fair upstream weight balancer
Igor Sysoev <igor@sysoev.ru>
parents: 1284
diff changeset
632
4010
74a93d3fdd85 Fixing cpu hog with all upstream servers marked "down".
Maxim Dounin <mdounin@mdounin.ru>
parents: 3964
diff changeset
633 if (reset++) {
74a93d3fdd85 Fixing cpu hog with all upstream servers marked "down".
Maxim Dounin <mdounin@mdounin.ru>
parents: 3964
diff changeset
634 return 0;
74a93d3fdd85 Fixing cpu hog with all upstream servers marked "down".
Maxim Dounin <mdounin@mdounin.ru>
parents: 3964
diff changeset
635 }
74a93d3fdd85 Fixing cpu hog with all upstream servers marked "down".
Maxim Dounin <mdounin@mdounin.ru>
parents: 3964
diff changeset
636
1344
8f5b5641966c fair upstream weight balancer
Igor Sysoev <igor@sysoev.ru>
parents: 1284
diff changeset
637 for (i = 0; i < peers->number; i++) {
1887
abbef7b5dab8 set absolute weight, this fixes bogus "no live upstream" case when
Igor Sysoev <igor@sysoev.ru>
parents: 1658
diff changeset
638 peer[i].current_weight = peer[i].weight;
1344
8f5b5641966c fair upstream weight balancer
Igor Sysoev <igor@sysoev.ru>
parents: 1284
diff changeset
639 }
8f5b5641966c fair upstream weight balancer
Igor Sysoev <igor@sysoev.ru>
parents: 1284
diff changeset
640 }
8f5b5641966c fair upstream weight balancer
Igor Sysoev <igor@sysoev.ru>
parents: 1284
diff changeset
641 }
8f5b5641966c fair upstream weight balancer
Igor Sysoev <igor@sysoev.ru>
parents: 1284
diff changeset
642
8f5b5641966c fair upstream weight balancer
Igor Sysoev <igor@sysoev.ru>
parents: 1284
diff changeset
643
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
644 void
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
645 ngx_http_upstream_free_round_robin_peer(ngx_peer_connection_t *pc, void *data,
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
646 ngx_uint_t state)
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
647 {
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
648 ngx_http_upstream_rr_peer_data_t *rrp = data;
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
649
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
650 time_t now;
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
651 ngx_http_upstream_rr_peer_t *peer;
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
652
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
653 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, pc->log, 0,
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
654 "free rr peer %ui %ui", pc->tries, state);
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
655
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
656 if (state == 0 && pc->tries == 0) {
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
657 return;
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
658 }
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
659
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
660 /* TODO: NGX_PEER_KEEPALIVE */
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
661
1378
0be898896d1a backup upstream servers
Igor Sysoev <igor@sysoev.ru>
parents: 1376
diff changeset
662 if (rrp->peers->single) {
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
663 pc->tries = 0;
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
664 return;
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
665 }
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
666
4207
4fc91bae6f83 Better recheck of dead upstream servers.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4011
diff changeset
667 peer = &rrp->peers->peer[rrp->current];
4fc91bae6f83 Better recheck of dead upstream servers.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4011
diff changeset
668
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
669 if (state & NGX_PEER_FAILED) {
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
670 now = ngx_time();
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
671
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
672 /* ngx_lock_mutex(rrp->peers->mutex); */
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
673
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
674 peer->fails++;
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
675 peer->accessed = now;
4207
4fc91bae6f83 Better recheck of dead upstream servers.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4011
diff changeset
676 peer->checked = now;
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
677
2204
70a2bcc7e307 fix divide by zero if max_fails=0
Igor Sysoev <igor@sysoev.ru>
parents: 2197
diff changeset
678 if (peer->max_fails) {
70a2bcc7e307 fix divide by zero if max_fails=0
Igor Sysoev <igor@sysoev.ru>
parents: 2197
diff changeset
679 peer->current_weight -= peer->weight / peer->max_fails;
70a2bcc7e307 fix divide by zero if max_fails=0
Igor Sysoev <igor@sysoev.ru>
parents: 2197
diff changeset
680 }
1344
8f5b5641966c fair upstream weight balancer
Igor Sysoev <igor@sysoev.ru>
parents: 1284
diff changeset
681
8f5b5641966c fair upstream weight balancer
Igor Sysoev <igor@sysoev.ru>
parents: 1284
diff changeset
682 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, pc->log, 0,
8f5b5641966c fair upstream weight balancer
Igor Sysoev <igor@sysoev.ru>
parents: 1284
diff changeset
683 "free rr peer failed: %ui %i",
8f5b5641966c fair upstream weight balancer
Igor Sysoev <igor@sysoev.ru>
parents: 1284
diff changeset
684 rrp->current, peer->current_weight);
8f5b5641966c fair upstream weight balancer
Igor Sysoev <igor@sysoev.ru>
parents: 1284
diff changeset
685
8f5b5641966c fair upstream weight balancer
Igor Sysoev <igor@sysoev.ru>
parents: 1284
diff changeset
686 if (peer->current_weight < 0) {
8f5b5641966c fair upstream weight balancer
Igor Sysoev <igor@sysoev.ru>
parents: 1284
diff changeset
687 peer->current_weight = 0;
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
688 }
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
689
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
690 /* ngx_unlock_mutex(rrp->peers->mutex); */
4207
4fc91bae6f83 Better recheck of dead upstream servers.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4011
diff changeset
691
4fc91bae6f83 Better recheck of dead upstream servers.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4011
diff changeset
692 } else {
4fc91bae6f83 Better recheck of dead upstream servers.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4011
diff changeset
693
4fc91bae6f83 Better recheck of dead upstream servers.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4011
diff changeset
694 /* mark peer live if check passed */
4fc91bae6f83 Better recheck of dead upstream servers.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4011
diff changeset
695
4fc91bae6f83 Better recheck of dead upstream servers.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4011
diff changeset
696 if (peer->accessed < peer->checked) {
4fc91bae6f83 Better recheck of dead upstream servers.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4011
diff changeset
697 peer->fails = 0;
4fc91bae6f83 Better recheck of dead upstream servers.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4011
diff changeset
698 }
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
699 }
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
700
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
701 rrp->current++;
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
702
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
703 if (rrp->current >= rrp->peers->number) {
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
704 rrp->current = 0;
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
705 }
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
706
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
707 if (pc->tries) {
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
708 pc->tries--;
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
709 }
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
710
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
711 /* ngx_unlock_mutex(rrp->peers->mutex); */
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
712 }
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
713
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
714
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
715 #if (NGX_HTTP_SSL)
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
716
1284
be2b895d31e0 fix segfault when session was freed twice
Igor Sysoev <igor@sysoev.ru>
parents: 1206
diff changeset
717 ngx_int_t
be2b895d31e0 fix segfault when session was freed twice
Igor Sysoev <igor@sysoev.ru>
parents: 1206
diff changeset
718 ngx_http_upstream_set_round_robin_peer_session(ngx_peer_connection_t *pc,
be2b895d31e0 fix segfault when session was freed twice
Igor Sysoev <igor@sysoev.ru>
parents: 1206
diff changeset
719 void *data)
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
720 {
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
721 ngx_http_upstream_rr_peer_data_t *rrp = data;
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
722
1284
be2b895d31e0 fix segfault when session was freed twice
Igor Sysoev <igor@sysoev.ru>
parents: 1206
diff changeset
723 ngx_int_t rc;
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
724 ngx_ssl_session_t *ssl_session;
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
725 ngx_http_upstream_rr_peer_t *peer;
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
726
1284
be2b895d31e0 fix segfault when session was freed twice
Igor Sysoev <igor@sysoev.ru>
parents: 1206
diff changeset
727 peer = &rrp->peers->peer[rrp->current];
be2b895d31e0 fix segfault when session was freed twice
Igor Sysoev <igor@sysoev.ru>
parents: 1206
diff changeset
728
be2b895d31e0 fix segfault when session was freed twice
Igor Sysoev <igor@sysoev.ru>
parents: 1206
diff changeset
729 /* TODO: threads only mutex */
be2b895d31e0 fix segfault when session was freed twice
Igor Sysoev <igor@sysoev.ru>
parents: 1206
diff changeset
730 /* ngx_lock_mutex(rrp->peers->mutex); */
be2b895d31e0 fix segfault when session was freed twice
Igor Sysoev <igor@sysoev.ru>
parents: 1206
diff changeset
731
be2b895d31e0 fix segfault when session was freed twice
Igor Sysoev <igor@sysoev.ru>
parents: 1206
diff changeset
732 ssl_session = peer->ssl_session;
be2b895d31e0 fix segfault when session was freed twice
Igor Sysoev <igor@sysoev.ru>
parents: 1206
diff changeset
733
be2b895d31e0 fix segfault when session was freed twice
Igor Sysoev <igor@sysoev.ru>
parents: 1206
diff changeset
734 rc = ngx_ssl_set_session(pc->connection, ssl_session);
be2b895d31e0 fix segfault when session was freed twice
Igor Sysoev <igor@sysoev.ru>
parents: 1206
diff changeset
735
be2b895d31e0 fix segfault when session was freed twice
Igor Sysoev <igor@sysoev.ru>
parents: 1206
diff changeset
736 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, pc->log, 0,
1443
f8142ab2bace style fix
Igor Sysoev <igor@sysoev.ru>
parents: 1425
diff changeset
737 "set session: %p:%d",
f8142ab2bace style fix
Igor Sysoev <igor@sysoev.ru>
parents: 1425
diff changeset
738 ssl_session, ssl_session ? ssl_session->references : 0);
1284
be2b895d31e0 fix segfault when session was freed twice
Igor Sysoev <igor@sysoev.ru>
parents: 1206
diff changeset
739
be2b895d31e0 fix segfault when session was freed twice
Igor Sysoev <igor@sysoev.ru>
parents: 1206
diff changeset
740 /* ngx_unlock_mutex(rrp->peers->mutex); */
be2b895d31e0 fix segfault when session was freed twice
Igor Sysoev <igor@sysoev.ru>
parents: 1206
diff changeset
741
be2b895d31e0 fix segfault when session was freed twice
Igor Sysoev <igor@sysoev.ru>
parents: 1206
diff changeset
742 return rc;
be2b895d31e0 fix segfault when session was freed twice
Igor Sysoev <igor@sysoev.ru>
parents: 1206
diff changeset
743 }
be2b895d31e0 fix segfault when session was freed twice
Igor Sysoev <igor@sysoev.ru>
parents: 1206
diff changeset
744
be2b895d31e0 fix segfault when session was freed twice
Igor Sysoev <igor@sysoev.ru>
parents: 1206
diff changeset
745
be2b895d31e0 fix segfault when session was freed twice
Igor Sysoev <igor@sysoev.ru>
parents: 1206
diff changeset
746 void
be2b895d31e0 fix segfault when session was freed twice
Igor Sysoev <igor@sysoev.ru>
parents: 1206
diff changeset
747 ngx_http_upstream_save_round_robin_peer_session(ngx_peer_connection_t *pc,
be2b895d31e0 fix segfault when session was freed twice
Igor Sysoev <igor@sysoev.ru>
parents: 1206
diff changeset
748 void *data)
be2b895d31e0 fix segfault when session was freed twice
Igor Sysoev <igor@sysoev.ru>
parents: 1206
diff changeset
749 {
be2b895d31e0 fix segfault when session was freed twice
Igor Sysoev <igor@sysoev.ru>
parents: 1206
diff changeset
750 ngx_http_upstream_rr_peer_data_t *rrp = data;
be2b895d31e0 fix segfault when session was freed twice
Igor Sysoev <igor@sysoev.ru>
parents: 1206
diff changeset
751
be2b895d31e0 fix segfault when session was freed twice
Igor Sysoev <igor@sysoev.ru>
parents: 1206
diff changeset
752 ngx_ssl_session_t *old_ssl_session, *ssl_session;
be2b895d31e0 fix segfault when session was freed twice
Igor Sysoev <igor@sysoev.ru>
parents: 1206
diff changeset
753 ngx_http_upstream_rr_peer_t *peer;
be2b895d31e0 fix segfault when session was freed twice
Igor Sysoev <igor@sysoev.ru>
parents: 1206
diff changeset
754
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
755 ssl_session = ngx_ssl_get_session(pc->connection);
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
756
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
757 if (ssl_session == NULL) {
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
758 return;
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
759 }
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
760
1284
be2b895d31e0 fix segfault when session was freed twice
Igor Sysoev <igor@sysoev.ru>
parents: 1206
diff changeset
761 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, pc->log, 0,
1443
f8142ab2bace style fix
Igor Sysoev <igor@sysoev.ru>
parents: 1425
diff changeset
762 "save session: %p:%d", ssl_session, ssl_session->references);
1284
be2b895d31e0 fix segfault when session was freed twice
Igor Sysoev <igor@sysoev.ru>
parents: 1206
diff changeset
763
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
764 peer = &rrp->peers->peer[rrp->current];
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
765
1284
be2b895d31e0 fix segfault when session was freed twice
Igor Sysoev <igor@sysoev.ru>
parents: 1206
diff changeset
766 /* TODO: threads only mutex */
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
767 /* ngx_lock_mutex(rrp->peers->mutex); */
1284
be2b895d31e0 fix segfault when session was freed twice
Igor Sysoev <igor@sysoev.ru>
parents: 1206
diff changeset
768
be2b895d31e0 fix segfault when session was freed twice
Igor Sysoev <igor@sysoev.ru>
parents: 1206
diff changeset
769 old_ssl_session = peer->ssl_session;
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
770 peer->ssl_session = ssl_session;
1284
be2b895d31e0 fix segfault when session was freed twice
Igor Sysoev <igor@sysoev.ru>
parents: 1206
diff changeset
771
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
772 /* ngx_unlock_mutex(rrp->peers->mutex); */
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
773
1284
be2b895d31e0 fix segfault when session was freed twice
Igor Sysoev <igor@sysoev.ru>
parents: 1206
diff changeset
774 if (old_ssl_session) {
be2b895d31e0 fix segfault when session was freed twice
Igor Sysoev <igor@sysoev.ru>
parents: 1206
diff changeset
775
be2b895d31e0 fix segfault when session was freed twice
Igor Sysoev <igor@sysoev.ru>
parents: 1206
diff changeset
776 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, pc->log, 0,
1443
f8142ab2bace style fix
Igor Sysoev <igor@sysoev.ru>
parents: 1425
diff changeset
777 "old session: %p:%d",
1284
be2b895d31e0 fix segfault when session was freed twice
Igor Sysoev <igor@sysoev.ru>
parents: 1206
diff changeset
778 old_ssl_session, old_ssl_session->references);
be2b895d31e0 fix segfault when session was freed twice
Igor Sysoev <igor@sysoev.ru>
parents: 1206
diff changeset
779
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
780 /* TODO: may block */
1284
be2b895d31e0 fix segfault when session was freed twice
Igor Sysoev <igor@sysoev.ru>
parents: 1206
diff changeset
781
be2b895d31e0 fix segfault when session was freed twice
Igor Sysoev <igor@sysoev.ru>
parents: 1206
diff changeset
782 ngx_ssl_free_session(old_ssl_session);
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
783 }
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
784 }
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
785
3964
ff127ba3b091 do not try to reuse and save a SSL session for a peer created on the fly
Igor Sysoev <igor@sysoev.ru>
parents: 2422
diff changeset
786
ff127ba3b091 do not try to reuse and save a SSL session for a peer created on the fly
Igor Sysoev <igor@sysoev.ru>
parents: 2422
diff changeset
787 static ngx_int_t
ff127ba3b091 do not try to reuse and save a SSL session for a peer created on the fly
Igor Sysoev <igor@sysoev.ru>
parents: 2422
diff changeset
788 ngx_http_upstream_empty_set_session(ngx_peer_connection_t *pc, void *data)
ff127ba3b091 do not try to reuse and save a SSL session for a peer created on the fly
Igor Sysoev <igor@sysoev.ru>
parents: 2422
diff changeset
789 {
ff127ba3b091 do not try to reuse and save a SSL session for a peer created on the fly
Igor Sysoev <igor@sysoev.ru>
parents: 2422
diff changeset
790 return NGX_OK;
ff127ba3b091 do not try to reuse and save a SSL session for a peer created on the fly
Igor Sysoev <igor@sysoev.ru>
parents: 2422
diff changeset
791 }
ff127ba3b091 do not try to reuse and save a SSL session for a peer created on the fly
Igor Sysoev <igor@sysoev.ru>
parents: 2422
diff changeset
792
ff127ba3b091 do not try to reuse and save a SSL session for a peer created on the fly
Igor Sysoev <igor@sysoev.ru>
parents: 2422
diff changeset
793
ff127ba3b091 do not try to reuse and save a SSL session for a peer created on the fly
Igor Sysoev <igor@sysoev.ru>
parents: 2422
diff changeset
794 static void
ff127ba3b091 do not try to reuse and save a SSL session for a peer created on the fly
Igor Sysoev <igor@sysoev.ru>
parents: 2422
diff changeset
795 ngx_http_upstream_empty_save_session(ngx_peer_connection_t *pc, void *data)
ff127ba3b091 do not try to reuse and save a SSL session for a peer created on the fly
Igor Sysoev <igor@sysoev.ru>
parents: 2422
diff changeset
796 {
ff127ba3b091 do not try to reuse and save a SSL session for a peer created on the fly
Igor Sysoev <igor@sysoev.ru>
parents: 2422
diff changeset
797 return;
ff127ba3b091 do not try to reuse and save a SSL session for a peer created on the fly
Igor Sysoev <igor@sysoev.ru>
parents: 2422
diff changeset
798 }
ff127ba3b091 do not try to reuse and save a SSL session for a peer created on the fly
Igor Sysoev <igor@sysoev.ru>
parents: 2422
diff changeset
799
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
800 #endif