@@ -57,6 +57,10 @@ static ngx_int_t ngx_http_upstream_get_rr_peer(ngx_http_upstream_rr_peers_t *pee
57
57
ngx_http_upstream_rr_peer_t * * rpeer );
58
58
static ngx_http_upstream_rr_peer_t * ngx_http_upstream_get_vnswrr (
59
59
ngx_http_upstream_vnswrr_peer_data_t * vnsp );
60
+ static void ngx_http_upstream_init_virtual_peers (
61
+ ngx_http_upstream_rr_peers_t * peers ,
62
+ ngx_http_upstream_vnswrr_srv_conf_t * uvnscf ,
63
+ ngx_uint_t s , ngx_uint_t e );
60
64
61
65
62
66
static ngx_command_t ngx_http_upstream_vnswrr_commands [] = {
@@ -148,7 +152,9 @@ ngx_http_upstream_vnswrr(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
148
152
|NGX_HTTP_UPSTREAM_BACKUP
149
153
|NGX_HTTP_UPSTREAM_MAX_FAILS
150
154
|NGX_HTTP_UPSTREAM_FAIL_TIMEOUT
155
+ #if defined(nginx_version ) && nginx_version >= 1011005
151
156
|NGX_HTTP_UPSTREAM_MAX_CONNS
157
+ #endif
152
158
|NGX_HTTP_UPSTREAM_DOWN ;
153
159
154
160
return NGX_CONF_OK ;
@@ -159,9 +165,6 @@ static ngx_int_t
159
165
ngx_http_upstream_init_vnswrr (ngx_conf_t * cf ,
160
166
ngx_http_upstream_srv_conf_t * us )
161
167
{
162
- ngx_uint_t i ;
163
- ngx_int_t rindex ;
164
- ngx_http_upstream_rr_peer_t * peer ;
165
168
ngx_http_upstream_rr_peers_t * peers , * backup ;
166
169
ngx_http_upstream_vnswrr_srv_conf_t * uvnscf , * ubvnscf ;
167
170
@@ -194,22 +197,8 @@ ngx_http_upstream_init_vnswrr(ngx_conf_t *cf,
194
197
return NGX_ERROR ;
195
198
}
196
199
197
- uvnscf -> vnumber = peers -> number ;
198
-
199
- for (i = 0 ; i < peers -> number ; i ++ ) {
200
- rindex = ngx_http_upstream_get_rr_peer (peers , & peer );
201
- if (rindex == NGX_ERROR ) {
202
- ngx_log_error (NGX_LOG_WARN , cf -> log , 0 ,
203
- "peers peer is null in upstream \"%V\" "
204
- "in %s:%ui" ,& us -> host , us -> file_name , us -> line );
205
- if (i != 0 ) {
206
- i -- ;
207
- }
208
- continue ;
209
- }
210
- uvnscf -> vpeers [i ].vpeer = peer ;
211
- uvnscf -> vpeers [i ].rindex = rindex ;
212
- }
200
+ ngx_http_upstream_init_virtual_peers (peers , uvnscf , 0 , peers -> number );
201
+
213
202
}
214
203
215
204
/* backup peers */
@@ -238,23 +227,7 @@ ngx_http_upstream_init_vnswrr(ngx_conf_t *cf,
238
227
return NGX_ERROR ;
239
228
}
240
229
241
- ubvnscf -> vnumber = backup -> number ;
242
-
243
- for (i = 0 ; i < backup -> number ; i ++ ) {
244
- rindex = ngx_http_upstream_get_rr_peer (backup , & peer );
245
- if (rindex == NGX_ERROR ) {
246
- ngx_log_error (NGX_LOG_WARN , cf -> log , 0 ,
247
- "backup peer is null in upstream \"%V\" "
248
- "in %s:%ui" , & us -> host , us -> file_name , us -> line );
249
- if (i != 0 ) {
250
- i -- ;
251
- }
252
- continue ;
253
- }
254
-
255
- ubvnscf -> vpeers [i ].vpeer = peer ;
256
- ubvnscf -> vpeers [i ].rindex = rindex ;
257
- }
230
+ ngx_http_upstream_init_virtual_peers (backup , ubvnscf , 0 , backup -> number );
258
231
}
259
232
260
233
return NGX_OK ;
@@ -318,9 +291,11 @@ ngx_http_upstream_get_vnswrr_peer(ngx_peer_connection_t *pc, void *data)
318
291
goto failed ;
319
292
}
320
293
294
+ #if defined(nginx_version ) && nginx_version >= 1011005
321
295
if (peer -> max_conns && peer -> conns >= peer -> max_conns ) {
322
296
goto failed ;
323
297
}
298
+ #endif
324
299
325
300
#if (NGX_HTTP_UPSTREAM_CHECK )
326
301
if (ngx_http_upstream_check_peer_down (peer -> check_index )) {
@@ -427,7 +402,6 @@ ngx_http_upstream_get_vnswrr(ngx_http_upstream_vnswrr_peer_data_t *vnsp)
427
402
{
428
403
time_t now ;
429
404
uintptr_t m ;
430
- ngx_int_t rindex ;
431
405
ngx_uint_t i , n , p , flag , begin_number ;
432
406
ngx_http_upstream_rr_peer_t * peer , * best ;
433
407
ngx_http_upstream_rr_peers_t * peers ;
@@ -474,24 +448,9 @@ ngx_http_upstream_get_vnswrr(ngx_http_upstream_vnswrr_peer_data_t *vnsp)
474
448
n = peers -> number ;
475
449
}
476
450
477
- for (i = uvnscf -> vnumber ; i < n + uvnscf -> vnumber ; i ++ ) {
478
- rindex = ngx_http_upstream_get_rr_peer (peers , & peer );
479
- if (rindex == NGX_ERROR ) {
480
- ngx_log_error (NGX_LOG_ERR , ngx_cycle -> log , 0 ,
481
- "get rr peer is null in upstream \"%V\" " ,
482
- peers -> name );
483
- if (i != 0 ) {
484
- i -- ;
485
- }
486
-
487
- continue ;
488
- }
489
-
490
- vpeers [i ].vpeer = peer ;
491
- vpeers [i ].rindex = rindex ;
492
- }
451
+ ngx_http_upstream_init_virtual_peers (peers , uvnscf , uvnscf -> vnumber ,
452
+ n + uvnscf -> vnumber );
493
453
494
- uvnscf -> vnumber = i ;
495
454
}
496
455
497
456
begin_number = (uvnscf -> last_number + 1 ) % uvnscf -> vnumber ;
@@ -517,6 +476,15 @@ ngx_http_upstream_get_vnswrr(ngx_http_upstream_vnswrr_peer_data_t *vnsp)
517
476
518
477
flag = 0 ;
519
478
if (peers -> weighted ) {
479
+
480
+ n = peers -> total_weight - uvnscf -> vnumber ;
481
+ if (n > peers -> number ) {
482
+ n = peers -> number ;
483
+ }
484
+
485
+ ngx_http_upstream_init_virtual_peers (peers , uvnscf , uvnscf -> vnumber ,
486
+ n + uvnscf -> vnumber );
487
+
520
488
n = vpeers [i ].rindex / (8 * sizeof (uintptr_t ));
521
489
m = (uintptr_t ) 1 << vpeers [i ].rindex % (8 * sizeof (uintptr_t ));
522
490
@@ -540,9 +508,11 @@ ngx_http_upstream_get_vnswrr(ngx_http_upstream_vnswrr_peer_data_t *vnsp)
540
508
continue ;
541
509
}
542
510
511
+ #if defined(nginx_version ) && nginx_version >= 1011005
543
512
if (peer -> max_conns && peer -> conns >= peer -> max_conns ) {
544
513
continue ;
545
514
}
515
+ #endif
546
516
547
517
#if (NGX_HTTP_UPSTREAM_CHECK )
548
518
if (ngx_http_upstream_check_peer_down (peer -> check_index )) {
@@ -580,3 +550,42 @@ ngx_http_upstream_get_vnswrr(ngx_http_upstream_vnswrr_peer_data_t *vnsp)
580
550
581
551
return best ;
582
552
}
553
+
554
+
555
+ static void
556
+ ngx_http_upstream_init_virtual_peers (ngx_http_upstream_rr_peers_t * peers ,
557
+ ngx_http_upstream_vnswrr_srv_conf_t * uvnscf ,
558
+ ngx_uint_t s , ngx_uint_t e )
559
+ {
560
+ ngx_uint_t i ;
561
+ ngx_int_t rindex ;
562
+ ngx_http_upstream_rr_peer_t * peer ;
563
+ ngx_http_upstream_rr_vpeers_t * vpeers ;
564
+
565
+ if (uvnscf == NULL || peers == NULL ) {
566
+ return ;
567
+ }
568
+
569
+ vpeers = uvnscf -> vpeers ;
570
+
571
+ for (i = s ; i < e ; i ++ ) {
572
+ rindex = ngx_http_upstream_get_rr_peer (peers , & peer );
573
+ if (rindex == NGX_ERROR ) {
574
+ ngx_log_error (NGX_LOG_ERR , ngx_cycle -> log , 0 ,
575
+ "get rr peer is null in upstream \"%V\" " ,
576
+ peers -> name );
577
+ if (i != 0 ) {
578
+ i -- ;
579
+ }
580
+
581
+ continue ;
582
+ }
583
+
584
+ vpeers [i ].vpeer = peer ;
585
+ vpeers [i ].rindex = rindex ;
586
+ }
587
+
588
+ uvnscf -> vnumber = i ;
589
+
590
+ return ;
591
+ }
0 commit comments