comparison src/event/ngx_event_connect.c @ 196:8759b346e431 NGINX_0_3_45

nginx 0.3.45 *) 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 и 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 <http://sysoev.ru>
date Sat, 06 May 2006 00:00:00 +0400
parents 91372f004adf
children 56688ed172c8
comparison
equal deleted inserted replaced
195:b65e20aebc10 196:8759b346e431
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)