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)