Mercurial > hg > nginx
diff src/event/ngx_event_connect.c @ 884:4d68c486fcb0
upstream choice modules
author | Igor Sysoev <igor@sysoev.ru> |
---|---|
date | Mon, 04 Dec 2006 16:46:13 +0000 |
parents | 6d5c1535bb9d |
children | 6c25a49e548a |
line wrap: on
line diff
--- a/src/event/ngx_event_connect.c +++ b/src/event/ngx_event_connect.c @@ -14,145 +14,21 @@ ngx_int_t ngx_event_connect_peer(ngx_peer_connection_t *pc) { int rc; - ngx_uint_t level, i; u_int event; - time_t now; ngx_err_t err; - ngx_peer_t *peer; + ngx_uint_t level; ngx_socket_t s; ngx_event_t *rev, *wev; ngx_connection_t *c; - now = ngx_time(); - - /* ngx_lock_mutex(pc->peers->mutex); */ - - if (pc->peers->last_cached) { - - /* cached connection */ - - c = pc->peers->cached[pc->peers->last_cached]; - pc->peers->last_cached--; - - /* ngx_unlock_mutex(pc->peers->mutex); */ - -#if (NGX_THREADS) - c->read->lock = c->read->own_lock; - c->write->lock = c->write->own_lock; -#endif - - pc->connection = c; - pc->cached = 1; - - return NGX_OK; + rc = pc->get(pc, pc->data); + if (rc != NGX_OK) { + return rc; } - pc->cached = 0; - pc->connection = NULL; - - if (pc->peers->number == 1) { - peer = &pc->peers->peer[0]; - - } else { - - /* there are several peers */ - - if (pc->tries == pc->peers->number) { - - /* it's a first try - get a current peer */ - - for ( ;; ) { - pc->cur_peer = pc->peers->current; - - peer = &pc->peers->peer[pc->cur_peer]; - - if (peer->max_fails == 0 || peer->fails <= peer->max_fails) { - break; - } - - if (now - peer->accessed > peer->fail_timeout) { - peer->fails = 0; - break; - } - - pc->peers->current++; - - if (pc->peers->current >= pc->peers->number) { - pc->peers->current = 0; - } - - pc->tries--; - - if (pc->tries) { - continue; - } - - goto failed; - } - - peer->current_weight--; - - if (peer->current_weight == 0) { - peer->current_weight = peer->weight; - - pc->peers->current++; + s = ngx_socket(pc->sockaddr->sa_family, SOCK_STREAM, 0); - if (pc->peers->current >= pc->peers->number) { - pc->peers->current = 0; - } - } - - } else { - for ( ;; ) { - peer = &pc->peers->peer[pc->cur_peer]; - - if (peer->max_fails == 0 || peer->fails <= peer->max_fails) { - break; - } - - if (now - peer->accessed > peer->fail_timeout) { - peer->fails = 0; - break; - } - - pc->cur_peer++; - - if (pc->cur_peer >= pc->peers->number) { - pc->cur_peer = 0; - } - - pc->tries--; - - if (pc->tries) { - continue; - } - - goto failed; - } - - peer->current_weight--; - - if (peer->current_weight == 0) { - peer->current_weight = peer->weight; - - if (pc->cur_peer == pc->peers->current) { - pc->peers->current++; - - if (pc->peers->current >= pc->peers->number) { - pc->peers->current = 0; - } - } - } - } - } - - /* ngx_unlock_mutex(pc->peers->mutex); */ - - - s = ngx_socket(peer->sockaddr->sa_family, SOCK_STREAM, 0); - - ngx_log_debug1(NGX_LOG_DEBUG_EVENT, pc->log, 0, - "socket %d", s); + ngx_log_debug1(NGX_LOG_DEBUG_EVENT, pc->log, 0, "socket %d", s); if (s == -1) { ngx_log_error(NGX_LOG_ALERT, pc->log, ngx_socket_errno, @@ -211,7 +87,7 @@ ngx_event_connect_peer(ngx_peer_connecti c->log_error = pc->log_error; - if (peer->sockaddr->sa_family != AF_INET) { + if (pc->sockaddr->sa_family != AF_INET) { c->tcp_nopush = NGX_TCP_NOPUSH_DISABLED; c->tcp_nodelay = NGX_TCP_NODELAY_DISABLED; @@ -254,9 +130,9 @@ ngx_event_connect_peer(ngx_peer_connecti } ngx_log_debug3(NGX_LOG_DEBUG_EVENT, pc->log, 0, - "connect to %V, fd:%d #%d", &peer->name, s, c->number); + "connect to %V, fd:%d #%d", pc->name, s, c->number); - rc = connect(s, peer->sockaddr, peer->socklen); + rc = connect(s, pc->sockaddr, pc->socklen); if (rc == -1) { err = ngx_socket_errno; @@ -272,7 +148,7 @@ ngx_event_connect_peer(ngx_peer_connecti } ngx_log_error(level, c->log, err, "connect() to %V failed", - &peer->name); + pc->name); return NGX_DECLINED; } @@ -352,51 +228,11 @@ ngx_event_connect_peer(ngx_peer_connecti wev->ready = 1; return NGX_OK; - -failed: - - /* all peers failed, mark them as live for quick recovery */ - - for (i = 0; i < pc->peers->number; i++) { - pc->peers->peer[i].fails = 0; - } - - /* ngx_unlock_mutex(pc->peers->mutex); */ - - return NGX_BUSY; } -void -ngx_event_connect_peer_failed(ngx_peer_connection_t *pc, ngx_uint_t down) +ngx_int_t +ngx_event_get_peer(ngx_peer_connection_t *pc, void *data) { - time_t now; - ngx_peer_t *peer; - - if (down) { - now = ngx_time(); - - /* ngx_lock_mutex(pc->peers->mutex); */ - - peer = &pc->peers->peer[pc->cur_peer]; - - peer->fails++; - peer->accessed = now; - - if (peer->current_weight > 1) { - peer->current_weight /= 2; - } - - /* ngx_unlock_mutex(pc->peers->mutex); */ - } - - pc->cur_peer++; - - if (pc->cur_peer >= pc->peers->number) { - pc->cur_peer = 0; - } - - if (pc->tries) { - pc->tries--; - } + return NGX_OK; }