Mercurial > hg > nginx
comparison src/event/ngx_event_connect.c @ 647:95d7da23ea53 release-0.3.45
nginx-0.3.45-RELEASE import
*) Feature: the "ssl_verify_client", "ssl_verify_depth", and
"ssl_client_certificate" directives.
*) Change: the $request_method variable now returns the main request
method.
*) Change: the ° symbol codes were changed in koi-win conversion
table.
*) Feature: the euro and N symbols were added to koi-win conversion
table.
*) Bugfix: if nginx distributed the requests among several backends and
some backend failed, then requests intended for this backend was
directed to one live backend only instead of being distributed among
the rest.
author | Igor Sysoev <igor@sysoev.ru> |
---|---|
date | Sat, 06 May 2006 16:28:56 +0000 |
parents | 4e296b7d25bf |
children | 6d5c1535bb9d |
comparison
equal
deleted
inserted
replaced
646:f198dec3e3af | 647:95d7da23ea53 |
---|---|
59 | 59 |
60 if (pc->tries == pc->peers->number) { | 60 if (pc->tries == pc->peers->number) { |
61 | 61 |
62 /* it's a first try - get a current peer */ | 62 /* it's a first try - get a current peer */ |
63 | 63 |
64 pc->cur_peer = pc->peers->current; | 64 for ( ;; ) { |
65 pc->cur_peer = pc->peers->current; | |
66 | |
67 peer = &pc->peers->peer[pc->cur_peer]; | |
68 | |
69 if (peer->max_fails == 0 || peer->fails <= peer->max_fails) { | |
70 break; | |
71 } | |
72 | |
73 if (now - peer->accessed > peer->fail_timeout) { | |
74 peer->fails = 0; | |
75 break; | |
76 } | |
77 | |
78 pc->peers->current++; | |
79 | |
80 if (pc->peers->current >= pc->peers->number) { | |
81 pc->peers->current = 0; | |
82 } | |
83 | |
84 pc->peers->weight = pc->peers->peer[pc->peers->current].weight; | |
85 | |
86 pc->tries--; | |
87 | |
88 if (pc->tries) { | |
89 continue; | |
90 } | |
91 | |
92 goto failed; | |
93 } | |
65 | 94 |
66 pc->peers->weight--; | 95 pc->peers->weight--; |
67 | 96 |
68 if (pc->peers->weight == 0) { | 97 if (pc->peers->weight == 0) { |
69 pc->peers->current++; | 98 pc->peers->current++; |
70 } | 99 |
71 | 100 if (pc->peers->current >= pc->peers->number) { |
72 if (pc->peers->current >= pc->peers->number) { | 101 pc->peers->current = 0; |
73 pc->peers->current = 0; | 102 } |
74 } | 103 |
75 | |
76 if (pc->peers->weight == 0) { | |
77 pc->peers->weight = pc->peers->peer[pc->peers->current].weight; | 104 pc->peers->weight = pc->peers->peer[pc->peers->current].weight; |
78 } | 105 } |
79 } | 106 |
80 | 107 } else { |
81 for ( ;; ) { | 108 for ( ;; ) { |
82 peer = &pc->peers->peer[pc->cur_peer]; | 109 peer = &pc->peers->peer[pc->cur_peer]; |
83 | 110 |
84 if (peer->max_fails == 0 || peer->fails <= peer->max_fails) { | 111 if (peer->max_fails == 0 || peer->fails <= peer->max_fails) { |
85 break; | 112 break; |
86 } | 113 } |
87 | 114 |
88 if (now - peer->accessed > peer->fail_timeout) { | 115 if (now - peer->accessed > peer->fail_timeout) { |
89 peer->fails = 0; | 116 peer->fails = 0; |
90 break; | 117 break; |
91 } | 118 } |
92 | 119 |
93 pc->cur_peer++; | 120 pc->cur_peer++; |
94 | 121 |
95 if (pc->cur_peer >= pc->peers->number) { | 122 if (pc->cur_peer >= pc->peers->number) { |
96 pc->cur_peer = 0; | 123 pc->cur_peer = 0; |
97 } | 124 } |
98 | 125 |
99 pc->tries--; | 126 pc->tries--; |
100 | 127 |
101 if (pc->tries == 0) { | 128 if (pc->tries) { |
102 | 129 continue; |
103 /* all peers failed, mark them as live for quick recovery */ | 130 } |
104 | 131 |
105 for (i = 0; i < pc->peers->number; i++) { | 132 goto failed; |
106 pc->peers->peer[i].fails = 0; | |
107 } | |
108 | |
109 /* ngx_unlock_mutex(pc->peers->mutex); */ | |
110 | |
111 return NGX_BUSY; | |
112 } | 133 } |
113 } | 134 } |
114 } | 135 } |
115 | 136 |
116 /* ngx_unlock_mutex(pc->peers->mutex); */ | 137 /* ngx_unlock_mutex(pc->peers->mutex); */ |
317 ngx_log_debug0(NGX_LOG_DEBUG_EVENT, pc->log, 0, "connected"); | 338 ngx_log_debug0(NGX_LOG_DEBUG_EVENT, pc->log, 0, "connected"); |
318 | 339 |
319 wev->ready = 1; | 340 wev->ready = 1; |
320 | 341 |
321 return NGX_OK; | 342 return NGX_OK; |
343 | |
344 failed: | |
345 | |
346 /* all peers failed, mark them as live for quick recovery */ | |
347 | |
348 for (i = 0; i < pc->peers->number; i++) { | |
349 pc->peers->peer[i].fails = 0; | |
350 } | |
351 | |
352 /* ngx_unlock_mutex(pc->peers->mutex); */ | |
353 | |
354 return NGX_BUSY; | |
322 } | 355 } |
323 | 356 |
324 | 357 |
325 void | 358 void |
326 ngx_event_connect_peer_failed(ngx_peer_connection_t *pc, ngx_uint_t down) | 359 ngx_event_connect_peer_failed(ngx_peer_connection_t *pc, ngx_uint_t down) |