annotate src/http/ngx_http_upstream_round_robin.c @ 7738:554c6ae25ffc

SSL: fixed non-working SSL shutdown on lingering close. When doing lingering close, the socket was first shut down for writing, so SSL shutdown initiated after lingering close was not able to send the close_notify alerts (ticket #2056). The fix is to call ngx_ssl_shutdown() before shutting down the socket.
author Ruslan Ermilov <ru@nginx.com>
date Fri, 06 Nov 2020 23:44:54 +0300
parents b99cbafd51da
children 90cc7194e993
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
5831
575175ebf4b4 Upstream: included backup peers into peer.tries.
Roman Arutyunyan <arut@nginx.com>
parents: 5756
diff changeset
13 #define ngx_http_upstream_tries(p) ((p)->number \
575175ebf4b4 Upstream: included backup peers into peer.tries.
Roman Arutyunyan <arut@nginx.com>
parents: 5756
diff changeset
14 + ((p)->next ? (p)->next->number : 0))
575175ebf4b4 Upstream: included backup peers into peer.tries.
Roman Arutyunyan <arut@nginx.com>
parents: 5756
diff changeset
15
575175ebf4b4 Upstream: included backup peers into peer.tries.
Roman Arutyunyan <arut@nginx.com>
parents: 5756
diff changeset
16
4621
c90801720a0c Upstream: smooth weighted round-robin balancing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4569
diff changeset
17 static ngx_http_upstream_rr_peer_t *ngx_http_upstream_get_peer(
c90801720a0c Upstream: smooth weighted round-robin balancing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4569
diff changeset
18 ngx_http_upstream_rr_peer_data_t *rrp);
1344
8f5b5641966c fair upstream weight balancer
Igor Sysoev <igor@sysoev.ru>
parents: 1284
diff changeset
19
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
20 #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
21
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 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
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 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
25 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
26
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
27 #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
28
1344
8f5b5641966c fair upstream weight balancer
Igor Sysoev <igor@sysoev.ru>
parents: 1284
diff changeset
29
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
30 ngx_int_t
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
31 ngx_http_upstream_init_round_robin(ngx_conf_t *cf,
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
32 ngx_http_upstream_srv_conf_t *us)
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
33 {
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
34 ngx_url_t u;
4655
382c523d253a Upstream: weights support in ip_hash balancer.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4622
diff changeset
35 ngx_uint_t i, j, n, w;
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
36 ngx_http_upstream_server_t *server;
6100
c44459611d91 Upstream: store peers as a linked list.
Ruslan Ermilov <ru@nginx.com>
parents: 6099
diff changeset
37 ngx_http_upstream_rr_peer_t *peer, **peerp;
1378
0be898896d1a backup upstream servers
Igor Sysoev <igor@sysoev.ru>
parents: 1376
diff changeset
38 ngx_http_upstream_rr_peers_t *peers, *backup;
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
39
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
40 us->peer.init = ngx_http_upstream_init_round_robin_peer;
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
41
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
42 if (us->servers) {
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
43 server = us->servers->elts;
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
44
1378
0be898896d1a backup upstream servers
Igor Sysoev <igor@sysoev.ru>
parents: 1376
diff changeset
45 n = 0;
4655
382c523d253a Upstream: weights support in ip_hash balancer.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4622
diff changeset
46 w = 0;
1378
0be898896d1a backup upstream servers
Igor Sysoev <igor@sysoev.ru>
parents: 1376
diff changeset
47
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
48 for (i = 0; i < us->servers->nelts; i++) {
1378
0be898896d1a backup upstream servers
Igor Sysoev <igor@sysoev.ru>
parents: 1376
diff changeset
49 if (server[i].backup) {
0be898896d1a backup upstream servers
Igor Sysoev <igor@sysoev.ru>
parents: 1376
diff changeset
50 continue;
0be898896d1a backup upstream servers
Igor Sysoev <igor@sysoev.ru>
parents: 1376
diff changeset
51 }
0be898896d1a backup upstream servers
Igor Sysoev <igor@sysoev.ru>
parents: 1376
diff changeset
52
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
53 n += server[i].naddrs;
4655
382c523d253a Upstream: weights support in ip_hash balancer.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4622
diff changeset
54 w += server[i].naddrs * server[i].weight;
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
55 }
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
56
4569
1db899642518 Upstream: reject upstreams without normal servers.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4412
diff changeset
57 if (n == 0) {
1db899642518 Upstream: reject upstreams without normal servers.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4412
diff changeset
58 ngx_log_error(NGX_LOG_EMERG, cf->log, 0,
1db899642518 Upstream: reject upstreams without normal servers.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4412
diff changeset
59 "no servers in upstream \"%V\" in %s:%ui",
1db899642518 Upstream: reject upstreams without normal servers.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4412
diff changeset
60 &us->host, us->file_name, us->line);
1db899642518 Upstream: reject upstreams without normal servers.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4412
diff changeset
61 return NGX_ERROR;
1db899642518 Upstream: reject upstreams without normal servers.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4412
diff changeset
62 }
1db899642518 Upstream: reject upstreams without normal servers.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4412
diff changeset
63
6100
c44459611d91 Upstream: store peers as a linked list.
Ruslan Ermilov <ru@nginx.com>
parents: 6099
diff changeset
64 peers = ngx_pcalloc(cf->pool, sizeof(ngx_http_upstream_rr_peers_t));
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
65 if (peers == NULL) {
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
66 return NGX_ERROR;
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
67 }
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
68
6100
c44459611d91 Upstream: store peers as a linked list.
Ruslan Ermilov <ru@nginx.com>
parents: 6099
diff changeset
69 peer = ngx_pcalloc(cf->pool, sizeof(ngx_http_upstream_rr_peer_t) * n);
c44459611d91 Upstream: store peers as a linked list.
Ruslan Ermilov <ru@nginx.com>
parents: 6099
diff changeset
70 if (peer == NULL) {
c44459611d91 Upstream: store peers as a linked list.
Ruslan Ermilov <ru@nginx.com>
parents: 6099
diff changeset
71 return NGX_ERROR;
c44459611d91 Upstream: store peers as a linked list.
Ruslan Ermilov <ru@nginx.com>
parents: 6099
diff changeset
72 }
c44459611d91 Upstream: store peers as a linked list.
Ruslan Ermilov <ru@nginx.com>
parents: 6099
diff changeset
73
1378
0be898896d1a backup upstream servers
Igor Sysoev <igor@sysoev.ru>
parents: 1376
diff changeset
74 peers->single = (n == 1);
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
75 peers->number = n;
4655
382c523d253a Upstream: weights support in ip_hash balancer.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4622
diff changeset
76 peers->weighted = (w != n);
382c523d253a Upstream: weights support in ip_hash balancer.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4622
diff changeset
77 peers->total_weight = w;
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
78 peers->name = &us->host;
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 n = 0;
6100
c44459611d91 Upstream: store peers as a linked list.
Ruslan Ermilov <ru@nginx.com>
parents: 6099
diff changeset
81 peerp = &peers->peer;
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
82
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
83 for (i = 0; i < us->servers->nelts; i++) {
5429
e6a1623f87bc Upstream: optimize loops in ngx_http_upstream_init_round_robin().
Xiaochen Wang <wangxiaochen0@gmail.com>
parents: 5220
diff changeset
84 if (server[i].backup) {
e6a1623f87bc Upstream: optimize loops in ngx_http_upstream_init_round_robin().
Xiaochen Wang <wangxiaochen0@gmail.com>
parents: 5220
diff changeset
85 continue;
e6a1623f87bc Upstream: optimize loops in ngx_http_upstream_init_round_robin().
Xiaochen Wang <wangxiaochen0@gmail.com>
parents: 5220
diff changeset
86 }
e6a1623f87bc Upstream: optimize loops in ngx_http_upstream_init_round_robin().
Xiaochen Wang <wangxiaochen0@gmail.com>
parents: 5220
diff changeset
87
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
88 for (j = 0; j < server[i].naddrs; j++) {
5720
ab540dd44528 Upstream: simplified some code that accesses peers.
Ruslan Ermilov <ru@nginx.com>
parents: 5717
diff changeset
89 peer[n].sockaddr = server[i].addrs[j].sockaddr;
ab540dd44528 Upstream: simplified some code that accesses peers.
Ruslan Ermilov <ru@nginx.com>
parents: 5717
diff changeset
90 peer[n].socklen = server[i].addrs[j].socklen;
ab540dd44528 Upstream: simplified some code that accesses peers.
Ruslan Ermilov <ru@nginx.com>
parents: 5717
diff changeset
91 peer[n].name = server[i].addrs[j].name;
ab540dd44528 Upstream: simplified some code that accesses peers.
Ruslan Ermilov <ru@nginx.com>
parents: 5717
diff changeset
92 peer[n].weight = server[i].weight;
ab540dd44528 Upstream: simplified some code that accesses peers.
Ruslan Ermilov <ru@nginx.com>
parents: 5717
diff changeset
93 peer[n].effective_weight = server[i].weight;
ab540dd44528 Upstream: simplified some code that accesses peers.
Ruslan Ermilov <ru@nginx.com>
parents: 5717
diff changeset
94 peer[n].current_weight = 0;
6705
29bf0dbc0a77 Upstream: max_conns.
Ruslan Ermilov <ru@nginx.com>
parents: 6704
diff changeset
95 peer[n].max_conns = server[i].max_conns;
5720
ab540dd44528 Upstream: simplified some code that accesses peers.
Ruslan Ermilov <ru@nginx.com>
parents: 5717
diff changeset
96 peer[n].max_fails = server[i].max_fails;
ab540dd44528 Upstream: simplified some code that accesses peers.
Ruslan Ermilov <ru@nginx.com>
parents: 5717
diff changeset
97 peer[n].fail_timeout = server[i].fail_timeout;
ab540dd44528 Upstream: simplified some code that accesses peers.
Ruslan Ermilov <ru@nginx.com>
parents: 5717
diff changeset
98 peer[n].down = server[i].down;
ab540dd44528 Upstream: simplified some code that accesses peers.
Ruslan Ermilov <ru@nginx.com>
parents: 5717
diff changeset
99 peer[n].server = server[i].name;
6100
c44459611d91 Upstream: store peers as a linked list.
Ruslan Ermilov <ru@nginx.com>
parents: 6099
diff changeset
100
c44459611d91 Upstream: store peers as a linked list.
Ruslan Ermilov <ru@nginx.com>
parents: 6099
diff changeset
101 *peerp = &peer[n];
c44459611d91 Upstream: store peers as a linked list.
Ruslan Ermilov <ru@nginx.com>
parents: 6099
diff changeset
102 peerp = &peer[n].next;
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
103 n++;
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
104 }
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
105 }
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
106
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
107 us->peer.data = peers;
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
108
1378
0be898896d1a backup upstream servers
Igor Sysoev <igor@sysoev.ru>
parents: 1376
diff changeset
109 /* backup servers */
0be898896d1a backup upstream servers
Igor Sysoev <igor@sysoev.ru>
parents: 1376
diff changeset
110
0be898896d1a backup upstream servers
Igor Sysoev <igor@sysoev.ru>
parents: 1376
diff changeset
111 n = 0;
4655
382c523d253a Upstream: weights support in ip_hash balancer.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4622
diff changeset
112 w = 0;
1378
0be898896d1a backup upstream servers
Igor Sysoev <igor@sysoev.ru>
parents: 1376
diff changeset
113
0be898896d1a backup upstream servers
Igor Sysoev <igor@sysoev.ru>
parents: 1376
diff changeset
114 for (i = 0; i < us->servers->nelts; i++) {
0be898896d1a backup upstream servers
Igor Sysoev <igor@sysoev.ru>
parents: 1376
diff changeset
115 if (!server[i].backup) {
0be898896d1a backup upstream servers
Igor Sysoev <igor@sysoev.ru>
parents: 1376
diff changeset
116 continue;
0be898896d1a backup upstream servers
Igor Sysoev <igor@sysoev.ru>
parents: 1376
diff changeset
117 }
0be898896d1a backup upstream servers
Igor Sysoev <igor@sysoev.ru>
parents: 1376
diff changeset
118
0be898896d1a backup upstream servers
Igor Sysoev <igor@sysoev.ru>
parents: 1376
diff changeset
119 n += server[i].naddrs;
4655
382c523d253a Upstream: weights support in ip_hash balancer.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4622
diff changeset
120 w += server[i].naddrs * server[i].weight;
1378
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 if (n == 0) {
0be898896d1a backup upstream servers
Igor Sysoev <igor@sysoev.ru>
parents: 1376
diff changeset
124 return NGX_OK;
0be898896d1a backup upstream servers
Igor Sysoev <igor@sysoev.ru>
parents: 1376
diff changeset
125 }
0be898896d1a backup upstream servers
Igor Sysoev <igor@sysoev.ru>
parents: 1376
diff changeset
126
6100
c44459611d91 Upstream: store peers as a linked list.
Ruslan Ermilov <ru@nginx.com>
parents: 6099
diff changeset
127 backup = ngx_pcalloc(cf->pool, sizeof(ngx_http_upstream_rr_peers_t));
1378
0be898896d1a backup upstream servers
Igor Sysoev <igor@sysoev.ru>
parents: 1376
diff changeset
128 if (backup == NULL) {
0be898896d1a backup upstream servers
Igor Sysoev <igor@sysoev.ru>
parents: 1376
diff changeset
129 return NGX_ERROR;
0be898896d1a backup upstream servers
Igor Sysoev <igor@sysoev.ru>
parents: 1376
diff changeset
130 }
0be898896d1a backup upstream servers
Igor Sysoev <igor@sysoev.ru>
parents: 1376
diff changeset
131
6100
c44459611d91 Upstream: store peers as a linked list.
Ruslan Ermilov <ru@nginx.com>
parents: 6099
diff changeset
132 peer = ngx_pcalloc(cf->pool, sizeof(ngx_http_upstream_rr_peer_t) * n);
c44459611d91 Upstream: store peers as a linked list.
Ruslan Ermilov <ru@nginx.com>
parents: 6099
diff changeset
133 if (peer == NULL) {
c44459611d91 Upstream: store peers as a linked list.
Ruslan Ermilov <ru@nginx.com>
parents: 6099
diff changeset
134 return NGX_ERROR;
c44459611d91 Upstream: store peers as a linked list.
Ruslan Ermilov <ru@nginx.com>
parents: 6099
diff changeset
135 }
c44459611d91 Upstream: store peers as a linked list.
Ruslan Ermilov <ru@nginx.com>
parents: 6099
diff changeset
136
1378
0be898896d1a backup upstream servers
Igor Sysoev <igor@sysoev.ru>
parents: 1376
diff changeset
137 peers->single = 0;
0be898896d1a backup upstream servers
Igor Sysoev <igor@sysoev.ru>
parents: 1376
diff changeset
138 backup->single = 0;
0be898896d1a backup upstream servers
Igor Sysoev <igor@sysoev.ru>
parents: 1376
diff changeset
139 backup->number = n;
4655
382c523d253a Upstream: weights support in ip_hash balancer.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4622
diff changeset
140 backup->weighted = (w != n);
382c523d253a Upstream: weights support in ip_hash balancer.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4622
diff changeset
141 backup->total_weight = w;
1378
0be898896d1a backup upstream servers
Igor Sysoev <igor@sysoev.ru>
parents: 1376
diff changeset
142 backup->name = &us->host;
0be898896d1a backup upstream servers
Igor Sysoev <igor@sysoev.ru>
parents: 1376
diff changeset
143
0be898896d1a backup upstream servers
Igor Sysoev <igor@sysoev.ru>
parents: 1376
diff changeset
144 n = 0;
6100
c44459611d91 Upstream: store peers as a linked list.
Ruslan Ermilov <ru@nginx.com>
parents: 6099
diff changeset
145 peerp = &backup->peer;
1378
0be898896d1a backup upstream servers
Igor Sysoev <igor@sysoev.ru>
parents: 1376
diff changeset
146
0be898896d1a backup upstream servers
Igor Sysoev <igor@sysoev.ru>
parents: 1376
diff changeset
147 for (i = 0; i < us->servers->nelts; i++) {
5429
e6a1623f87bc Upstream: optimize loops in ngx_http_upstream_init_round_robin().
Xiaochen Wang <wangxiaochen0@gmail.com>
parents: 5220
diff changeset
148 if (!server[i].backup) {
e6a1623f87bc Upstream: optimize loops in ngx_http_upstream_init_round_robin().
Xiaochen Wang <wangxiaochen0@gmail.com>
parents: 5220
diff changeset
149 continue;
e6a1623f87bc Upstream: optimize loops in ngx_http_upstream_init_round_robin().
Xiaochen Wang <wangxiaochen0@gmail.com>
parents: 5220
diff changeset
150 }
e6a1623f87bc Upstream: optimize loops in ngx_http_upstream_init_round_robin().
Xiaochen Wang <wangxiaochen0@gmail.com>
parents: 5220
diff changeset
151
1378
0be898896d1a backup upstream servers
Igor Sysoev <igor@sysoev.ru>
parents: 1376
diff changeset
152 for (j = 0; j < server[i].naddrs; j++) {
5720
ab540dd44528 Upstream: simplified some code that accesses peers.
Ruslan Ermilov <ru@nginx.com>
parents: 5717
diff changeset
153 peer[n].sockaddr = server[i].addrs[j].sockaddr;
ab540dd44528 Upstream: simplified some code that accesses peers.
Ruslan Ermilov <ru@nginx.com>
parents: 5717
diff changeset
154 peer[n].socklen = server[i].addrs[j].socklen;
ab540dd44528 Upstream: simplified some code that accesses peers.
Ruslan Ermilov <ru@nginx.com>
parents: 5717
diff changeset
155 peer[n].name = server[i].addrs[j].name;
ab540dd44528 Upstream: simplified some code that accesses peers.
Ruslan Ermilov <ru@nginx.com>
parents: 5717
diff changeset
156 peer[n].weight = server[i].weight;
ab540dd44528 Upstream: simplified some code that accesses peers.
Ruslan Ermilov <ru@nginx.com>
parents: 5717
diff changeset
157 peer[n].effective_weight = server[i].weight;
ab540dd44528 Upstream: simplified some code that accesses peers.
Ruslan Ermilov <ru@nginx.com>
parents: 5717
diff changeset
158 peer[n].current_weight = 0;
6705
29bf0dbc0a77 Upstream: max_conns.
Ruslan Ermilov <ru@nginx.com>
parents: 6704
diff changeset
159 peer[n].max_conns = server[i].max_conns;
5720
ab540dd44528 Upstream: simplified some code that accesses peers.
Ruslan Ermilov <ru@nginx.com>
parents: 5717
diff changeset
160 peer[n].max_fails = server[i].max_fails;
ab540dd44528 Upstream: simplified some code that accesses peers.
Ruslan Ermilov <ru@nginx.com>
parents: 5717
diff changeset
161 peer[n].fail_timeout = server[i].fail_timeout;
ab540dd44528 Upstream: simplified some code that accesses peers.
Ruslan Ermilov <ru@nginx.com>
parents: 5717
diff changeset
162 peer[n].down = server[i].down;
ab540dd44528 Upstream: simplified some code that accesses peers.
Ruslan Ermilov <ru@nginx.com>
parents: 5717
diff changeset
163 peer[n].server = server[i].name;
6100
c44459611d91 Upstream: store peers as a linked list.
Ruslan Ermilov <ru@nginx.com>
parents: 6099
diff changeset
164
c44459611d91 Upstream: store peers as a linked list.
Ruslan Ermilov <ru@nginx.com>
parents: 6099
diff changeset
165 *peerp = &peer[n];
c44459611d91 Upstream: store peers as a linked list.
Ruslan Ermilov <ru@nginx.com>
parents: 6099
diff changeset
166 peerp = &peer[n].next;
1378
0be898896d1a backup upstream servers
Igor Sysoev <igor@sysoev.ru>
parents: 1376
diff changeset
167 n++;
0be898896d1a backup upstream servers
Igor Sysoev <igor@sysoev.ru>
parents: 1376
diff changeset
168 }
0be898896d1a backup upstream servers
Igor Sysoev <igor@sysoev.ru>
parents: 1376
diff changeset
169 }
0be898896d1a backup upstream servers
Igor Sysoev <igor@sysoev.ru>
parents: 1376
diff changeset
170
0be898896d1a backup upstream servers
Igor Sysoev <igor@sysoev.ru>
parents: 1376
diff changeset
171 peers->next = backup;
0be898896d1a backup upstream servers
Igor Sysoev <igor@sysoev.ru>
parents: 1376
diff changeset
172
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
173 return NGX_OK;
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
174 }
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
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
177 /* an upstream implicitly defined by proxy_pass, etc. */
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
178
5005
c9059bd5445b Fixed "proxy_pass" with IP address and no port (ticket #276).
Ruslan Ermilov <ru@nginx.com>
parents: 4991
diff changeset
179 if (us->port == 0) {
906
a0310ac2814f rewritten upstream
Igor Sysoev <igor@sysoev.ru>
parents: 896
diff changeset
180 ngx_log_error(NGX_LOG_EMERG, cf->log, 0,
a0310ac2814f rewritten upstream
Igor Sysoev <igor@sysoev.ru>
parents: 896
diff changeset
181 "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
182 &us->host, us->file_name, us->line);
906
a0310ac2814f rewritten upstream
Igor Sysoev <igor@sysoev.ru>
parents: 896
diff changeset
183 return NGX_ERROR;
a0310ac2814f rewritten upstream
Igor Sysoev <igor@sysoev.ru>
parents: 896
diff changeset
184 }
a0310ac2814f rewritten upstream
Igor Sysoev <igor@sysoev.ru>
parents: 896
diff changeset
185
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
186 ngx_memzero(&u, sizeof(ngx_url_t));
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
187
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
188 u.host = us->host;
5005
c9059bd5445b Fixed "proxy_pass" with IP address and no port (ticket #276).
Ruslan Ermilov <ru@nginx.com>
parents: 4991
diff changeset
189 u.port = us->port;
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
190
1559
fe11e2a3946d use pool instead of ngx_conf_t
Igor Sysoev <igor@sysoev.ru>
parents: 1556
diff changeset
191 if (ngx_inet_resolve_host(cf->pool, &u) != NGX_OK) {
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
192 if (u.err) {
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
193 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
194 "%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
195 u.err, &us->host, us->file_name, us->line);
884
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 return NGX_ERROR;
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
199 }
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
200
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
201 n = u.naddrs;
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
202
6100
c44459611d91 Upstream: store peers as a linked list.
Ruslan Ermilov <ru@nginx.com>
parents: 6099
diff changeset
203 peers = ngx_pcalloc(cf->pool, sizeof(ngx_http_upstream_rr_peers_t));
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
204 if (peers == NULL) {
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
205 return NGX_ERROR;
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
206 }
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
207
6100
c44459611d91 Upstream: store peers as a linked list.
Ruslan Ermilov <ru@nginx.com>
parents: 6099
diff changeset
208 peer = ngx_pcalloc(cf->pool, sizeof(ngx_http_upstream_rr_peer_t) * n);
c44459611d91 Upstream: store peers as a linked list.
Ruslan Ermilov <ru@nginx.com>
parents: 6099
diff changeset
209 if (peer == NULL) {
c44459611d91 Upstream: store peers as a linked list.
Ruslan Ermilov <ru@nginx.com>
parents: 6099
diff changeset
210 return NGX_ERROR;
c44459611d91 Upstream: store peers as a linked list.
Ruslan Ermilov <ru@nginx.com>
parents: 6099
diff changeset
211 }
c44459611d91 Upstream: store peers as a linked list.
Ruslan Ermilov <ru@nginx.com>
parents: 6099
diff changeset
212
1378
0be898896d1a backup upstream servers
Igor Sysoev <igor@sysoev.ru>
parents: 1376
diff changeset
213 peers->single = (n == 1);
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
214 peers->number = n;
4655
382c523d253a Upstream: weights support in ip_hash balancer.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4622
diff changeset
215 peers->weighted = 0;
382c523d253a Upstream: weights support in ip_hash balancer.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4622
diff changeset
216 peers->total_weight = n;
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
217 peers->name = &us->host;
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
218
6100
c44459611d91 Upstream: store peers as a linked list.
Ruslan Ermilov <ru@nginx.com>
parents: 6099
diff changeset
219 peerp = &peers->peer;
5720
ab540dd44528 Upstream: simplified some code that accesses peers.
Ruslan Ermilov <ru@nginx.com>
parents: 5717
diff changeset
220
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
221 for (i = 0; i < u.naddrs; i++) {
5720
ab540dd44528 Upstream: simplified some code that accesses peers.
Ruslan Ermilov <ru@nginx.com>
parents: 5717
diff changeset
222 peer[i].sockaddr = u.addrs[i].sockaddr;
ab540dd44528 Upstream: simplified some code that accesses peers.
Ruslan Ermilov <ru@nginx.com>
parents: 5717
diff changeset
223 peer[i].socklen = u.addrs[i].socklen;
ab540dd44528 Upstream: simplified some code that accesses peers.
Ruslan Ermilov <ru@nginx.com>
parents: 5717
diff changeset
224 peer[i].name = u.addrs[i].name;
ab540dd44528 Upstream: simplified some code that accesses peers.
Ruslan Ermilov <ru@nginx.com>
parents: 5717
diff changeset
225 peer[i].weight = 1;
ab540dd44528 Upstream: simplified some code that accesses peers.
Ruslan Ermilov <ru@nginx.com>
parents: 5717
diff changeset
226 peer[i].effective_weight = 1;
ab540dd44528 Upstream: simplified some code that accesses peers.
Ruslan Ermilov <ru@nginx.com>
parents: 5717
diff changeset
227 peer[i].current_weight = 0;
6705
29bf0dbc0a77 Upstream: max_conns.
Ruslan Ermilov <ru@nginx.com>
parents: 6704
diff changeset
228 peer[i].max_conns = 0;
5720
ab540dd44528 Upstream: simplified some code that accesses peers.
Ruslan Ermilov <ru@nginx.com>
parents: 5717
diff changeset
229 peer[i].max_fails = 1;
ab540dd44528 Upstream: simplified some code that accesses peers.
Ruslan Ermilov <ru@nginx.com>
parents: 5717
diff changeset
230 peer[i].fail_timeout = 10;
6100
c44459611d91 Upstream: store peers as a linked list.
Ruslan Ermilov <ru@nginx.com>
parents: 6099
diff changeset
231 *peerp = &peer[i];
c44459611d91 Upstream: store peers as a linked list.
Ruslan Ermilov <ru@nginx.com>
parents: 6099
diff changeset
232 peerp = &peer[i].next;
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
233 }
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
234
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
235 us->peer.data = peers;
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
236
1378
0be898896d1a backup upstream servers
Igor Sysoev <igor@sysoev.ru>
parents: 1376
diff changeset
237 /* implicitly defined upstream has no backup servers */
0be898896d1a backup upstream servers
Igor Sysoev <igor@sysoev.ru>
parents: 1376
diff changeset
238
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
239 return NGX_OK;
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
240 }
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
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
243 ngx_int_t
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
244 ngx_http_upstream_init_round_robin_peer(ngx_http_request_t *r,
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
245 ngx_http_upstream_srv_conf_t *us)
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
246 {
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
247 ngx_uint_t n;
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
248 ngx_http_upstream_rr_peer_data_t *rrp;
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 rrp = r->upstream->peer.data;
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
251
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
252 if (rrp == NULL) {
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
253 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
254 if (rrp == NULL) {
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
255 return NGX_ERROR;
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
256 }
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
257
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
258 r->upstream->peer.data = rrp;
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
259 }
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 rrp->peers = us->peer.data;
6100
c44459611d91 Upstream: store peers as a linked list.
Ruslan Ermilov <ru@nginx.com>
parents: 6099
diff changeset
262 rrp->current = NULL;
6712
fd5c2781460b Modules compatibility: upstream config field.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6705
diff changeset
263 rrp->config = 0;
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
264
4011
9d4cbb09ae8b Upstream: properly allocate memory for tried flags.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4010
diff changeset
265 n = rrp->peers->number;
9d4cbb09ae8b Upstream: properly allocate memory for tried flags.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4010
diff changeset
266
9d4cbb09ae8b Upstream: properly allocate memory for tried flags.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4010
diff changeset
267 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
268 n = rrp->peers->next->number;
9d4cbb09ae8b Upstream: properly allocate memory for tried flags.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4010
diff changeset
269 }
9d4cbb09ae8b Upstream: properly allocate memory for tried flags.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4010
diff changeset
270
9d4cbb09ae8b Upstream: properly allocate memory for tried flags.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4010
diff changeset
271 if (n <= 8 * sizeof(uintptr_t)) {
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
272 rrp->tried = &rrp->data;
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
273 rrp->data = 0;
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
274
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
275 } else {
4011
9d4cbb09ae8b Upstream: properly allocate memory for tried flags.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4010
diff changeset
276 n = (n + (8 * sizeof(uintptr_t) - 1)) / (8 * sizeof(uintptr_t));
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
277
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
278 rrp->tried = ngx_pcalloc(r->pool, n * sizeof(uintptr_t));
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
279 if (rrp->tried == NULL) {
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
280 return NGX_ERROR;
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
281 }
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
282 }
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
283
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
284 r->upstream->peer.get = ngx_http_upstream_get_round_robin_peer;
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
285 r->upstream->peer.free = ngx_http_upstream_free_round_robin_peer;
5831
575175ebf4b4 Upstream: included backup peers into peer.tries.
Roman Arutyunyan <arut@nginx.com>
parents: 5756
diff changeset
286 r->upstream->peer.tries = ngx_http_upstream_tries(rrp->peers);
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
287 #if (NGX_HTTP_SSL)
1284
be2b895d31e0 fix segfault when session was freed twice
Igor Sysoev <igor@sysoev.ru>
parents: 1206
diff changeset
288 r->upstream->peer.set_session =
be2b895d31e0 fix segfault when session was freed twice
Igor Sysoev <igor@sysoev.ru>
parents: 1206
diff changeset
289 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
290 r->upstream->peer.save_session =
be2b895d31e0 fix segfault when session was freed twice
Igor Sysoev <igor@sysoev.ru>
parents: 1206
diff changeset
291 ngx_http_upstream_save_round_robin_peer_session;
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
292 #endif
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
293
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
294 return NGX_OK;
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
295 }
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
296
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
297
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
298 ngx_int_t
1658
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1568
diff changeset
299 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
300 ngx_http_upstream_resolved_t *ur)
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1568
diff changeset
301 {
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1568
diff changeset
302 u_char *p;
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1568
diff changeset
303 size_t len;
5475
07dd5bd222ac Changed resolver API to use ngx_addr_t.
Ruslan Ermilov <ru@nginx.com>
parents: 5454
diff changeset
304 socklen_t socklen;
1658
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1568
diff changeset
305 ngx_uint_t i, n;
5475
07dd5bd222ac Changed resolver API to use ngx_addr_t.
Ruslan Ermilov <ru@nginx.com>
parents: 5454
diff changeset
306 struct sockaddr *sockaddr;
6100
c44459611d91 Upstream: store peers as a linked list.
Ruslan Ermilov <ru@nginx.com>
parents: 6099
diff changeset
307 ngx_http_upstream_rr_peer_t *peer, **peerp;
1658
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1568
diff changeset
308 ngx_http_upstream_rr_peers_t *peers;
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1568
diff changeset
309 ngx_http_upstream_rr_peer_data_t *rrp;
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1568
diff changeset
310
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1568
diff changeset
311 rrp = r->upstream->peer.data;
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1568
diff changeset
312
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1568
diff changeset
313 if (rrp == NULL) {
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1568
diff changeset
314 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
315 if (rrp == NULL) {
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1568
diff changeset
316 return NGX_ERROR;
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1568
diff changeset
317 }
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1568
diff changeset
318
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1568
diff changeset
319 r->upstream->peer.data = rrp;
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1568
diff changeset
320 }
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1568
diff changeset
321
6100
c44459611d91 Upstream: store peers as a linked list.
Ruslan Ermilov <ru@nginx.com>
parents: 6099
diff changeset
322 peers = ngx_pcalloc(r->pool, sizeof(ngx_http_upstream_rr_peers_t));
1658
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1568
diff changeset
323 if (peers == NULL) {
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1568
diff changeset
324 return NGX_ERROR;
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1568
diff changeset
325 }
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1568
diff changeset
326
6100
c44459611d91 Upstream: store peers as a linked list.
Ruslan Ermilov <ru@nginx.com>
parents: 6099
diff changeset
327 peer = ngx_pcalloc(r->pool, sizeof(ngx_http_upstream_rr_peer_t)
c44459611d91 Upstream: store peers as a linked list.
Ruslan Ermilov <ru@nginx.com>
parents: 6099
diff changeset
328 * ur->naddrs);
c44459611d91 Upstream: store peers as a linked list.
Ruslan Ermilov <ru@nginx.com>
parents: 6099
diff changeset
329 if (peer == NULL) {
c44459611d91 Upstream: store peers as a linked list.
Ruslan Ermilov <ru@nginx.com>
parents: 6099
diff changeset
330 return NGX_ERROR;
c44459611d91 Upstream: store peers as a linked list.
Ruslan Ermilov <ru@nginx.com>
parents: 6099
diff changeset
331 }
c44459611d91 Upstream: store peers as a linked list.
Ruslan Ermilov <ru@nginx.com>
parents: 6099
diff changeset
332
1658
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1568
diff changeset
333 peers->single = (ur->naddrs == 1);
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1568
diff changeset
334 peers->number = ur->naddrs;
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1568
diff changeset
335 peers->name = &ur->host;
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1568
diff changeset
336
2422
7af1e5fe102c variable support for unix sockets in fastcgi_pass and proxy_pass
Igor Sysoev <igor@sysoev.ru>
parents: 2204
diff changeset
337 if (ur->sockaddr) {
5720
ab540dd44528 Upstream: simplified some code that accesses peers.
Ruslan Ermilov <ru@nginx.com>
parents: 5717
diff changeset
338 peer[0].sockaddr = ur->sockaddr;
ab540dd44528 Upstream: simplified some code that accesses peers.
Ruslan Ermilov <ru@nginx.com>
parents: 5717
diff changeset
339 peer[0].socklen = ur->socklen;
6785
d1d0dd69a419 Upstream: added the ngx_http_upstream_resolved_t.name field.
Ruslan Ermilov <ru@nginx.com>
parents: 6712
diff changeset
340 peer[0].name = ur->name.data ? ur->name : ur->host;
5720
ab540dd44528 Upstream: simplified some code that accesses peers.
Ruslan Ermilov <ru@nginx.com>
parents: 5717
diff changeset
341 peer[0].weight = 1;
ab540dd44528 Upstream: simplified some code that accesses peers.
Ruslan Ermilov <ru@nginx.com>
parents: 5717
diff changeset
342 peer[0].effective_weight = 1;
ab540dd44528 Upstream: simplified some code that accesses peers.
Ruslan Ermilov <ru@nginx.com>
parents: 5717
diff changeset
343 peer[0].current_weight = 0;
6705
29bf0dbc0a77 Upstream: max_conns.
Ruslan Ermilov <ru@nginx.com>
parents: 6704
diff changeset
344 peer[0].max_conns = 0;
5720
ab540dd44528 Upstream: simplified some code that accesses peers.
Ruslan Ermilov <ru@nginx.com>
parents: 5717
diff changeset
345 peer[0].max_fails = 1;
ab540dd44528 Upstream: simplified some code that accesses peers.
Ruslan Ermilov <ru@nginx.com>
parents: 5717
diff changeset
346 peer[0].fail_timeout = 10;
6100
c44459611d91 Upstream: store peers as a linked list.
Ruslan Ermilov <ru@nginx.com>
parents: 6099
diff changeset
347 peers->peer = peer;
1658
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1568
diff changeset
348
2422
7af1e5fe102c variable support for unix sockets in fastcgi_pass and proxy_pass
Igor Sysoev <igor@sysoev.ru>
parents: 2204
diff changeset
349 } else {
6100
c44459611d91 Upstream: store peers as a linked list.
Ruslan Ermilov <ru@nginx.com>
parents: 6099
diff changeset
350 peerp = &peers->peer;
2422
7af1e5fe102c variable support for unix sockets in fastcgi_pass and proxy_pass
Igor Sysoev <igor@sysoev.ru>
parents: 2204
diff changeset
351
7af1e5fe102c variable support for unix sockets in fastcgi_pass and proxy_pass
Igor Sysoev <igor@sysoev.ru>
parents: 2204
diff changeset
352 for (i = 0; i < ur->naddrs; i++) {
1658
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1568
diff changeset
353
5475
07dd5bd222ac Changed resolver API to use ngx_addr_t.
Ruslan Ermilov <ru@nginx.com>
parents: 5454
diff changeset
354 socklen = ur->addrs[i].socklen;
07dd5bd222ac Changed resolver API to use ngx_addr_t.
Ruslan Ermilov <ru@nginx.com>
parents: 5454
diff changeset
355
07dd5bd222ac Changed resolver API to use ngx_addr_t.
Ruslan Ermilov <ru@nginx.com>
parents: 5454
diff changeset
356 sockaddr = ngx_palloc(r->pool, socklen);
07dd5bd222ac Changed resolver API to use ngx_addr_t.
Ruslan Ermilov <ru@nginx.com>
parents: 5454
diff changeset
357 if (sockaddr == NULL) {
07dd5bd222ac Changed resolver API to use ngx_addr_t.
Ruslan Ermilov <ru@nginx.com>
parents: 5454
diff changeset
358 return NGX_ERROR;
07dd5bd222ac Changed resolver API to use ngx_addr_t.
Ruslan Ermilov <ru@nginx.com>
parents: 5454
diff changeset
359 }
07dd5bd222ac Changed resolver API to use ngx_addr_t.
Ruslan Ermilov <ru@nginx.com>
parents: 5454
diff changeset
360
07dd5bd222ac Changed resolver API to use ngx_addr_t.
Ruslan Ermilov <ru@nginx.com>
parents: 5454
diff changeset
361 ngx_memcpy(sockaddr, ur->addrs[i].sockaddr, socklen);
6593
b3b7e33083ac Introduced ngx_inet_get_port() and ngx_inet_set_port() functions.
Roman Arutyunyan <arut@nginx.com>
parents: 6474
diff changeset
362 ngx_inet_set_port(sockaddr, ur->port);
5475
07dd5bd222ac Changed resolver API to use ngx_addr_t.
Ruslan Ermilov <ru@nginx.com>
parents: 5454
diff changeset
363
07dd5bd222ac Changed resolver API to use ngx_addr_t.
Ruslan Ermilov <ru@nginx.com>
parents: 5454
diff changeset
364 p = ngx_pnalloc(r->pool, NGX_SOCKADDR_STRLEN);
2422
7af1e5fe102c variable support for unix sockets in fastcgi_pass and proxy_pass
Igor Sysoev <igor@sysoev.ru>
parents: 2204
diff changeset
365 if (p == NULL) {
7af1e5fe102c variable support for unix sockets in fastcgi_pass and proxy_pass
Igor Sysoev <igor@sysoev.ru>
parents: 2204
diff changeset
366 return NGX_ERROR;
7af1e5fe102c variable support for unix sockets in fastcgi_pass and proxy_pass
Igor Sysoev <igor@sysoev.ru>
parents: 2204
diff changeset
367 }
1658
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1568
diff changeset
368
5475
07dd5bd222ac Changed resolver API to use ngx_addr_t.
Ruslan Ermilov <ru@nginx.com>
parents: 5454
diff changeset
369 len = ngx_sock_ntop(sockaddr, socklen, p, NGX_SOCKADDR_STRLEN, 1);
1658
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1568
diff changeset
370
5720
ab540dd44528 Upstream: simplified some code that accesses peers.
Ruslan Ermilov <ru@nginx.com>
parents: 5717
diff changeset
371 peer[i].sockaddr = sockaddr;
ab540dd44528 Upstream: simplified some code that accesses peers.
Ruslan Ermilov <ru@nginx.com>
parents: 5717
diff changeset
372 peer[i].socklen = socklen;
ab540dd44528 Upstream: simplified some code that accesses peers.
Ruslan Ermilov <ru@nginx.com>
parents: 5717
diff changeset
373 peer[i].name.len = len;
ab540dd44528 Upstream: simplified some code that accesses peers.
Ruslan Ermilov <ru@nginx.com>
parents: 5717
diff changeset
374 peer[i].name.data = p;
ab540dd44528 Upstream: simplified some code that accesses peers.
Ruslan Ermilov <ru@nginx.com>
parents: 5717
diff changeset
375 peer[i].weight = 1;
ab540dd44528 Upstream: simplified some code that accesses peers.
Ruslan Ermilov <ru@nginx.com>
parents: 5717
diff changeset
376 peer[i].effective_weight = 1;
ab540dd44528 Upstream: simplified some code that accesses peers.
Ruslan Ermilov <ru@nginx.com>
parents: 5717
diff changeset
377 peer[i].current_weight = 0;
6705
29bf0dbc0a77 Upstream: max_conns.
Ruslan Ermilov <ru@nginx.com>
parents: 6704
diff changeset
378 peer[i].max_conns = 0;
5720
ab540dd44528 Upstream: simplified some code that accesses peers.
Ruslan Ermilov <ru@nginx.com>
parents: 5717
diff changeset
379 peer[i].max_fails = 1;
ab540dd44528 Upstream: simplified some code that accesses peers.
Ruslan Ermilov <ru@nginx.com>
parents: 5717
diff changeset
380 peer[i].fail_timeout = 10;
6100
c44459611d91 Upstream: store peers as a linked list.
Ruslan Ermilov <ru@nginx.com>
parents: 6099
diff changeset
381 *peerp = &peer[i];
c44459611d91 Upstream: store peers as a linked list.
Ruslan Ermilov <ru@nginx.com>
parents: 6099
diff changeset
382 peerp = &peer[i].next;
2422
7af1e5fe102c variable support for unix sockets in fastcgi_pass and proxy_pass
Igor Sysoev <igor@sysoev.ru>
parents: 2204
diff changeset
383 }
1658
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1568
diff changeset
384 }
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1568
diff changeset
385
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1568
diff changeset
386 rrp->peers = peers;
6100
c44459611d91 Upstream: store peers as a linked list.
Ruslan Ermilov <ru@nginx.com>
parents: 6099
diff changeset
387 rrp->current = NULL;
6712
fd5c2781460b Modules compatibility: upstream config field.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6705
diff changeset
388 rrp->config = 0;
1658
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1568
diff changeset
389
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1568
diff changeset
390 if (rrp->peers->number <= 8 * sizeof(uintptr_t)) {
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1568
diff changeset
391 rrp->tried = &rrp->data;
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1568
diff changeset
392 rrp->data = 0;
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1568
diff changeset
393
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1568
diff changeset
394 } else {
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1568
diff changeset
395 n = (rrp->peers->number + (8 * sizeof(uintptr_t) - 1))
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1568
diff changeset
396 / (8 * sizeof(uintptr_t));
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1568
diff changeset
397
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1568
diff changeset
398 rrp->tried = ngx_pcalloc(r->pool, n * sizeof(uintptr_t));
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1568
diff changeset
399 if (rrp->tried == NULL) {
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1568
diff changeset
400 return NGX_ERROR;
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1568
diff changeset
401 }
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1568
diff changeset
402 }
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1568
diff changeset
403
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1568
diff changeset
404 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
405 r->upstream->peer.free = ngx_http_upstream_free_round_robin_peer;
5831
575175ebf4b4 Upstream: included backup peers into peer.tries.
Roman Arutyunyan <arut@nginx.com>
parents: 5756
diff changeset
406 r->upstream->peer.tries = ngx_http_upstream_tries(rrp->peers);
1658
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1568
diff changeset
407 #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
408 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
409 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
410 #endif
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1568
diff changeset
411
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1568
diff changeset
412 return NGX_OK;
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1568
diff changeset
413 }
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1568
diff changeset
414
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1568
diff changeset
415
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1568
diff changeset
416 ngx_int_t
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
417 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
418 {
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
419 ngx_http_upstream_rr_peer_data_t *rrp = data;
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
420
1378
0be898896d1a backup upstream servers
Igor Sysoev <igor@sysoev.ru>
parents: 1376
diff changeset
421 ngx_int_t rc;
0be898896d1a backup upstream servers
Igor Sysoev <igor@sysoev.ru>
parents: 1376
diff changeset
422 ngx_uint_t i, n;
0be898896d1a backup upstream servers
Igor Sysoev <igor@sysoev.ru>
parents: 1376
diff changeset
423 ngx_http_upstream_rr_peer_t *peer;
0be898896d1a backup upstream servers
Igor Sysoev <igor@sysoev.ru>
parents: 1376
diff changeset
424 ngx_http_upstream_rr_peers_t *peers;
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
425
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
426 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, pc->log, 0,
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
427 "get rr peer, try: %ui", pc->tries);
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
428
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
429 pc->cached = 0;
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
430 pc->connection = NULL;
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
431
5720
ab540dd44528 Upstream: simplified some code that accesses peers.
Ruslan Ermilov <ru@nginx.com>
parents: 5717
diff changeset
432 peers = rrp->peers;
6102
3264b7828f72 Upstreams: locking.
Ruslan Ermilov <ru@nginx.com>
parents: 6100
diff changeset
433 ngx_http_upstream_rr_peers_wlock(peers);
5720
ab540dd44528 Upstream: simplified some code that accesses peers.
Ruslan Ermilov <ru@nginx.com>
parents: 5717
diff changeset
434
ab540dd44528 Upstream: simplified some code that accesses peers.
Ruslan Ermilov <ru@nginx.com>
parents: 5717
diff changeset
435 if (peers->single) {
6100
c44459611d91 Upstream: store peers as a linked list.
Ruslan Ermilov <ru@nginx.com>
parents: 6099
diff changeset
436 peer = peers->peer;
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
437
4914
dcb853acae97 Upstream: honor the "down" flag for a single server.
Ruslan Ermilov <ru@nginx.com>
parents: 4655
diff changeset
438 if (peer->down) {
dcb853acae97 Upstream: honor the "down" flag for a single server.
Ruslan Ermilov <ru@nginx.com>
parents: 4655
diff changeset
439 goto failed;
dcb853acae97 Upstream: honor the "down" flag for a single server.
Ruslan Ermilov <ru@nginx.com>
parents: 4655
diff changeset
440 }
dcb853acae97 Upstream: honor the "down" flag for a single server.
Ruslan Ermilov <ru@nginx.com>
parents: 4655
diff changeset
441
6705
29bf0dbc0a77 Upstream: max_conns.
Ruslan Ermilov <ru@nginx.com>
parents: 6704
diff changeset
442 if (peer->max_conns && peer->conns >= peer->max_conns) {
29bf0dbc0a77 Upstream: max_conns.
Ruslan Ermilov <ru@nginx.com>
parents: 6704
diff changeset
443 goto failed;
29bf0dbc0a77 Upstream: max_conns.
Ruslan Ermilov <ru@nginx.com>
parents: 6704
diff changeset
444 }
29bf0dbc0a77 Upstream: max_conns.
Ruslan Ermilov <ru@nginx.com>
parents: 6704
diff changeset
445
6100
c44459611d91 Upstream: store peers as a linked list.
Ruslan Ermilov <ru@nginx.com>
parents: 6099
diff changeset
446 rrp->current = peer;
c44459611d91 Upstream: store peers as a linked list.
Ruslan Ermilov <ru@nginx.com>
parents: 6099
diff changeset
447
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
448 } else {
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
449
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
450 /* there are several peers */
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
451
4621
c90801720a0c Upstream: smooth weighted round-robin balancing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4569
diff changeset
452 peer = ngx_http_upstream_get_peer(rrp);
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
453
4621
c90801720a0c Upstream: smooth weighted round-robin balancing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4569
diff changeset
454 if (peer == NULL) {
c90801720a0c Upstream: smooth weighted round-robin balancing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4569
diff changeset
455 goto failed;
884
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
4621
c90801720a0c Upstream: smooth weighted round-robin balancing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4569
diff changeset
458 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, pc->log, 0,
6100
c44459611d91 Upstream: store peers as a linked list.
Ruslan Ermilov <ru@nginx.com>
parents: 6099
diff changeset
459 "get rr peer, current: %p %i",
c44459611d91 Upstream: store peers as a linked list.
Ruslan Ermilov <ru@nginx.com>
parents: 6099
diff changeset
460 peer, peer->current_weight);
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
461 }
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
462
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
463 pc->sockaddr = peer->sockaddr;
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
464 pc->socklen = peer->socklen;
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
465 pc->name = &peer->name;
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
466
6099
6ff0ebd6fbf4 Upstream: track the number of active connections to upstreams.
Ruslan Ermilov <ru@nginx.com>
parents: 5831
diff changeset
467 peer->conns++;
6ff0ebd6fbf4 Upstream: track the number of active connections to upstreams.
Ruslan Ermilov <ru@nginx.com>
parents: 5831
diff changeset
468
6102
3264b7828f72 Upstreams: locking.
Ruslan Ermilov <ru@nginx.com>
parents: 6100
diff changeset
469 ngx_http_upstream_rr_peers_unlock(peers);
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
470
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
471 return NGX_OK;
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 failed:
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
474
1378
0be898896d1a backup upstream servers
Igor Sysoev <igor@sysoev.ru>
parents: 1376
diff changeset
475 if (peers->next) {
0be898896d1a backup upstream servers
Igor Sysoev <igor@sysoev.ru>
parents: 1376
diff changeset
476
0be898896d1a backup upstream servers
Igor Sysoev <igor@sysoev.ru>
parents: 1376
diff changeset
477 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
478
0be898896d1a backup upstream servers
Igor Sysoev <igor@sysoev.ru>
parents: 1376
diff changeset
479 rrp->peers = peers->next;
0be898896d1a backup upstream servers
Igor Sysoev <igor@sysoev.ru>
parents: 1376
diff changeset
480
4991
a384c60d55f3 Upstream: fixed state resetting when switching to backup servers.
Valentin Bartenev <vbart@nginx.com>
parents: 4914
diff changeset
481 n = (rrp->peers->number + (8 * sizeof(uintptr_t) - 1))
a384c60d55f3 Upstream: fixed state resetting when switching to backup servers.
Valentin Bartenev <vbart@nginx.com>
parents: 4914
diff changeset
482 / (8 * sizeof(uintptr_t));
a384c60d55f3 Upstream: fixed state resetting when switching to backup servers.
Valentin Bartenev <vbart@nginx.com>
parents: 4914
diff changeset
483
1389
ab553c23bd3a fix long loop
Igor Sysoev <igor@sysoev.ru>
parents: 1379
diff changeset
484 for (i = 0; i < n; i++) {
6474
Ruslan Ermilov <ru@nginx.com>
parents: 6154
diff changeset
485 rrp->tried[i] = 0;
1378
0be898896d1a backup upstream servers
Igor Sysoev <igor@sysoev.ru>
parents: 1376
diff changeset
486 }
0be898896d1a backup upstream servers
Igor Sysoev <igor@sysoev.ru>
parents: 1376
diff changeset
487
6102
3264b7828f72 Upstreams: locking.
Ruslan Ermilov <ru@nginx.com>
parents: 6100
diff changeset
488 ngx_http_upstream_rr_peers_unlock(peers);
3264b7828f72 Upstreams: locking.
Ruslan Ermilov <ru@nginx.com>
parents: 6100
diff changeset
489
1378
0be898896d1a backup upstream servers
Igor Sysoev <igor@sysoev.ru>
parents: 1376
diff changeset
490 rc = ngx_http_upstream_get_round_robin_peer(pc, rrp);
0be898896d1a backup upstream servers
Igor Sysoev <igor@sysoev.ru>
parents: 1376
diff changeset
491
0be898896d1a backup upstream servers
Igor Sysoev <igor@sysoev.ru>
parents: 1376
diff changeset
492 if (rc != NGX_BUSY) {
0be898896d1a backup upstream servers
Igor Sysoev <igor@sysoev.ru>
parents: 1376
diff changeset
493 return rc;
0be898896d1a backup upstream servers
Igor Sysoev <igor@sysoev.ru>
parents: 1376
diff changeset
494 }
0be898896d1a backup upstream servers
Igor Sysoev <igor@sysoev.ru>
parents: 1376
diff changeset
495
6102
3264b7828f72 Upstreams: locking.
Ruslan Ermilov <ru@nginx.com>
parents: 6100
diff changeset
496 ngx_http_upstream_rr_peers_wlock(peers);
1378
0be898896d1a backup upstream servers
Igor Sysoev <igor@sysoev.ru>
parents: 1376
diff changeset
497 }
0be898896d1a backup upstream servers
Igor Sysoev <igor@sysoev.ru>
parents: 1376
diff changeset
498
6102
3264b7828f72 Upstreams: locking.
Ruslan Ermilov <ru@nginx.com>
parents: 6100
diff changeset
499 ngx_http_upstream_rr_peers_unlock(peers);
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
500
1378
0be898896d1a backup upstream servers
Igor Sysoev <igor@sysoev.ru>
parents: 1376
diff changeset
501 pc->name = peers->name;
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
502
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
503 return NGX_BUSY;
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
4621
c90801720a0c Upstream: smooth weighted round-robin balancing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4569
diff changeset
507 static ngx_http_upstream_rr_peer_t *
c90801720a0c Upstream: smooth weighted round-robin balancing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4569
diff changeset
508 ngx_http_upstream_get_peer(ngx_http_upstream_rr_peer_data_t *rrp)
1344
8f5b5641966c fair upstream weight balancer
Igor Sysoev <igor@sysoev.ru>
parents: 1284
diff changeset
509 {
4621
c90801720a0c Upstream: smooth weighted round-robin balancing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4569
diff changeset
510 time_t now;
c90801720a0c Upstream: smooth weighted round-robin balancing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4569
diff changeset
511 uintptr_t m;
c90801720a0c Upstream: smooth weighted round-robin balancing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4569
diff changeset
512 ngx_int_t total;
6100
c44459611d91 Upstream: store peers as a linked list.
Ruslan Ermilov <ru@nginx.com>
parents: 6099
diff changeset
513 ngx_uint_t i, n, p;
4621
c90801720a0c Upstream: smooth weighted round-robin balancing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4569
diff changeset
514 ngx_http_upstream_rr_peer_t *peer, *best;
1344
8f5b5641966c fair upstream weight balancer
Igor Sysoev <igor@sysoev.ru>
parents: 1284
diff changeset
515
4621
c90801720a0c Upstream: smooth weighted round-robin balancing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4569
diff changeset
516 now = ngx_time();
1344
8f5b5641966c fair upstream weight balancer
Igor Sysoev <igor@sysoev.ru>
parents: 1284
diff changeset
517
4621
c90801720a0c Upstream: smooth weighted round-robin balancing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4569
diff changeset
518 best = NULL;
c90801720a0c Upstream: smooth weighted round-robin balancing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4569
diff changeset
519 total = 0;
1344
8f5b5641966c fair upstream weight balancer
Igor Sysoev <igor@sysoev.ru>
parents: 1284
diff changeset
520
6100
c44459611d91 Upstream: store peers as a linked list.
Ruslan Ermilov <ru@nginx.com>
parents: 6099
diff changeset
521 #if (NGX_SUPPRESS_WARN)
c44459611d91 Upstream: store peers as a linked list.
Ruslan Ermilov <ru@nginx.com>
parents: 6099
diff changeset
522 p = 0;
c44459611d91 Upstream: store peers as a linked list.
Ruslan Ermilov <ru@nginx.com>
parents: 6099
diff changeset
523 #endif
c44459611d91 Upstream: store peers as a linked list.
Ruslan Ermilov <ru@nginx.com>
parents: 6099
diff changeset
524
c44459611d91 Upstream: store peers as a linked list.
Ruslan Ermilov <ru@nginx.com>
parents: 6099
diff changeset
525 for (peer = rrp->peers->peer, i = 0;
c44459611d91 Upstream: store peers as a linked list.
Ruslan Ermilov <ru@nginx.com>
parents: 6099
diff changeset
526 peer;
c44459611d91 Upstream: store peers as a linked list.
Ruslan Ermilov <ru@nginx.com>
parents: 6099
diff changeset
527 peer = peer->next, i++)
c44459611d91 Upstream: store peers as a linked list.
Ruslan Ermilov <ru@nginx.com>
parents: 6099
diff changeset
528 {
4621
c90801720a0c Upstream: smooth weighted round-robin balancing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4569
diff changeset
529 n = i / (8 * sizeof(uintptr_t));
c90801720a0c Upstream: smooth weighted round-robin balancing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4569
diff changeset
530 m = (uintptr_t) 1 << i % (8 * sizeof(uintptr_t));
1344
8f5b5641966c fair upstream weight balancer
Igor Sysoev <igor@sysoev.ru>
parents: 1284
diff changeset
531
4621
c90801720a0c Upstream: smooth weighted round-robin balancing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4569
diff changeset
532 if (rrp->tried[n] & m) {
c90801720a0c Upstream: smooth weighted round-robin balancing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4569
diff changeset
533 continue;
c90801720a0c Upstream: smooth weighted round-robin balancing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4569
diff changeset
534 }
1344
8f5b5641966c fair upstream weight balancer
Igor Sysoev <igor@sysoev.ru>
parents: 1284
diff changeset
535
4621
c90801720a0c Upstream: smooth weighted round-robin balancing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4569
diff changeset
536 if (peer->down) {
c90801720a0c Upstream: smooth weighted round-robin balancing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4569
diff changeset
537 continue;
1344
8f5b5641966c fair upstream weight balancer
Igor Sysoev <igor@sysoev.ru>
parents: 1284
diff changeset
538 }
8f5b5641966c fair upstream weight balancer
Igor Sysoev <igor@sysoev.ru>
parents: 1284
diff changeset
539
4621
c90801720a0c Upstream: smooth weighted round-robin balancing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4569
diff changeset
540 if (peer->max_fails
c90801720a0c Upstream: smooth weighted round-robin balancing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4569
diff changeset
541 && peer->fails >= peer->max_fails
c90801720a0c Upstream: smooth weighted round-robin balancing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4569
diff changeset
542 && now - peer->checked <= peer->fail_timeout)
c90801720a0c Upstream: smooth weighted round-robin balancing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4569
diff changeset
543 {
c90801720a0c Upstream: smooth weighted round-robin balancing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4569
diff changeset
544 continue;
c90801720a0c Upstream: smooth weighted round-robin balancing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4569
diff changeset
545 }
c90801720a0c Upstream: smooth weighted round-robin balancing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4569
diff changeset
546
6705
29bf0dbc0a77 Upstream: max_conns.
Ruslan Ermilov <ru@nginx.com>
parents: 6704
diff changeset
547 if (peer->max_conns && peer->conns >= peer->max_conns) {
29bf0dbc0a77 Upstream: max_conns.
Ruslan Ermilov <ru@nginx.com>
parents: 6704
diff changeset
548 continue;
29bf0dbc0a77 Upstream: max_conns.
Ruslan Ermilov <ru@nginx.com>
parents: 6704
diff changeset
549 }
29bf0dbc0a77 Upstream: max_conns.
Ruslan Ermilov <ru@nginx.com>
parents: 6704
diff changeset
550
4621
c90801720a0c Upstream: smooth weighted round-robin balancing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4569
diff changeset
551 peer->current_weight += peer->effective_weight;
c90801720a0c Upstream: smooth weighted round-robin balancing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4569
diff changeset
552 total += peer->effective_weight;
c90801720a0c Upstream: smooth weighted round-robin balancing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4569
diff changeset
553
c90801720a0c Upstream: smooth weighted round-robin balancing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4569
diff changeset
554 if (peer->effective_weight < peer->weight) {
c90801720a0c Upstream: smooth weighted round-robin balancing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4569
diff changeset
555 peer->effective_weight++;
4010
74a93d3fdd85 Fixing cpu hog with all upstream servers marked "down".
Maxim Dounin <mdounin@mdounin.ru>
parents: 3964
diff changeset
556 }
74a93d3fdd85 Fixing cpu hog with all upstream servers marked "down".
Maxim Dounin <mdounin@mdounin.ru>
parents: 3964
diff changeset
557
4621
c90801720a0c Upstream: smooth weighted round-robin balancing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4569
diff changeset
558 if (best == NULL || peer->current_weight > best->current_weight) {
c90801720a0c Upstream: smooth weighted round-robin balancing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4569
diff changeset
559 best = peer;
6100
c44459611d91 Upstream: store peers as a linked list.
Ruslan Ermilov <ru@nginx.com>
parents: 6099
diff changeset
560 p = i;
1344
8f5b5641966c fair upstream weight balancer
Igor Sysoev <igor@sysoev.ru>
parents: 1284
diff changeset
561 }
8f5b5641966c fair upstream weight balancer
Igor Sysoev <igor@sysoev.ru>
parents: 1284
diff changeset
562 }
4621
c90801720a0c Upstream: smooth weighted round-robin balancing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4569
diff changeset
563
c90801720a0c Upstream: smooth weighted round-robin balancing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4569
diff changeset
564 if (best == NULL) {
c90801720a0c Upstream: smooth weighted round-robin balancing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4569
diff changeset
565 return NULL;
c90801720a0c Upstream: smooth weighted round-robin balancing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4569
diff changeset
566 }
c90801720a0c Upstream: smooth weighted round-robin balancing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4569
diff changeset
567
6100
c44459611d91 Upstream: store peers as a linked list.
Ruslan Ermilov <ru@nginx.com>
parents: 6099
diff changeset
568 rrp->current = best;
4621
c90801720a0c Upstream: smooth weighted round-robin balancing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4569
diff changeset
569
6100
c44459611d91 Upstream: store peers as a linked list.
Ruslan Ermilov <ru@nginx.com>
parents: 6099
diff changeset
570 n = p / (8 * sizeof(uintptr_t));
c44459611d91 Upstream: store peers as a linked list.
Ruslan Ermilov <ru@nginx.com>
parents: 6099
diff changeset
571 m = (uintptr_t) 1 << p % (8 * sizeof(uintptr_t));
4621
c90801720a0c Upstream: smooth weighted round-robin balancing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4569
diff changeset
572
c90801720a0c Upstream: smooth weighted round-robin balancing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4569
diff changeset
573 rrp->tried[n] |= m;
c90801720a0c Upstream: smooth weighted round-robin balancing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4569
diff changeset
574
c90801720a0c Upstream: smooth weighted round-robin balancing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4569
diff changeset
575 best->current_weight -= total;
5220
1d68b502088c Upstream: fixed fail_timeout and max_fails > 1.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5136
diff changeset
576
1d68b502088c Upstream: fixed fail_timeout and max_fails > 1.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5136
diff changeset
577 if (now - best->checked > best->fail_timeout) {
1d68b502088c Upstream: fixed fail_timeout and max_fails > 1.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5136
diff changeset
578 best->checked = now;
1d68b502088c Upstream: fixed fail_timeout and max_fails > 1.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5136
diff changeset
579 }
4621
c90801720a0c Upstream: smooth weighted round-robin balancing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4569
diff changeset
580
c90801720a0c Upstream: smooth weighted round-robin balancing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4569
diff changeset
581 return best;
1344
8f5b5641966c fair upstream weight balancer
Igor Sysoev <igor@sysoev.ru>
parents: 1284
diff changeset
582 }
8f5b5641966c fair upstream weight balancer
Igor Sysoev <igor@sysoev.ru>
parents: 1284
diff changeset
583
8f5b5641966c fair upstream weight balancer
Igor Sysoev <igor@sysoev.ru>
parents: 1284
diff changeset
584
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
585 void
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
586 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
587 ngx_uint_t state)
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 ngx_http_upstream_rr_peer_data_t *rrp = data;
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
590
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
591 time_t now;
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
592 ngx_http_upstream_rr_peer_t *peer;
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
593
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
594 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, pc->log, 0,
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
595 "free rr peer %ui %ui", pc->tries, state);
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
596
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
597 /* TODO: NGX_PEER_KEEPALIVE */
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
598
6100
c44459611d91 Upstream: store peers as a linked list.
Ruslan Ermilov <ru@nginx.com>
parents: 6099
diff changeset
599 peer = rrp->current;
6099
6ff0ebd6fbf4 Upstream: track the number of active connections to upstreams.
Ruslan Ermilov <ru@nginx.com>
parents: 5831
diff changeset
600
6114
4a640716f4e2 Upstream: fixed unlocked access to peer->conns.
Ruslan Ermilov <ru@nginx.com>
parents: 6103
diff changeset
601 ngx_http_upstream_rr_peers_rlock(rrp->peers);
4a640716f4e2 Upstream: fixed unlocked access to peer->conns.
Ruslan Ermilov <ru@nginx.com>
parents: 6103
diff changeset
602 ngx_http_upstream_rr_peer_lock(rrp->peers, peer);
4a640716f4e2 Upstream: fixed unlocked access to peer->conns.
Ruslan Ermilov <ru@nginx.com>
parents: 6103
diff changeset
603
1378
0be898896d1a backup upstream servers
Igor Sysoev <igor@sysoev.ru>
parents: 1376
diff changeset
604 if (rrp->peers->single) {
6099
6ff0ebd6fbf4 Upstream: track the number of active connections to upstreams.
Ruslan Ermilov <ru@nginx.com>
parents: 5831
diff changeset
605
6ff0ebd6fbf4 Upstream: track the number of active connections to upstreams.
Ruslan Ermilov <ru@nginx.com>
parents: 5831
diff changeset
606 peer->conns--;
6ff0ebd6fbf4 Upstream: track the number of active connections to upstreams.
Ruslan Ermilov <ru@nginx.com>
parents: 5831
diff changeset
607
6114
4a640716f4e2 Upstream: fixed unlocked access to peer->conns.
Ruslan Ermilov <ru@nginx.com>
parents: 6103
diff changeset
608 ngx_http_upstream_rr_peer_unlock(rrp->peers, peer);
4a640716f4e2 Upstream: fixed unlocked access to peer->conns.
Ruslan Ermilov <ru@nginx.com>
parents: 6103
diff changeset
609 ngx_http_upstream_rr_peers_unlock(rrp->peers);
4a640716f4e2 Upstream: fixed unlocked access to peer->conns.
Ruslan Ermilov <ru@nginx.com>
parents: 6103
diff changeset
610
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
611 pc->tries = 0;
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
612 return;
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
613 }
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
614
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
615 if (state & NGX_PEER_FAILED) {
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
616 now = ngx_time();
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
617
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
618 peer->fails++;
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
619 peer->accessed = now;
4207
4fc91bae6f83 Better recheck of dead upstream servers.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4011
diff changeset
620 peer->checked = now;
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
621
2204
70a2bcc7e307 fix divide by zero if max_fails=0
Igor Sysoev <igor@sysoev.ru>
parents: 2197
diff changeset
622 if (peer->max_fails) {
4621
c90801720a0c Upstream: smooth weighted round-robin balancing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4569
diff changeset
623 peer->effective_weight -= peer->weight / peer->max_fails;
6154
cca856715722 Upstream: report to error_log when max_fails is reached.
Ruslan Ermilov <ru@nginx.com>
parents: 6114
diff changeset
624
cca856715722 Upstream: report to error_log when max_fails is reached.
Ruslan Ermilov <ru@nginx.com>
parents: 6114
diff changeset
625 if (peer->fails >= peer->max_fails) {
cca856715722 Upstream: report to error_log when max_fails is reached.
Ruslan Ermilov <ru@nginx.com>
parents: 6114
diff changeset
626 ngx_log_error(NGX_LOG_WARN, pc->log, 0,
cca856715722 Upstream: report to error_log when max_fails is reached.
Ruslan Ermilov <ru@nginx.com>
parents: 6114
diff changeset
627 "upstream server temporarily disabled");
cca856715722 Upstream: report to error_log when max_fails is reached.
Ruslan Ermilov <ru@nginx.com>
parents: 6114
diff changeset
628 }
2204
70a2bcc7e307 fix divide by zero if max_fails=0
Igor Sysoev <igor@sysoev.ru>
parents: 2197
diff changeset
629 }
1344
8f5b5641966c fair upstream weight balancer
Igor Sysoev <igor@sysoev.ru>
parents: 1284
diff changeset
630
8f5b5641966c fair upstream weight balancer
Igor Sysoev <igor@sysoev.ru>
parents: 1284
diff changeset
631 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, pc->log, 0,
6100
c44459611d91 Upstream: store peers as a linked list.
Ruslan Ermilov <ru@nginx.com>
parents: 6099
diff changeset
632 "free rr peer failed: %p %i",
c44459611d91 Upstream: store peers as a linked list.
Ruslan Ermilov <ru@nginx.com>
parents: 6099
diff changeset
633 peer, peer->effective_weight);
1344
8f5b5641966c fair upstream weight balancer
Igor Sysoev <igor@sysoev.ru>
parents: 1284
diff changeset
634
4621
c90801720a0c Upstream: smooth weighted round-robin balancing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4569
diff changeset
635 if (peer->effective_weight < 0) {
c90801720a0c Upstream: smooth weighted round-robin balancing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4569
diff changeset
636 peer->effective_weight = 0;
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
637 }
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
638
4207
4fc91bae6f83 Better recheck of dead upstream servers.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4011
diff changeset
639 } else {
4fc91bae6f83 Better recheck of dead upstream servers.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4011
diff changeset
640
4fc91bae6f83 Better recheck of dead upstream servers.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4011
diff changeset
641 /* mark peer live if check passed */
4fc91bae6f83 Better recheck of dead upstream servers.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4011
diff changeset
642
4fc91bae6f83 Better recheck of dead upstream servers.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4011
diff changeset
643 if (peer->accessed < peer->checked) {
4fc91bae6f83 Better recheck of dead upstream servers.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4011
diff changeset
644 peer->fails = 0;
4fc91bae6f83 Better recheck of dead upstream servers.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4011
diff changeset
645 }
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
646 }
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
647
6099
6ff0ebd6fbf4 Upstream: track the number of active connections to upstreams.
Ruslan Ermilov <ru@nginx.com>
parents: 5831
diff changeset
648 peer->conns--;
6ff0ebd6fbf4 Upstream: track the number of active connections to upstreams.
Ruslan Ermilov <ru@nginx.com>
parents: 5831
diff changeset
649
6102
3264b7828f72 Upstreams: locking.
Ruslan Ermilov <ru@nginx.com>
parents: 6100
diff changeset
650 ngx_http_upstream_rr_peer_unlock(rrp->peers, peer);
3264b7828f72 Upstreams: locking.
Ruslan Ermilov <ru@nginx.com>
parents: 6100
diff changeset
651 ngx_http_upstream_rr_peers_unlock(rrp->peers);
3264b7828f72 Upstreams: locking.
Ruslan Ermilov <ru@nginx.com>
parents: 6100
diff changeset
652
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
653 if (pc->tries) {
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
654 pc->tries--;
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 }
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
657
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 #if (NGX_HTTP_SSL)
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
660
1284
be2b895d31e0 fix segfault when session was freed twice
Igor Sysoev <igor@sysoev.ru>
parents: 1206
diff changeset
661 ngx_int_t
be2b895d31e0 fix segfault when session was freed twice
Igor Sysoev <igor@sysoev.ru>
parents: 1206
diff changeset
662 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
663 void *data)
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
664 {
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
665 ngx_http_upstream_rr_peer_data_t *rrp = data;
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
666
6103
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents: 6102
diff changeset
667 ngx_int_t rc;
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents: 6102
diff changeset
668 ngx_ssl_session_t *ssl_session;
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents: 6102
diff changeset
669 ngx_http_upstream_rr_peer_t *peer;
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents: 6102
diff changeset
670 #if (NGX_HTTP_UPSTREAM_ZONE)
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents: 6102
diff changeset
671 int len;
7509
b99cbafd51da SSL: removed OpenSSL 0.9.7 compatibility.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7320
diff changeset
672 const u_char *p;
6103
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents: 6102
diff changeset
673 ngx_http_upstream_rr_peers_t *peers;
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents: 6102
diff changeset
674 u_char buf[NGX_SSL_MAX_SESSION_SIZE];
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents: 6102
diff changeset
675 #endif
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
676
6100
c44459611d91 Upstream: store peers as a linked list.
Ruslan Ermilov <ru@nginx.com>
parents: 6099
diff changeset
677 peer = rrp->current;
1284
be2b895d31e0 fix segfault when session was freed twice
Igor Sysoev <igor@sysoev.ru>
parents: 1206
diff changeset
678
6103
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents: 6102
diff changeset
679 #if (NGX_HTTP_UPSTREAM_ZONE)
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents: 6102
diff changeset
680 peers = rrp->peers;
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents: 6102
diff changeset
681
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents: 6102
diff changeset
682 if (peers->shpool) {
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents: 6102
diff changeset
683 ngx_http_upstream_rr_peers_rlock(peers);
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents: 6102
diff changeset
684 ngx_http_upstream_rr_peer_lock(peers, peer);
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents: 6102
diff changeset
685
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents: 6102
diff changeset
686 if (peer->ssl_session == NULL) {
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents: 6102
diff changeset
687 ngx_http_upstream_rr_peer_unlock(peers, peer);
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents: 6102
diff changeset
688 ngx_http_upstream_rr_peers_unlock(peers);
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents: 6102
diff changeset
689 return NGX_OK;
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents: 6102
diff changeset
690 }
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents: 6102
diff changeset
691
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents: 6102
diff changeset
692 len = peer->ssl_session_len;
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents: 6102
diff changeset
693
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents: 6102
diff changeset
694 ngx_memcpy(buf, peer->ssl_session, len);
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents: 6102
diff changeset
695
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents: 6102
diff changeset
696 ngx_http_upstream_rr_peer_unlock(peers, peer);
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents: 6102
diff changeset
697 ngx_http_upstream_rr_peers_unlock(peers);
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents: 6102
diff changeset
698
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents: 6102
diff changeset
699 p = buf;
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents: 6102
diff changeset
700 ssl_session = d2i_SSL_SESSION(NULL, &p, len);
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents: 6102
diff changeset
701
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents: 6102
diff changeset
702 rc = ngx_ssl_set_session(pc->connection, ssl_session);
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents: 6102
diff changeset
703
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents: 6102
diff changeset
704 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, pc->log, 0,
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents: 6102
diff changeset
705 "set session: %p", ssl_session);
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents: 6102
diff changeset
706
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents: 6102
diff changeset
707 ngx_ssl_free_session(ssl_session);
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents: 6102
diff changeset
708
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents: 6102
diff changeset
709 return rc;
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents: 6102
diff changeset
710 }
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents: 6102
diff changeset
711 #endif
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents: 6102
diff changeset
712
1284
be2b895d31e0 fix segfault when session was freed twice
Igor Sysoev <igor@sysoev.ru>
parents: 1206
diff changeset
713 ssl_session = peer->ssl_session;
be2b895d31e0 fix segfault when session was freed twice
Igor Sysoev <igor@sysoev.ru>
parents: 1206
diff changeset
714
be2b895d31e0 fix segfault when session was freed twice
Igor Sysoev <igor@sysoev.ru>
parents: 1206
diff changeset
715 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
716
5756
5b7276408565 SSL: stop accessing SSL_SESSION's fields directly.
Piotr Sikora <piotr@cloudflare.com>
parents: 5720
diff changeset
717 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, pc->log, 0,
5b7276408565 SSL: stop accessing SSL_SESSION's fields directly.
Piotr Sikora <piotr@cloudflare.com>
parents: 5720
diff changeset
718 "set session: %p", ssl_session);
1284
be2b895d31e0 fix segfault when session was freed twice
Igor Sysoev <igor@sysoev.ru>
parents: 1206
diff changeset
719
be2b895d31e0 fix segfault when session was freed twice
Igor Sysoev <igor@sysoev.ru>
parents: 1206
diff changeset
720 return rc;
be2b895d31e0 fix segfault when session was freed twice
Igor Sysoev <igor@sysoev.ru>
parents: 1206
diff changeset
721 }
be2b895d31e0 fix segfault when session was freed twice
Igor Sysoev <igor@sysoev.ru>
parents: 1206
diff changeset
722
be2b895d31e0 fix segfault when session was freed twice
Igor Sysoev <igor@sysoev.ru>
parents: 1206
diff changeset
723
be2b895d31e0 fix segfault when session was freed twice
Igor Sysoev <igor@sysoev.ru>
parents: 1206
diff changeset
724 void
be2b895d31e0 fix segfault when session was freed twice
Igor Sysoev <igor@sysoev.ru>
parents: 1206
diff changeset
725 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
726 void *data)
be2b895d31e0 fix segfault when session was freed twice
Igor Sysoev <igor@sysoev.ru>
parents: 1206
diff changeset
727 {
be2b895d31e0 fix segfault when session was freed twice
Igor Sysoev <igor@sysoev.ru>
parents: 1206
diff changeset
728 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
729
6103
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents: 6102
diff changeset
730 ngx_ssl_session_t *old_ssl_session, *ssl_session;
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents: 6102
diff changeset
731 ngx_http_upstream_rr_peer_t *peer;
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents: 6102
diff changeset
732 #if (NGX_HTTP_UPSTREAM_ZONE)
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents: 6102
diff changeset
733 int len;
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents: 6102
diff changeset
734 u_char *p;
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents: 6102
diff changeset
735 ngx_http_upstream_rr_peers_t *peers;
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents: 6102
diff changeset
736 u_char buf[NGX_SSL_MAX_SESSION_SIZE];
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents: 6102
diff changeset
737 #endif
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents: 6102
diff changeset
738
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents: 6102
diff changeset
739 #if (NGX_HTTP_UPSTREAM_ZONE)
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents: 6102
diff changeset
740 peers = rrp->peers;
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents: 6102
diff changeset
741
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents: 6102
diff changeset
742 if (peers->shpool) {
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents: 6102
diff changeset
743
7320
696df3ac27ac SSL: save sessions for upstream peers using a callback function.
Sergey Kandaurov <pluknet@nginx.com>
parents: 6785
diff changeset
744 ssl_session = ngx_ssl_get0_session(pc->connection);
6103
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents: 6102
diff changeset
745
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents: 6102
diff changeset
746 if (ssl_session == NULL) {
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents: 6102
diff changeset
747 return;
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents: 6102
diff changeset
748 }
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents: 6102
diff changeset
749
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents: 6102
diff changeset
750 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, pc->log, 0,
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents: 6102
diff changeset
751 "save session: %p", ssl_session);
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents: 6102
diff changeset
752
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents: 6102
diff changeset
753 len = i2d_SSL_SESSION(ssl_session, NULL);
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents: 6102
diff changeset
754
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents: 6102
diff changeset
755 /* do not cache too big session */
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents: 6102
diff changeset
756
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents: 6102
diff changeset
757 if (len > NGX_SSL_MAX_SESSION_SIZE) {
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents: 6102
diff changeset
758 return;
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents: 6102
diff changeset
759 }
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents: 6102
diff changeset
760
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents: 6102
diff changeset
761 p = buf;
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents: 6102
diff changeset
762 (void) i2d_SSL_SESSION(ssl_session, &p);
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents: 6102
diff changeset
763
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents: 6102
diff changeset
764 peer = rrp->current;
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents: 6102
diff changeset
765
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents: 6102
diff changeset
766 ngx_http_upstream_rr_peers_rlock(peers);
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents: 6102
diff changeset
767 ngx_http_upstream_rr_peer_lock(peers, peer);
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents: 6102
diff changeset
768
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents: 6102
diff changeset
769 if (len > peer->ssl_session_len) {
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents: 6102
diff changeset
770 ngx_shmtx_lock(&peers->shpool->mutex);
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents: 6102
diff changeset
771
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents: 6102
diff changeset
772 if (peer->ssl_session) {
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents: 6102
diff changeset
773 ngx_slab_free_locked(peers->shpool, peer->ssl_session);
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents: 6102
diff changeset
774 }
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents: 6102
diff changeset
775
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents: 6102
diff changeset
776 peer->ssl_session = ngx_slab_alloc_locked(peers->shpool, len);
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents: 6102
diff changeset
777
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents: 6102
diff changeset
778 ngx_shmtx_unlock(&peers->shpool->mutex);
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents: 6102
diff changeset
779
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents: 6102
diff changeset
780 if (peer->ssl_session == NULL) {
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents: 6102
diff changeset
781 peer->ssl_session_len = 0;
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents: 6102
diff changeset
782
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents: 6102
diff changeset
783 ngx_http_upstream_rr_peer_unlock(peers, peer);
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents: 6102
diff changeset
784 ngx_http_upstream_rr_peers_unlock(peers);
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents: 6102
diff changeset
785 return;
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents: 6102
diff changeset
786 }
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents: 6102
diff changeset
787
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents: 6102
diff changeset
788 peer->ssl_session_len = len;
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents: 6102
diff changeset
789 }
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents: 6102
diff changeset
790
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents: 6102
diff changeset
791 ngx_memcpy(peer->ssl_session, buf, len);
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents: 6102
diff changeset
792
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents: 6102
diff changeset
793 ngx_http_upstream_rr_peer_unlock(peers, peer);
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents: 6102
diff changeset
794 ngx_http_upstream_rr_peers_unlock(peers);
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents: 6102
diff changeset
795
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents: 6102
diff changeset
796 return;
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents: 6102
diff changeset
797 }
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents: 6102
diff changeset
798 #endif
1284
be2b895d31e0 fix segfault when session was freed twice
Igor Sysoev <igor@sysoev.ru>
parents: 1206
diff changeset
799
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
800 ssl_session = ngx_ssl_get_session(pc->connection);
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
801
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
802 if (ssl_session == NULL) {
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
803 return;
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
804 }
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
805
5756
5b7276408565 SSL: stop accessing SSL_SESSION's fields directly.
Piotr Sikora <piotr@cloudflare.com>
parents: 5720
diff changeset
806 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, pc->log, 0,
5b7276408565 SSL: stop accessing SSL_SESSION's fields directly.
Piotr Sikora <piotr@cloudflare.com>
parents: 5720
diff changeset
807 "save session: %p", ssl_session);
1284
be2b895d31e0 fix segfault when session was freed twice
Igor Sysoev <igor@sysoev.ru>
parents: 1206
diff changeset
808
6100
c44459611d91 Upstream: store peers as a linked list.
Ruslan Ermilov <ru@nginx.com>
parents: 6099
diff changeset
809 peer = rrp->current;
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
810
1284
be2b895d31e0 fix segfault when session was freed twice
Igor Sysoev <igor@sysoev.ru>
parents: 1206
diff changeset
811 old_ssl_session = peer->ssl_session;
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
812 peer->ssl_session = ssl_session;
1284
be2b895d31e0 fix segfault when session was freed twice
Igor Sysoev <igor@sysoev.ru>
parents: 1206
diff changeset
813
be2b895d31e0 fix segfault when session was freed twice
Igor Sysoev <igor@sysoev.ru>
parents: 1206
diff changeset
814 if (old_ssl_session) {
be2b895d31e0 fix segfault when session was freed twice
Igor Sysoev <igor@sysoev.ru>
parents: 1206
diff changeset
815
5756
5b7276408565 SSL: stop accessing SSL_SESSION's fields directly.
Piotr Sikora <piotr@cloudflare.com>
parents: 5720
diff changeset
816 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, pc->log, 0,
5b7276408565 SSL: stop accessing SSL_SESSION's fields directly.
Piotr Sikora <piotr@cloudflare.com>
parents: 5720
diff changeset
817 "old session: %p", old_ssl_session);
1284
be2b895d31e0 fix segfault when session was freed twice
Igor Sysoev <igor@sysoev.ru>
parents: 1206
diff changeset
818
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
819 /* TODO: may block */
1284
be2b895d31e0 fix segfault when session was freed twice
Igor Sysoev <igor@sysoev.ru>
parents: 1206
diff changeset
820
be2b895d31e0 fix segfault when session was freed twice
Igor Sysoev <igor@sysoev.ru>
parents: 1206
diff changeset
821 ngx_ssl_free_session(old_ssl_session);
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
822 }
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
823 }
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
824
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
825
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
826 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
827 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
828 {
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
829 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
830 }
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
831
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
832
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
833 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
834 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
835 {
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
836 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
837 }
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
838
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
839 #endif