@@ -30,6 +30,7 @@ struct ngx_http_upstream_vnswrr_srv_conf_s {
30
30
ngx_uint_t vnumber ;
31
31
ngx_uint_t last_number ;
32
32
ngx_uint_t init_number ;
33
+ ngx_uint_t max_init ;
33
34
ngx_uint_t gcd ;
34
35
ngx_http_upstream_rr_peer_t * last_peer ;
35
36
ngx_http_upstream_rr_vpeers_t * vpeers ;
@@ -138,9 +139,13 @@ ngx_http_upstream_vnswrr_create_srv_conf(ngx_conf_t *cf)
138
139
static char *
139
140
ngx_http_upstream_vnswrr (ngx_conf_t * cf , ngx_command_t * cmd , void * conf )
140
141
{
141
- ngx_http_upstream_srv_conf_t * uscf ;
142
+ ngx_http_upstream_srv_conf_t * uscf ;
143
+ ngx_http_upstream_vnswrr_srv_conf_t * uvnscf ;
144
+ ngx_str_t * value ;
145
+ ngx_int_t max_init ;
146
+ ngx_uint_t i ;
142
147
143
- uscf = ngx_http_conf_get_module_srv_conf (cf , ngx_http_upstream_module );
148
+ uscf = ngx_http_conf_get_module_srv_conf (cf , ngx_http_upstream_module );
144
149
145
150
if (uscf -> peer .init_upstream ) {
146
151
ngx_conf_log_error (NGX_LOG_WARN , cf , 0 ,
@@ -159,7 +164,39 @@ ngx_http_upstream_vnswrr(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
159
164
#endif
160
165
|NGX_HTTP_UPSTREAM_DOWN ;
161
166
167
+ uvnscf = ngx_http_conf_upstream_srv_conf (uscf ,
168
+ ngx_http_upstream_vnswrr_module );
169
+
170
+ value = cf -> args -> elts ;
171
+
172
+ max_init = 0 ;
173
+
174
+ for (i = 2 ; i < cf -> args -> nelts ; i ++ ) {
175
+
176
+ if (ngx_strncmp (value [i ].data , "max_init=" , 9 ) == 0 ) {
177
+
178
+ max_init = ngx_atoi (& value [i ].data [9 ], value [i ].len - 9 );
179
+
180
+ if (max_init == NGX_ERROR ) {
181
+ goto invalid ;
182
+ }
183
+
184
+ continue ;
185
+ }
186
+
187
+ goto invalid ;
188
+ }
189
+
190
+ uvnscf -> max_init = max_init ;
191
+
162
192
return NGX_CONF_OK ;
193
+
194
+ invalid :
195
+
196
+ ngx_conf_log_error (NGX_LOG_EMERG , cf , 0 ,
197
+ "invalid parameter \"%V\"" , & value [i ]);
198
+
199
+ return NGX_CONF_ERROR ;
163
200
}
164
201
165
202
@@ -170,7 +207,7 @@ ngx_http_upstream_init_vnswrr(ngx_conf_t *cf,
170
207
ngx_http_upstream_rr_peers_t * peers , * backup ;
171
208
ngx_http_upstream_vnswrr_srv_conf_t * uvnscf , * ubvnscf ;
172
209
ngx_http_upstream_server_t * server ;
173
- ngx_uint_t i , g , bg ;
210
+ ngx_uint_t i , g , bg , max_init ;
174
211
175
212
ngx_log_debug0 (NGX_LOG_DEBUG_HTTP , cf -> log , 0 , "init vnswrr" );
176
213
@@ -204,15 +241,24 @@ ngx_http_upstream_init_vnswrr(ngx_conf_t *cf,
204
241
return NGX_ERROR ;
205
242
}
206
243
244
+ max_init = uvnscf -> max_init ;
245
+
246
+ peers = (ngx_http_upstream_rr_peers_t * ) us -> peer .data ;
247
+
207
248
uvnscf -> init_number = NGX_CONF_UNSET_UINT ;
208
249
uvnscf -> last_number = NGX_CONF_UNSET_UINT ;
209
250
uvnscf -> last_peer = NULL ;
210
251
uvnscf -> next = NULL ;
211
252
uvnscf -> gcd = g ;
212
253
254
+ if (!max_init ) {
255
+ uvnscf -> max_init = peers -> number ;
256
+ } else if (max_init > peers -> total_weight ) {
257
+ uvnscf -> max_init = peers -> total_weight ;
258
+ }
259
+
213
260
us -> peer .init = ngx_http_upstream_init_vnswrr_peer ;
214
261
215
- peers = (ngx_http_upstream_rr_peers_t * ) us -> peer .data ;
216
262
if (peers -> weighted ) {
217
263
uvnscf -> vpeers = ngx_pcalloc (cf -> pool ,
218
264
sizeof (ngx_http_upstream_rr_vpeers_t )
@@ -221,7 +267,7 @@ ngx_http_upstream_init_vnswrr(ngx_conf_t *cf,
221
267
return NGX_ERROR ;
222
268
}
223
269
224
- ngx_http_upstream_init_virtual_peers (peers , uvnscf , 0 , peers -> number );
270
+ ngx_http_upstream_init_virtual_peers (peers , uvnscf , 0 , uvnscf -> max_init );
225
271
226
272
}
227
273
@@ -238,6 +284,14 @@ ngx_http_upstream_init_vnswrr(ngx_conf_t *cf,
238
284
ubvnscf -> last_number = NGX_CONF_UNSET_UINT ;
239
285
ubvnscf -> last_peer = NULL ;
240
286
ubvnscf -> gcd = bg ;
287
+
288
+ if (!max_init ) {
289
+ ubvnscf -> max_init = backup -> number ;
290
+ } else if (max_init > backup -> total_weight ) {
291
+ ubvnscf -> max_init = backup -> total_weight ;
292
+ } else {
293
+ ubvnscf -> max_init = max_init ;
294
+ }
241
295
242
296
uvnscf -> next = ubvnscf ;
243
297
@@ -252,7 +306,7 @@ ngx_http_upstream_init_vnswrr(ngx_conf_t *cf,
252
306
return NGX_ERROR ;
253
307
}
254
308
255
- ngx_http_upstream_init_virtual_peers (backup , ubvnscf , 0 , backup -> number );
309
+ ngx_http_upstream_init_virtual_peers (backup , ubvnscf , 0 , ubvnscf -> max_init );
256
310
}
257
311
258
312
return NGX_OK ;
@@ -472,8 +526,8 @@ ngx_http_upstream_get_vnswrr(ngx_http_upstream_vnswrr_peer_data_t *vnsp)
472
526
&& (uvnscf -> last_number + 1 == uvnscf -> vnumber ))
473
527
{
474
528
n = peers -> total_weight / uvnscf -> gcd - uvnscf -> vnumber ;
475
- if (n > peers -> number ) {
476
- n = peers -> number ;
529
+ if (n > uvnscf -> max_init ) {
530
+ n = uvnscf -> max_init ;
477
531
}
478
532
479
533
ngx_http_upstream_init_virtual_peers (peers , uvnscf , uvnscf -> vnumber ,
@@ -506,8 +560,8 @@ ngx_http_upstream_get_vnswrr(ngx_http_upstream_vnswrr_peer_data_t *vnsp)
506
560
if (peers -> weighted ) {
507
561
508
562
n = peers -> total_weight / uvnscf -> gcd - uvnscf -> vnumber ;
509
- if (n > peers -> number ) {
510
- n = peers -> number ;
563
+ if (n > uvnscf -> max_init ) {
564
+ n = uvnscf -> max_init ;
511
565
}
512
566
513
567
if (n > 0 ) {
0 commit comments