annotate src/stream/ngx_stream_upstream_random_module.c @ 7690:8253424d1aff

Added size check to ngx_http_alloc_large_header_buffer(). This ensures that copying won't write more than the buffer size even if the buffer comes from hc->free and it is smaller than the large client header buffer size in the virtual host configuration. This might happen if size of large client header buffers is different in name-based virtual hosts, similarly to the problem with number of buffers fixed in 6926:e662cbf1b932.
author Maxim Dounin <mdounin@mdounin.ru>
date Thu, 06 Aug 2020 05:02:22 +0300
parents f2396ecf608b
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
7301
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
2 /*
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
3 * Copyright (C) Nginx, Inc.
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
4 */
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
5
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
6
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
7 #include <ngx_config.h>
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
8 #include <ngx_core.h>
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
9 #include <ngx_stream.h>
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
10
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
11
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
12 typedef struct {
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
13 ngx_stream_upstream_rr_peer_t *peer;
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
14 ngx_uint_t range;
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
15 } ngx_stream_upstream_random_range_t;
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
16
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
17
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
18 typedef struct {
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
19 ngx_uint_t two;
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
20 ngx_stream_upstream_random_range_t *ranges;
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
21 } ngx_stream_upstream_random_srv_conf_t;
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
22
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
23
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
24 typedef struct {
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
25 /* the round robin data must be first */
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
26 ngx_stream_upstream_rr_peer_data_t rrp;
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
27
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
28 ngx_stream_upstream_random_srv_conf_t *conf;
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
29 u_char tries;
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
30 } ngx_stream_upstream_random_peer_data_t;
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
31
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
32
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
33 static ngx_int_t ngx_stream_upstream_init_random(ngx_conf_t *cf,
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
34 ngx_stream_upstream_srv_conf_t *us);
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
35 static ngx_int_t ngx_stream_upstream_update_random(ngx_pool_t *pool,
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
36 ngx_stream_upstream_srv_conf_t *us);
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
37
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
38 static ngx_int_t ngx_stream_upstream_init_random_peer(ngx_stream_session_t *s,
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
39 ngx_stream_upstream_srv_conf_t *us);
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
40 static ngx_int_t ngx_stream_upstream_get_random_peer(ngx_peer_connection_t *pc,
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
41 void *data);
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
42 static ngx_int_t ngx_stream_upstream_get_random2_peer(ngx_peer_connection_t *pc,
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
43 void *data);
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
44 static ngx_uint_t ngx_stream_upstream_peek_random_peer(
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
45 ngx_stream_upstream_rr_peers_t *peers,
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
46 ngx_stream_upstream_random_peer_data_t *rp);
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
47 static void *ngx_stream_upstream_random_create_conf(ngx_conf_t *cf);
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
48 static char *ngx_stream_upstream_random(ngx_conf_t *cf, ngx_command_t *cmd,
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
49 void *conf);
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
50
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
51
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
52 static ngx_command_t ngx_stream_upstream_random_commands[] = {
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
53
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
54 { ngx_string("random"),
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
55 NGX_STREAM_UPS_CONF|NGX_CONF_NOARGS|NGX_CONF_TAKE12,
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
56 ngx_stream_upstream_random,
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
57 NGX_STREAM_SRV_CONF_OFFSET,
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
58 0,
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
59 NULL },
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
60
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
61 ngx_null_command
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
62 };
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
63
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
64
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
65 static ngx_stream_module_t ngx_stream_upstream_random_module_ctx = {
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
66 NULL, /* preconfiguration */
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
67 NULL, /* postconfiguration */
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
68
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
69 NULL, /* create main configuration */
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
70 NULL, /* init main configuration */
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
71
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
72 ngx_stream_upstream_random_create_conf, /* create server configuration */
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
73 NULL /* merge server configuration */
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
74 };
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
75
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
76
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
77 ngx_module_t ngx_stream_upstream_random_module = {
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
78 NGX_MODULE_V1,
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
79 &ngx_stream_upstream_random_module_ctx, /* module context */
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
80 ngx_stream_upstream_random_commands, /* module directives */
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
81 NGX_STREAM_MODULE, /* module type */
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
82 NULL, /* init master */
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
83 NULL, /* init module */
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
84 NULL, /* init process */
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
85 NULL, /* init thread */
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
86 NULL, /* exit thread */
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
87 NULL, /* exit process */
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
88 NULL, /* exit master */
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
89 NGX_MODULE_V1_PADDING
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
90 };
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
91
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
92
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
93 static ngx_int_t
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
94 ngx_stream_upstream_init_random(ngx_conf_t *cf,
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
95 ngx_stream_upstream_srv_conf_t *us)
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
96 {
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
97 ngx_log_debug0(NGX_LOG_DEBUG_STREAM, cf->log, 0, "init random");
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
98
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
99 if (ngx_stream_upstream_init_round_robin(cf, us) != NGX_OK) {
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
100 return NGX_ERROR;
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
101 }
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
102
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
103 us->peer.init = ngx_stream_upstream_init_random_peer;
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
104
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
105 #if (NGX_STREAM_UPSTREAM_ZONE)
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
106 if (us->shm_zone) {
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
107 return NGX_OK;
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
108 }
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
109 #endif
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
110
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
111 return ngx_stream_upstream_update_random(cf->pool, us);
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
112 }
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
113
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
114
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
115 static ngx_int_t
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
116 ngx_stream_upstream_update_random(ngx_pool_t *pool,
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
117 ngx_stream_upstream_srv_conf_t *us)
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
118 {
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
119 size_t size;
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
120 ngx_uint_t i, total_weight;
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
121 ngx_stream_upstream_rr_peer_t *peer;
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
122 ngx_stream_upstream_rr_peers_t *peers;
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
123 ngx_stream_upstream_random_range_t *ranges;
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
124 ngx_stream_upstream_random_srv_conf_t *rcf;
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
125
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
126 rcf = ngx_stream_conf_upstream_srv_conf(us,
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
127 ngx_stream_upstream_random_module);
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
128 peers = us->peer.data;
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
129
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
130 size = peers->number * sizeof(ngx_stream_upstream_random_range_t);
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
131
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
132 ranges = pool ? ngx_palloc(pool, size) : ngx_alloc(size, ngx_cycle->log);
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
133 if (ranges == NULL) {
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
134 return NGX_ERROR;
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
135 }
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
136
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
137 total_weight = 0;
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
138
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
139 for (peer = peers->peer, i = 0; peer; peer = peer->next, i++) {
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
140 ranges[i].peer = peer;
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
141 ranges[i].range = total_weight;
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
142 total_weight += peer->weight;
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
143 }
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
144
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
145 rcf->ranges = ranges;
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
146
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
147 return NGX_OK;
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
148 }
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
149
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
150
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
151 static ngx_int_t
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
152 ngx_stream_upstream_init_random_peer(ngx_stream_session_t *s,
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
153 ngx_stream_upstream_srv_conf_t *us)
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
154 {
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
155 ngx_stream_upstream_random_srv_conf_t *rcf;
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
156 ngx_stream_upstream_random_peer_data_t *rp;
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
157
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
158 ngx_log_debug0(NGX_LOG_DEBUG_STREAM, s->connection->log, 0,
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
159 "init random peer");
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
160
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
161 rcf = ngx_stream_conf_upstream_srv_conf(us,
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
162 ngx_stream_upstream_random_module);
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
163
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
164 rp = ngx_palloc(s->connection->pool,
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
165 sizeof(ngx_stream_upstream_random_peer_data_t));
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
166 if (rp == NULL) {
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
167 return NGX_ERROR;
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
168 }
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
169
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
170 s->upstream->peer.data = &rp->rrp;
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
171
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
172 if (ngx_stream_upstream_init_round_robin_peer(s, us) != NGX_OK) {
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
173 return NGX_ERROR;
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
174 }
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
175
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
176 if (rcf->two) {
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
177 s->upstream->peer.get = ngx_stream_upstream_get_random2_peer;
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
178
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
179 } else {
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
180 s->upstream->peer.get = ngx_stream_upstream_get_random_peer;
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
181 }
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
182
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
183 rp->conf = rcf;
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
184 rp->tries = 0;
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
185
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
186 ngx_stream_upstream_rr_peers_rlock(rp->rrp.peers);
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
187
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
188 #if (NGX_STREAM_UPSTREAM_ZONE)
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
189 if (rp->rrp.peers->shpool && rcf->ranges == NULL) {
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
190 if (ngx_stream_upstream_update_random(NULL, us) != NGX_OK) {
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
191 ngx_stream_upstream_rr_peers_unlock(rp->rrp.peers);
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
192 return NGX_ERROR;
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
193 }
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
194 }
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
195 #endif
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
196
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
197 ngx_stream_upstream_rr_peers_unlock(rp->rrp.peers);
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
198
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
199 return NGX_OK;
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
200 }
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
201
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
202
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
203 static ngx_int_t
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
204 ngx_stream_upstream_get_random_peer(ngx_peer_connection_t *pc, void *data)
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
205 {
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
206 ngx_stream_upstream_random_peer_data_t *rp = data;
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
207
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
208 time_t now;
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
209 uintptr_t m;
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
210 ngx_uint_t i, n;
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
211 ngx_stream_upstream_rr_peer_t *peer;
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
212 ngx_stream_upstream_rr_peers_t *peers;
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
213 ngx_stream_upstream_rr_peer_data_t *rrp;
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
214
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
215 ngx_log_debug1(NGX_LOG_DEBUG_STREAM, pc->log, 0,
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
216 "get random peer, try: %ui", pc->tries);
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
217
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
218 rrp = &rp->rrp;
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
219 peers = rrp->peers;
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
220
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
221 ngx_stream_upstream_rr_peers_rlock(peers);
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
222
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
223 if (rp->tries > 20 || peers->single) {
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
224 ngx_stream_upstream_rr_peers_unlock(peers);
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
225 return ngx_stream_upstream_get_round_robin_peer(pc, rrp);
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
226 }
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
227
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
228 pc->cached = 0;
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
229 pc->connection = NULL;
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
230
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
231 now = ngx_time();
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
232
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
233 for ( ;; ) {
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
234
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
235 i = ngx_stream_upstream_peek_random_peer(peers, rp);
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
236
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
237 peer = rp->conf->ranges[i].peer;
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
238
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
239 n = i / (8 * sizeof(uintptr_t));
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
240 m = (uintptr_t) 1 << i % (8 * sizeof(uintptr_t));
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
241
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
242 if (rrp->tried[n] & m) {
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
243 goto next;
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
244 }
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
245
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
246 ngx_stream_upstream_rr_peer_lock(peers, peer);
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
247
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
248 if (peer->down) {
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
249 ngx_stream_upstream_rr_peer_unlock(peers, peer);
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
250 goto next;
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
251 }
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
252
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
253 if (peer->max_fails
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
254 && peer->fails >= peer->max_fails
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
255 && now - peer->checked <= peer->fail_timeout)
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
256 {
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
257 ngx_stream_upstream_rr_peer_unlock(peers, peer);
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
258 goto next;
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
259 }
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
260
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
261 if (peer->max_conns && peer->conns >= peer->max_conns) {
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
262 ngx_stream_upstream_rr_peer_unlock(peers, peer);
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
263 goto next;
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
264 }
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
265
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
266 break;
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
267
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
268 next:
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
269
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
270 if (++rp->tries > 20) {
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
271 ngx_stream_upstream_rr_peers_unlock(peers);
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
272 return ngx_stream_upstream_get_round_robin_peer(pc, rrp);
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
273 }
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
274 }
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
275
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
276 rrp->current = peer;
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
277
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
278 if (now - peer->checked > peer->fail_timeout) {
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
279 peer->checked = now;
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
280 }
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
281
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
282 pc->sockaddr = peer->sockaddr;
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
283 pc->socklen = peer->socklen;
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
284 pc->name = &peer->name;
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
285
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
286 peer->conns++;
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
287
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
288 ngx_stream_upstream_rr_peer_unlock(peers, peer);
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
289 ngx_stream_upstream_rr_peers_unlock(peers);
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
290
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
291 rrp->tried[n] |= m;
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
292
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
293 return NGX_OK;
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
294 }
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
295
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
296
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
297 static ngx_int_t
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
298 ngx_stream_upstream_get_random2_peer(ngx_peer_connection_t *pc, void *data)
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
299 {
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
300 ngx_stream_upstream_random_peer_data_t *rp = data;
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
301
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
302 time_t now;
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
303 uintptr_t m;
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
304 ngx_uint_t i, n, p;
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
305 ngx_stream_upstream_rr_peer_t *peer, *prev;
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
306 ngx_stream_upstream_rr_peers_t *peers;
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
307 ngx_stream_upstream_rr_peer_data_t *rrp;
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
308
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
309 ngx_log_debug1(NGX_LOG_DEBUG_STREAM, pc->log, 0,
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
310 "get random2 peer, try: %ui", pc->tries);
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
311
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
312 rrp = &rp->rrp;
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
313 peers = rrp->peers;
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
314
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
315 ngx_stream_upstream_rr_peers_wlock(peers);
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
316
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
317 if (rp->tries > 20 || peers->single) {
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
318 ngx_stream_upstream_rr_peers_unlock(peers);
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
319 return ngx_stream_upstream_get_round_robin_peer(pc, rrp);
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
320 }
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
321
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
322 pc->cached = 0;
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
323 pc->connection = NULL;
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
324
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
325 now = ngx_time();
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
326
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
327 prev = NULL;
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
328
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
329 #if (NGX_SUPPRESS_WARN)
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
330 p = 0;
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
331 #endif
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
332
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
333 for ( ;; ) {
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
334
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
335 i = ngx_stream_upstream_peek_random_peer(peers, rp);
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
336
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
337 peer = rp->conf->ranges[i].peer;
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
338
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
339 if (peer == prev) {
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
340 goto next;
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
341 }
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
342
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
343 n = i / (8 * sizeof(uintptr_t));
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
344 m = (uintptr_t) 1 << i % (8 * sizeof(uintptr_t));
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
345
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
346 if (rrp->tried[n] & m) {
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
347 goto next;
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
348 }
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
349
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
350 if (peer->down) {
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
351 goto next;
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
352 }
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
353
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
354 if (peer->max_fails
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
355 && peer->fails >= peer->max_fails
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
356 && now - peer->checked <= peer->fail_timeout)
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
357 {
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
358 goto next;
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
359 }
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
360
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
361 if (peer->max_conns && peer->conns >= peer->max_conns) {
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
362 goto next;
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
363 }
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
364
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
365 if (prev) {
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
366 if (peer->conns * prev->weight > prev->conns * peer->weight) {
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
367 peer = prev;
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
368 n = p / (8 * sizeof(uintptr_t));
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
369 m = (uintptr_t) 1 << p % (8 * sizeof(uintptr_t));
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
370 }
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
371
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
372 break;
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
373 }
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
374
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
375 prev = peer;
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
376 p = i;
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
377
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
378 next:
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
379
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
380 if (++rp->tries > 20) {
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
381 ngx_stream_upstream_rr_peers_unlock(peers);
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
382 return ngx_stream_upstream_get_round_robin_peer(pc, rrp);
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
383 }
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
384 }
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
385
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
386 rrp->current = peer;
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
387
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
388 if (now - peer->checked > peer->fail_timeout) {
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
389 peer->checked = now;
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
390 }
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
391
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
392 pc->sockaddr = peer->sockaddr;
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
393 pc->socklen = peer->socklen;
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
394 pc->name = &peer->name;
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
395
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
396 peer->conns++;
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
397
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
398 ngx_stream_upstream_rr_peers_unlock(peers);
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
399
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
400 rrp->tried[n] |= m;
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
401
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
402 return NGX_OK;
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
403 }
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
404
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
405
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
406 static ngx_uint_t
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
407 ngx_stream_upstream_peek_random_peer(ngx_stream_upstream_rr_peers_t *peers,
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
408 ngx_stream_upstream_random_peer_data_t *rp)
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
409 {
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
410 ngx_uint_t i, j, k, x;
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
411
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
412 x = ngx_random() % peers->total_weight;
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
413
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
414 i = 0;
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
415 j = peers->number;
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
416
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
417 while (j - i > 1) {
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
418 k = (i + j) / 2;
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
419
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
420 if (x < rp->conf->ranges[k].range) {
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
421 j = k;
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
422
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
423 } else {
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
424 i = k;
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
425 }
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
426 }
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
427
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
428 return i;
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
429 }
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
430
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
431
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
432 static void *
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
433 ngx_stream_upstream_random_create_conf(ngx_conf_t *cf)
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
434 {
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
435 ngx_stream_upstream_random_srv_conf_t *conf;
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
436
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
437 conf = ngx_pcalloc(cf->pool, sizeof(ngx_stream_upstream_random_srv_conf_t));
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
438 if (conf == NULL) {
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
439 return NULL;
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
440 }
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
441
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
442 /*
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
443 * set by ngx_pcalloc():
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
444 *
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
445 * conf->two = 0;
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
446 */
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
447
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
448 return conf;
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
449 }
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
450
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
451
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
452 static char *
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
453 ngx_stream_upstream_random(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
454 {
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
455 ngx_stream_upstream_random_srv_conf_t *rcf = conf;
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
456
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
457 ngx_str_t *value;
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
458 ngx_stream_upstream_srv_conf_t *uscf;
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
459
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
460 uscf = ngx_stream_conf_get_module_srv_conf(cf, ngx_stream_upstream_module);
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
461
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
462 if (uscf->peer.init_upstream) {
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
463 ngx_conf_log_error(NGX_LOG_WARN, cf, 0,
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
464 "load balancing method redefined");
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
465 }
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
466
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
467 uscf->peer.init_upstream = ngx_stream_upstream_init_random;
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
468
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
469 uscf->flags = NGX_STREAM_UPSTREAM_CREATE
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
470 |NGX_STREAM_UPSTREAM_WEIGHT
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
471 |NGX_STREAM_UPSTREAM_MAX_CONNS
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
472 |NGX_STREAM_UPSTREAM_MAX_FAILS
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
473 |NGX_STREAM_UPSTREAM_FAIL_TIMEOUT
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
474 |NGX_STREAM_UPSTREAM_DOWN;
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
475
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
476 if (cf->args->nelts == 1) {
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
477 return NGX_CONF_OK;
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
478 }
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
479
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
480 value = cf->args->elts;
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
481
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
482 if (ngx_strcmp(value[1].data, "two") == 0) {
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
483 rcf->two = 1;
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
484
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
485 } else {
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
486 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
487 "invalid parameter \"%V\"", &value[1]);
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
488 return NGX_CONF_ERROR;
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
489 }
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
490
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
491 if (cf->args->nelts == 2) {
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
492 return NGX_CONF_OK;
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
493 }
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
494
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
495 if (ngx_strcmp(value[2].data, "least_conn") != 0) {
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
496 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
497 "invalid parameter \"%V\"", &value[2]);
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
498 return NGX_CONF_ERROR;
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
499 }
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
500
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
501 return NGX_CONF_OK;
f2396ecf608b Upstream: ngx_http_upstream_random module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
502 }