aboutsummaryrefslogtreecommitdiff
path: root/src/event/ngx_event_connect.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/event/ngx_event_connect.c')
-rw-r--r--src/event/ngx_event_connect.c37
1 files changed, 28 insertions, 9 deletions
diff --git a/src/event/ngx_event_connect.c b/src/event/ngx_event_connect.c
index 157c48002..2b4c08d05 100644
--- a/src/event/ngx_event_connect.c
+++ b/src/event/ngx_event_connect.c
@@ -81,8 +81,6 @@ ngx_event_connect_peer(ngx_peer_connection_t *pc)
pc->peers->current = 0;
}
- pc->peers->weight = pc->peers->peer[pc->peers->current].weight;
-
pc->tries--;
if (pc->tries) {
@@ -92,16 +90,16 @@ ngx_event_connect_peer(ngx_peer_connection_t *pc)
goto failed;
}
- pc->peers->weight--;
+ peer->current_weight--;
+
+ if (peer->current_weight == 0) {
+ peer->current_weight = peer->weight;
- if (pc->peers->weight == 0) {
pc->peers->current++;
if (pc->peers->current >= pc->peers->number) {
pc->peers->current = 0;
}
-
- pc->peers->weight = pc->peers->peer[pc->peers->current].weight;
}
} else {
@@ -131,6 +129,20 @@ ngx_event_connect_peer(ngx_peer_connection_t *pc)
goto failed;
}
+
+ peer->current_weight--;
+
+ if (peer->current_weight == 0) {
+ peer->current_weight = peer->weight;
+
+ if (pc->cur_peer == pc->peers->current) {
+ pc->peers->current++;
+
+ if (pc->peers->current >= pc->peers->number) {
+ pc->peers->current = 0;
+ }
+ }
+ }
}
}
@@ -358,15 +370,22 @@ failed:
void
ngx_event_connect_peer_failed(ngx_peer_connection_t *pc, ngx_uint_t down)
{
- time_t now;
+ time_t now;
+ ngx_peer_t *peer;
if (down) {
now = ngx_time();
/* ngx_lock_mutex(pc->peers->mutex); */
- pc->peers->peer[pc->cur_peer].fails++;
- pc->peers->peer[pc->cur_peer].accessed = now;
+ peer = &pc->peers->peer[pc->cur_peer];
+
+ peer->fails++;
+ peer->accessed = now;
+
+ if (peer->current_weight > 1) {
+ peer->current_weight /= 2;
+ }
/* ngx_unlock_mutex(pc->peers->mutex); */
}