diff 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
line wrap: on
line diff
--- a/src/event/ngx_event_connect.c
+++ b/src/event/ngx_event_connect.c
@@ -25,7 +25,6 @@ ngx_int_t ngx_event_connect_peer(ngx_pee
     ngx_event_t         *rev, *wev;
     ngx_connection_t    *c;
     ngx_event_conf_t    *ecf;
-    struct sockaddr_in   addr;
 
     now = ngx_time();
 
@@ -54,7 +53,7 @@ ngx_int_t ngx_event_connect_peer(ngx_pee
     pc->connection = NULL;
 
     if (pc->peers->number == 1) {
-        peer = &pc->peers->peers[0];
+        peer = &pc->peers->peer[0];
 
     } else {
 
@@ -64,45 +63,47 @@ ngx_int_t ngx_event_connect_peer(ngx_pee
 
             /* it's a first try - get a current peer */
 
-            pc->cur_peer = pc->peers->current++;
+            pc->cur_peer = pc->peers->current;
+
+            pc->peers->weight--;
+
+            if (pc->peers->weight == 0) {
+                pc->peers->current++;
+            }
 
             if (pc->peers->current >= pc->peers->number) {
                 pc->peers->current = 0;
             }
+
+            if (pc->peers->weight == 0) {
+                pc->peers->weight = pc->peers->peer[pc->peers->current].weight;
+            }
         }
 
-        if (pc->peers->max_fails == 0) {
-            peer = &pc->peers->peers[pc->cur_peer];
-
-        } else {
-
-            /* the peers support a fault tolerance */
+        for ( ;; ) {
+            peer = &pc->peers->peer[pc->cur_peer];
 
-            for ( ;; ) {
-                peer = &pc->peers->peers[pc->cur_peer];
+            if (peer->fails <= peer->max_fails) {
+                break;
+            }
 
-                if (peer->fails <= pc->peers->max_fails) {
-                    break;
-                }
+            if (now - peer->accessed > peer->fail_timeout) {
+                peer->fails = 0;
+                break;
+            }
 
-                if (now - peer->accessed > pc->peers->fail_timeout) {
-                    peer->fails = 0;
-                    break;
-                }
+            pc->cur_peer++;
 
-                pc->cur_peer++;
+            if (pc->cur_peer >= pc->peers->number) {
+                pc->cur_peer = 0;
+            }
 
-                if (pc->cur_peer >= pc->peers->number) {
-                    pc->cur_peer = 0;
-                }
-
-                pc->tries--;
+            pc->tries--;
 
-                if (pc->tries == 0) {
-                    /* ngx_unlock_mutex(pc->peers->mutex); */
+            if (pc->tries == 0) {
+                /* ngx_unlock_mutex(pc->peers->mutex); */
 
-                    return NGX_ERROR;
-                }
+                return NGX_ERROR;
             }
         }
     }
@@ -110,7 +111,7 @@ ngx_int_t ngx_event_connect_peer(ngx_pee
     /* ngx_unlock_mutex(pc->peers->mutex); */
 
 
-    s = ngx_socket(AF_INET, SOCK_STREAM, IPPROTO_IP);
+    s = ngx_socket(peer->sockaddr->sa_family, SOCK_STREAM, 0);
 
     if (s == -1) {
         ngx_log_error(NGX_LOG_ALERT, pc->log, ngx_socket_errno,
@@ -257,16 +258,10 @@ ngx_int_t ngx_event_connect_peer(ngx_pee
         }
     } 
 
-    ngx_memzero(&addr, sizeof(struct sockaddr_in));
+    ngx_log_debug2(NGX_LOG_DEBUG_EVENT, pc->log, 0,
+                   "connect to %V, #%d", &peer->name, c->number);
 
-    addr.sin_family = AF_INET;
-    addr.sin_port = peer->port;
-    addr.sin_addr.s_addr = peer->addr;
-
-    ngx_log_debug2(NGX_LOG_DEBUG_EVENT, pc->log, 0,
-                   "connect to %V, #%d", &peer->addr_port_text, c->number);
-
-    rc = connect(s, (struct sockaddr *) &addr, sizeof(struct sockaddr_in));
+    rc = connect(s, peer->sockaddr, peer->socklen);
 
     if (rc == -1) {
         err = ngx_socket_errno;
@@ -367,8 +362,8 @@ void ngx_event_connect_peer_failed(ngx_p
 
     /* ngx_lock_mutex(pc->peers->mutex); */
 
-    pc->peers->peers[pc->cur_peer].fails++;
-    pc->peers->peers[pc->cur_peer].accessed = now;
+    pc->peers->peer[pc->cur_peer].fails++;
+    pc->peers->peer[pc->cur_peer].accessed = now;
 
     /* ngx_unlock_mutex(pc->peers->mutex); */