diff options
Diffstat (limited to 'src/event')
| -rw-r--r-- | src/event/ngx_event_connect.c | 26 | ||||
| -rw-r--r-- | src/event/ngx_event_pipe.c | 11 | ||||
| -rw-r--r-- | src/event/ngx_event_pipe.h | 1 |
3 files changed, 27 insertions, 11 deletions
diff --git a/src/event/ngx_event_connect.c b/src/event/ngx_event_connect.c index e42efb8cb..2e4a33554 100644 --- a/src/event/ngx_event_connect.c +++ b/src/event/ngx_event_connect.c @@ -38,7 +38,10 @@ int ngx_event_connect_peer(ngx_peer_connection_t *pc) pc->cached = 0; pc->connection = NULL; - if (pc->peers->number > 1) { + if (pc->peers->number == 1) { + peer = &pc->peers->peers[0]; + + } else { /* there are several peers */ @@ -53,7 +56,10 @@ int ngx_event_connect_peer(ngx_peer_connection_t *pc) } } - if (pc->peers->max_fails > 0) { + if (pc->peers->max_fails == 0) { + peer = &pc->peers->peers[pc->cur_peer]; + + } else { /* the peers support a fault tolerance */ @@ -83,13 +89,8 @@ int ngx_event_connect_peer(ngx_peer_connection_t *pc) } } - peer = &pc->peers->peers[pc->cur_peer]; - /* ngx_unlock_mutex(pc->peers->mutex); */ -#if 0 - pc->addr_port_text = peer->addr_port_text; -#endif s = ngx_socket(AF_INET, SOCK_STREAM, IPPROTO_IP, 0); @@ -263,6 +264,17 @@ ngx_log_debug(pc->log, "CONNECT: %s" _ peer->addr_port_text.data); void ngx_event_connect_peer_failed(ngx_peer_connection_t *pc) { + time_t now; + + now = ngx_time(); + + /* ngx_lock_mutex(pc->peers->mutex); */ + + pc->peers->peers[pc->cur_peer].fails++; + pc->peers->peers[pc->cur_peer].accessed = now; + + /* ngx_unlock_mutex(pc->peers->mutex); */ + pc->cur_peer++; if (pc->cur_peer >= pc->peers->number) { diff --git a/src/event/ngx_event_pipe.c b/src/event/ngx_event_pipe.c index 387d8b861..0d6e89159 100644 --- a/src/event/ngx_event_pipe.c +++ b/src/event/ngx_event_pipe.c @@ -252,7 +252,7 @@ int ngx_event_pipe_read_upstream(ngx_event_pipe_t *p) if (n >= size) { cl->hunk->last = cl->hunk->end; - /* STUB */ cl->hunk->num = p->num++; +/* STUB */ cl->hunk->num = p->num++; if (p->input_filter(p, cl->hunk) == NGX_ERROR) { return NGX_ABORT; @@ -271,15 +271,17 @@ int ngx_event_pipe_read_upstream(ngx_event_pipe_t *p) } if ((p->upstream_eof || p->upstream_error) && p->free_raw_hunks) { - /* STUB */ p->free_raw_hunks->hunk->num = p->num++; +/* STUB */ p->free_raw_hunks->hunk->num = p->num++; if (p->input_filter(p, p->free_raw_hunks->hunk) == NGX_ERROR) { return NGX_ABORT; } p->free_raw_hunks = p->free_raw_hunks->next; - for (cl = p->free_raw_hunks; cl; cl = cl->next) { - ngx_pfree(p->pool, cl->hunk->start); + if (p->free_bufs) { + for (cl = p->free_raw_hunks; cl; cl = cl->next) { + ngx_pfree(p->pool, cl->hunk->start); + } } } @@ -394,6 +396,7 @@ int ngx_event_pipe_write_to_downstream(ngx_event_pipe_t *p) for (cl = p->free; cl; cl = cl->next) { + /* TODO: free hunk if p->free_bufs && upstream done */ /* add the free shadow raw hunk to p->free_raw_hunks */ if (cl->hunk->type & NGX_HUNK_LAST_SHADOW) { diff --git a/src/event/ngx_event_pipe.h b/src/event/ngx_event_pipe.h index fc68cc6e7..662d65f70 100644 --- a/src/event/ngx_event_pipe.h +++ b/src/event/ngx_event_pipe.h @@ -39,6 +39,7 @@ struct ngx_event_pipe_s { unsigned read:1; unsigned cachable:1; unsigned single_buf:1; + unsigned free_bufs:1; unsigned upstream_done:1; unsigned upstream_error:1; unsigned upstream_eof:1; |
