comparison src/event/ngx_event_connect.c @ 28:7ca9bdc82b3f NGINX_0_1_14

nginx 0.1.14 *) Feature: the autoconfiguration directives: --http-client-body-temp-path=PATH, --http-proxy-temp-path=PATH, and --http-fastcgi-temp-path=PATH *) Change: the directory name for the temporary files with the client request body is specified by directive client_body_temp_path, by default it is <prefix>/client_body_temp. *) Feature: the ngx_http_fastcgi_module and the directives: fastcgi_pass, fastcgi_root, fastcgi_index, fastcgi_params, fastcgi_connect_timeout, fastcgi_send_timeout, fastcgi_read_timeout, fastcgi_send_lowat, fastcgi_header_buffer_size, fastcgi_buffers, fastcgi_busy_buffers_size, fastcgi_temp_path, fastcgi_max_temp_file_size, fastcgi_temp_file_write_size, fastcgi_next_upstream, and fastcgi_x_powered_by. *) Bugfix: the "[alert] zero size buf" error; bug appeared in 0.1.3. *) Change: the URI must be specified after the host name in the proxy_pass directive. *) Change: the %3F symbol in the URI was considered as the argument string start. *) Feature: the unix domain sockets support in the ngx_http_proxy_module. *) Feature: the ssl_engine and ssl_ciphers directives. Thanks to Sergey Skvortsov for SSL-accelerator.
author Igor Sysoev <http://sysoev.ru>
date Tue, 18 Jan 2005 00:00:00 +0300
parents 8b6db3bda591
children da8c190bdaba
comparison
equal deleted inserted replaced
27:66901c2556fd 28:7ca9bdc82b3f
23 ngx_peer_t *peer; 23 ngx_peer_t *peer;
24 ngx_socket_t s; 24 ngx_socket_t s;
25 ngx_event_t *rev, *wev; 25 ngx_event_t *rev, *wev;
26 ngx_connection_t *c; 26 ngx_connection_t *c;
27 ngx_event_conf_t *ecf; 27 ngx_event_conf_t *ecf;
28 struct sockaddr_in addr;
29 28
30 now = ngx_time(); 29 now = ngx_time();
31 30
32 /* ngx_lock_mutex(pc->peers->mutex); */ 31 /* ngx_lock_mutex(pc->peers->mutex); */
33 32
52 51
53 pc->cached = 0; 52 pc->cached = 0;
54 pc->connection = NULL; 53 pc->connection = NULL;
55 54
56 if (pc->peers->number == 1) { 55 if (pc->peers->number == 1) {
57 peer = &pc->peers->peers[0]; 56 peer = &pc->peers->peer[0];
58 57
59 } else { 58 } else {
60 59
61 /* there are several peers */ 60 /* there are several peers */
62 61
63 if (pc->tries == pc->peers->number) { 62 if (pc->tries == pc->peers->number) {
64 63
65 /* it's a first try - get a current peer */ 64 /* it's a first try - get a current peer */
66 65
67 pc->cur_peer = pc->peers->current++; 66 pc->cur_peer = pc->peers->current;
67
68 pc->peers->weight--;
69
70 if (pc->peers->weight == 0) {
71 pc->peers->current++;
72 }
68 73
69 if (pc->peers->current >= pc->peers->number) { 74 if (pc->peers->current >= pc->peers->number) {
70 pc->peers->current = 0; 75 pc->peers->current = 0;
71 } 76 }
72 } 77
73 78 if (pc->peers->weight == 0) {
74 if (pc->peers->max_fails == 0) { 79 pc->peers->weight = pc->peers->peer[pc->peers->current].weight;
75 peer = &pc->peers->peers[pc->cur_peer]; 80 }
76 81 }
77 } else { 82
78 83 for ( ;; ) {
79 /* the peers support a fault tolerance */ 84 peer = &pc->peers->peer[pc->cur_peer];
80 85
81 for ( ;; ) { 86 if (peer->fails <= peer->max_fails) {
82 peer = &pc->peers->peers[pc->cur_peer]; 87 break;
83 88 }
84 if (peer->fails <= pc->peers->max_fails) { 89
85 break; 90 if (now - peer->accessed > peer->fail_timeout) {
86 } 91 peer->fails = 0;
87 92 break;
88 if (now - peer->accessed > pc->peers->fail_timeout) { 93 }
89 peer->fails = 0; 94
90 break; 95 pc->cur_peer++;
91 } 96
92 97 if (pc->cur_peer >= pc->peers->number) {
93 pc->cur_peer++; 98 pc->cur_peer = 0;
94 99 }
95 if (pc->cur_peer >= pc->peers->number) { 100
96 pc->cur_peer = 0; 101 pc->tries--;
97 } 102
98 103 if (pc->tries == 0) {
99 pc->tries--; 104 /* ngx_unlock_mutex(pc->peers->mutex); */
100 105
101 if (pc->tries == 0) { 106 return NGX_ERROR;
102 /* ngx_unlock_mutex(pc->peers->mutex); */
103
104 return NGX_ERROR;
105 }
106 } 107 }
107 } 108 }
108 } 109 }
109 110
110 /* ngx_unlock_mutex(pc->peers->mutex); */ 111 /* ngx_unlock_mutex(pc->peers->mutex); */
111 112
112 113
113 s = ngx_socket(AF_INET, SOCK_STREAM, IPPROTO_IP); 114 s = ngx_socket(peer->sockaddr->sa_family, SOCK_STREAM, 0);
114 115
115 if (s == -1) { 116 if (s == -1) {
116 ngx_log_error(NGX_LOG_ALERT, pc->log, ngx_socket_errno, 117 ngx_log_error(NGX_LOG_ALERT, pc->log, ngx_socket_errno,
117 ngx_socket_n " failed"); 118 ngx_socket_n " failed");
118 return NGX_ERROR; 119 return NGX_ERROR;
255 if (ngx_add_conn(c) == NGX_ERROR) { 256 if (ngx_add_conn(c) == NGX_ERROR) {
256 return NGX_ERROR; 257 return NGX_ERROR;
257 } 258 }
258 } 259 }
259 260
260 ngx_memzero(&addr, sizeof(struct sockaddr_in));
261
262 addr.sin_family = AF_INET;
263 addr.sin_port = peer->port;
264 addr.sin_addr.s_addr = peer->addr;
265
266 ngx_log_debug2(NGX_LOG_DEBUG_EVENT, pc->log, 0, 261 ngx_log_debug2(NGX_LOG_DEBUG_EVENT, pc->log, 0,
267 "connect to %V, #%d", &peer->addr_port_text, c->number); 262 "connect to %V, #%d", &peer->name, c->number);
268 263
269 rc = connect(s, (struct sockaddr *) &addr, sizeof(struct sockaddr_in)); 264 rc = connect(s, peer->sockaddr, peer->socklen);
270 265
271 if (rc == -1) { 266 if (rc == -1) {
272 err = ngx_socket_errno; 267 err = ngx_socket_errno;
273 268
274 /* Winsock returns WSAEWOULDBLOCK (NGX_EAGAIN) */ 269 /* Winsock returns WSAEWOULDBLOCK (NGX_EAGAIN) */
365 360
366 now = ngx_time(); 361 now = ngx_time();
367 362
368 /* ngx_lock_mutex(pc->peers->mutex); */ 363 /* ngx_lock_mutex(pc->peers->mutex); */
369 364
370 pc->peers->peers[pc->cur_peer].fails++; 365 pc->peers->peer[pc->cur_peer].fails++;
371 pc->peers->peers[pc->cur_peer].accessed = now; 366 pc->peers->peer[pc->cur_peer].accessed = now;
372 367
373 /* ngx_unlock_mutex(pc->peers->mutex); */ 368 /* ngx_unlock_mutex(pc->peers->mutex); */
374 369
375 pc->cur_peer++; 370 pc->cur_peer++;
376 371