annotate 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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2 /*
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
3 * Copyright (C) Igor Sysoev
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
4 */
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
5
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
6
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
7 #include <ngx_config.h>
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
8 #include <ngx_core.h>
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
9 #include <ngx_event.h>
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
10 #include <ngx_event_connect.h>
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
11
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
12
36
a39d1b793287 nginx 0.1.18
Igor Sysoev <http://sysoev.ru>
parents: 32
diff changeset
13 ngx_int_t
a39d1b793287 nginx 0.1.18
Igor Sysoev <http://sysoev.ru>
parents: 32
diff changeset
14 ngx_event_connect_peer(ngx_peer_connection_t *pc)
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
15 {
92
45945fa8b8ba nginx 0.2.0
Igor Sysoev <http://sysoev.ru>
parents: 90
diff changeset
16 int rc;
110
dad2fe8ecf08 nginx 0.3.2
Igor Sysoev <http://sysoev.ru>
parents: 94
diff changeset
17 ngx_uint_t level, i;
92
45945fa8b8ba nginx 0.2.0
Igor Sysoev <http://sysoev.ru>
parents: 90
diff changeset
18 u_int event;
45945fa8b8ba nginx 0.2.0
Igor Sysoev <http://sysoev.ru>
parents: 90
diff changeset
19 time_t now;
45945fa8b8ba nginx 0.2.0
Igor Sysoev <http://sysoev.ru>
parents: 90
diff changeset
20 ngx_err_t err;
45945fa8b8ba nginx 0.2.0
Igor Sysoev <http://sysoev.ru>
parents: 90
diff changeset
21 ngx_peer_t *peer;
45945fa8b8ba nginx 0.2.0
Igor Sysoev <http://sysoev.ru>
parents: 90
diff changeset
22 ngx_socket_t s;
45945fa8b8ba nginx 0.2.0
Igor Sysoev <http://sysoev.ru>
parents: 90
diff changeset
23 ngx_event_t *rev, *wev;
45945fa8b8ba nginx 0.2.0
Igor Sysoev <http://sysoev.ru>
parents: 90
diff changeset
24 ngx_connection_t *c;
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
25
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
26 now = ngx_time();
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
27
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
28 /* ngx_lock_mutex(pc->peers->mutex); */
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
29
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
30 if (pc->peers->last_cached) {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
31
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
32 /* cached connection */
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
33
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
34 c = pc->peers->cached[pc->peers->last_cached];
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
35 pc->peers->last_cached--;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
36
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
37 /* ngx_unlock_mutex(pc->peers->mutex); */
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
38
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
39 #if (NGX_THREADS)
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
40 c->read->lock = c->read->own_lock;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
41 c->write->lock = c->write->own_lock;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
42 #endif
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
43
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
44 pc->connection = c;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
45 pc->cached = 1;
92
45945fa8b8ba nginx 0.2.0
Igor Sysoev <http://sysoev.ru>
parents: 90
diff changeset
46
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
47 return NGX_OK;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
48 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
49
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
50 pc->cached = 0;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
51 pc->connection = NULL;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
52
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
53 if (pc->peers->number == 1) {
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents: 22
diff changeset
54 peer = &pc->peers->peer[0];
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
55
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
56 } else {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
57
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
58 /* there are several peers */
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
59
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
60 if (pc->tries == pc->peers->number) {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
61
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
62 /* it's a first try - get a current peer */
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
63
196
8759b346e431 nginx 0.3.45
Igor Sysoev <http://sysoev.ru>
parents: 132
diff changeset
64 for ( ;; ) {
8759b346e431 nginx 0.3.45
Igor Sysoev <http://sysoev.ru>
parents: 132
diff changeset
65 pc->cur_peer = pc->peers->current;
8759b346e431 nginx 0.3.45
Igor Sysoev <http://sysoev.ru>
parents: 132
diff changeset
66
8759b346e431 nginx 0.3.45
Igor Sysoev <http://sysoev.ru>
parents: 132
diff changeset
67 peer = &pc->peers->peer[pc->cur_peer];
8759b346e431 nginx 0.3.45
Igor Sysoev <http://sysoev.ru>
parents: 132
diff changeset
68
8759b346e431 nginx 0.3.45
Igor Sysoev <http://sysoev.ru>
parents: 132
diff changeset
69 if (peer->max_fails == 0 || peer->fails <= peer->max_fails) {
8759b346e431 nginx 0.3.45
Igor Sysoev <http://sysoev.ru>
parents: 132
diff changeset
70 break;
8759b346e431 nginx 0.3.45
Igor Sysoev <http://sysoev.ru>
parents: 132
diff changeset
71 }
8759b346e431 nginx 0.3.45
Igor Sysoev <http://sysoev.ru>
parents: 132
diff changeset
72
8759b346e431 nginx 0.3.45
Igor Sysoev <http://sysoev.ru>
parents: 132
diff changeset
73 if (now - peer->accessed > peer->fail_timeout) {
8759b346e431 nginx 0.3.45
Igor Sysoev <http://sysoev.ru>
parents: 132
diff changeset
74 peer->fails = 0;
8759b346e431 nginx 0.3.45
Igor Sysoev <http://sysoev.ru>
parents: 132
diff changeset
75 break;
8759b346e431 nginx 0.3.45
Igor Sysoev <http://sysoev.ru>
parents: 132
diff changeset
76 }
8759b346e431 nginx 0.3.45
Igor Sysoev <http://sysoev.ru>
parents: 132
diff changeset
77
8759b346e431 nginx 0.3.45
Igor Sysoev <http://sysoev.ru>
parents: 132
diff changeset
78 pc->peers->current++;
8759b346e431 nginx 0.3.45
Igor Sysoev <http://sysoev.ru>
parents: 132
diff changeset
79
8759b346e431 nginx 0.3.45
Igor Sysoev <http://sysoev.ru>
parents: 132
diff changeset
80 if (pc->peers->current >= pc->peers->number) {
8759b346e431 nginx 0.3.45
Igor Sysoev <http://sysoev.ru>
parents: 132
diff changeset
81 pc->peers->current = 0;
8759b346e431 nginx 0.3.45
Igor Sysoev <http://sysoev.ru>
parents: 132
diff changeset
82 }
8759b346e431 nginx 0.3.45
Igor Sysoev <http://sysoev.ru>
parents: 132
diff changeset
83
8759b346e431 nginx 0.3.45
Igor Sysoev <http://sysoev.ru>
parents: 132
diff changeset
84 pc->peers->weight = pc->peers->peer[pc->peers->current].weight;
8759b346e431 nginx 0.3.45
Igor Sysoev <http://sysoev.ru>
parents: 132
diff changeset
85
8759b346e431 nginx 0.3.45
Igor Sysoev <http://sysoev.ru>
parents: 132
diff changeset
86 pc->tries--;
8759b346e431 nginx 0.3.45
Igor Sysoev <http://sysoev.ru>
parents: 132
diff changeset
87
8759b346e431 nginx 0.3.45
Igor Sysoev <http://sysoev.ru>
parents: 132
diff changeset
88 if (pc->tries) {
8759b346e431 nginx 0.3.45
Igor Sysoev <http://sysoev.ru>
parents: 132
diff changeset
89 continue;
8759b346e431 nginx 0.3.45
Igor Sysoev <http://sysoev.ru>
parents: 132
diff changeset
90 }
8759b346e431 nginx 0.3.45
Igor Sysoev <http://sysoev.ru>
parents: 132
diff changeset
91
8759b346e431 nginx 0.3.45
Igor Sysoev <http://sysoev.ru>
parents: 132
diff changeset
92 goto failed;
8759b346e431 nginx 0.3.45
Igor Sysoev <http://sysoev.ru>
parents: 132
diff changeset
93 }
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents: 22
diff changeset
94
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents: 22
diff changeset
95 pc->peers->weight--;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents: 22
diff changeset
96
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents: 22
diff changeset
97 if (pc->peers->weight == 0) {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents: 22
diff changeset
98 pc->peers->current++;
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
99
196
8759b346e431 nginx 0.3.45
Igor Sysoev <http://sysoev.ru>
parents: 132
diff changeset
100 if (pc->peers->current >= pc->peers->number) {
8759b346e431 nginx 0.3.45
Igor Sysoev <http://sysoev.ru>
parents: 132
diff changeset
101 pc->peers->current = 0;
8759b346e431 nginx 0.3.45
Igor Sysoev <http://sysoev.ru>
parents: 132
diff changeset
102 }
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents: 22
diff changeset
103
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents: 22
diff changeset
104 pc->peers->weight = pc->peers->peer[pc->peers->current].weight;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents: 22
diff changeset
105 }
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
106
196
8759b346e431 nginx 0.3.45
Igor Sysoev <http://sysoev.ru>
parents: 132
diff changeset
107 } else {
8759b346e431 nginx 0.3.45
Igor Sysoev <http://sysoev.ru>
parents: 132
diff changeset
108 for ( ;; ) {
8759b346e431 nginx 0.3.45
Igor Sysoev <http://sysoev.ru>
parents: 132
diff changeset
109 peer = &pc->peers->peer[pc->cur_peer];
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
110
196
8759b346e431 nginx 0.3.45
Igor Sysoev <http://sysoev.ru>
parents: 132
diff changeset
111 if (peer->max_fails == 0 || peer->fails <= peer->max_fails) {
8759b346e431 nginx 0.3.45
Igor Sysoev <http://sysoev.ru>
parents: 132
diff changeset
112 break;
8759b346e431 nginx 0.3.45
Igor Sysoev <http://sysoev.ru>
parents: 132
diff changeset
113 }
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
114
196
8759b346e431 nginx 0.3.45
Igor Sysoev <http://sysoev.ru>
parents: 132
diff changeset
115 if (now - peer->accessed > peer->fail_timeout) {
8759b346e431 nginx 0.3.45
Igor Sysoev <http://sysoev.ru>
parents: 132
diff changeset
116 peer->fails = 0;
8759b346e431 nginx 0.3.45
Igor Sysoev <http://sysoev.ru>
parents: 132
diff changeset
117 break;
92
45945fa8b8ba nginx 0.2.0
Igor Sysoev <http://sysoev.ru>
parents: 90
diff changeset
118 }
45945fa8b8ba nginx 0.2.0
Igor Sysoev <http://sysoev.ru>
parents: 90
diff changeset
119
196
8759b346e431 nginx 0.3.45
Igor Sysoev <http://sysoev.ru>
parents: 132
diff changeset
120 pc->cur_peer++;
8759b346e431 nginx 0.3.45
Igor Sysoev <http://sysoev.ru>
parents: 132
diff changeset
121
8759b346e431 nginx 0.3.45
Igor Sysoev <http://sysoev.ru>
parents: 132
diff changeset
122 if (pc->cur_peer >= pc->peers->number) {
8759b346e431 nginx 0.3.45
Igor Sysoev <http://sysoev.ru>
parents: 132
diff changeset
123 pc->cur_peer = 0;
8759b346e431 nginx 0.3.45
Igor Sysoev <http://sysoev.ru>
parents: 132
diff changeset
124 }
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
125
196
8759b346e431 nginx 0.3.45
Igor Sysoev <http://sysoev.ru>
parents: 132
diff changeset
126 pc->tries--;
8759b346e431 nginx 0.3.45
Igor Sysoev <http://sysoev.ru>
parents: 132
diff changeset
127
8759b346e431 nginx 0.3.45
Igor Sysoev <http://sysoev.ru>
parents: 132
diff changeset
128 if (pc->tries) {
8759b346e431 nginx 0.3.45
Igor Sysoev <http://sysoev.ru>
parents: 132
diff changeset
129 continue;
8759b346e431 nginx 0.3.45
Igor Sysoev <http://sysoev.ru>
parents: 132
diff changeset
130 }
8759b346e431 nginx 0.3.45
Igor Sysoev <http://sysoev.ru>
parents: 132
diff changeset
131
8759b346e431 nginx 0.3.45
Igor Sysoev <http://sysoev.ru>
parents: 132
diff changeset
132 goto failed;
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
133 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
134 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
135 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
136
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
137 /* ngx_unlock_mutex(pc->peers->mutex); */
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
138
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
139
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents: 22
diff changeset
140 s = ngx_socket(peer->sockaddr->sa_family, SOCK_STREAM, 0);
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
141
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 36
diff changeset
142 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, pc->log, 0,
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 36
diff changeset
143 "socket %d", s);
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 36
diff changeset
144
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
145 if (s == -1) {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
146 ngx_log_error(NGX_LOG_ALERT, pc->log, ngx_socket_errno,
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
147 ngx_socket_n " failed");
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
148 return NGX_ERROR;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
149 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
150
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
151
92
45945fa8b8ba nginx 0.2.0
Igor Sysoev <http://sysoev.ru>
parents: 90
diff changeset
152 c = ngx_get_connection(s, pc->log);
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
153
92
45945fa8b8ba nginx 0.2.0
Igor Sysoev <http://sysoev.ru>
parents: 90
diff changeset
154 if (c == NULL) {
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
155 if (ngx_close_socket(s) == -1) {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
156 ngx_log_error(NGX_LOG_ALERT, pc->log, ngx_socket_errno,
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
157 ngx_close_socket_n "failed");
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
158 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
159
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
160 return NGX_ERROR;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
161 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
162
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
163 if (pc->rcvbuf) {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
164 if (setsockopt(s, SOL_SOCKET, SO_RCVBUF,
112
408f195b3482 nginx 0.3.3
Igor Sysoev <http://sysoev.ru>
parents: 110
diff changeset
165 (const void *) &pc->rcvbuf, sizeof(int)) == -1)
408f195b3482 nginx 0.3.3
Igor Sysoev <http://sysoev.ru>
parents: 110
diff changeset
166 {
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
167 ngx_log_error(NGX_LOG_ALERT, pc->log, ngx_socket_errno,
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
168 "setsockopt(SO_RCVBUF) failed");
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
169
92
45945fa8b8ba nginx 0.2.0
Igor Sysoev <http://sysoev.ru>
parents: 90
diff changeset
170 ngx_free_connection(c);
45945fa8b8ba nginx 0.2.0
Igor Sysoev <http://sysoev.ru>
parents: 90
diff changeset
171
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
172 if (ngx_close_socket(s) == -1) {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
173 ngx_log_error(NGX_LOG_ALERT, pc->log, ngx_socket_errno,
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
174 ngx_close_socket_n " failed");
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
175 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
176
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
177 return NGX_ERROR;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
178 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
179 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
180
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
181 if (ngx_nonblocking(s) == -1) {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
182 ngx_log_error(NGX_LOG_ALERT, pc->log, ngx_socket_errno,
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
183 ngx_nonblocking_n " failed");
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
184
92
45945fa8b8ba nginx 0.2.0
Igor Sysoev <http://sysoev.ru>
parents: 90
diff changeset
185 ngx_free_connection(c);
45945fa8b8ba nginx 0.2.0
Igor Sysoev <http://sysoev.ru>
parents: 90
diff changeset
186
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
187 if (ngx_close_socket(s) == -1) {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
188 ngx_log_error(NGX_LOG_ALERT, pc->log, ngx_socket_errno,
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
189 ngx_close_socket_n " failed");
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
190 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
191
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
192 return NGX_ERROR;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
193 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
194
92
45945fa8b8ba nginx 0.2.0
Igor Sysoev <http://sysoev.ru>
parents: 90
diff changeset
195 c->recv = ngx_recv;
45945fa8b8ba nginx 0.2.0
Igor Sysoev <http://sysoev.ru>
parents: 90
diff changeset
196 c->send = ngx_send;
126
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 112
diff changeset
197 c->recv_chain = ngx_recv_chain;
92
45945fa8b8ba nginx 0.2.0
Igor Sysoev <http://sysoev.ru>
parents: 90
diff changeset
198 c->send_chain = ngx_send_chain;
32
da8c190bdaba nginx 0.1.16
Igor Sysoev <http://sysoev.ru>
parents: 28
diff changeset
199
92
45945fa8b8ba nginx 0.2.0
Igor Sysoev <http://sysoev.ru>
parents: 90
diff changeset
200 c->log_error = pc->log_error;
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
201
92
45945fa8b8ba nginx 0.2.0
Igor Sysoev <http://sysoev.ru>
parents: 90
diff changeset
202 if (peer->sockaddr->sa_family != AF_INET) {
45945fa8b8ba nginx 0.2.0
Igor Sysoev <http://sysoev.ru>
parents: 90
diff changeset
203 c->tcp_nopush = NGX_TCP_NOPUSH_DISABLED;
45945fa8b8ba nginx 0.2.0
Igor Sysoev <http://sysoev.ru>
parents: 90
diff changeset
204 c->tcp_nodelay = NGX_TCP_NODELAY_DISABLED;
132
91372f004adf nginx 0.3.13
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
205
91372f004adf nginx 0.3.13
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
206 #if (NGX_SOLARIS)
91372f004adf nginx 0.3.13
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
207 /* Solaris's sendfilev() supports AF_NCA, AF_INET, and AF_INET6 */
91372f004adf nginx 0.3.13
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
208 c->sendfile = 0;
91372f004adf nginx 0.3.13
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
209 #endif
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
210 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
211
110
dad2fe8ecf08 nginx 0.3.2
Igor Sysoev <http://sysoev.ru>
parents: 94
diff changeset
212 rev = c->read;
dad2fe8ecf08 nginx 0.3.2
Igor Sysoev <http://sysoev.ru>
parents: 94
diff changeset
213 wev = c->write;
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
214
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
215 rev->log = pc->log;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
216 wev->log = pc->log;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
217
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
218 pc->connection = c;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
219
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
220 /*
110
dad2fe8ecf08 nginx 0.3.2
Igor Sysoev <http://sysoev.ru>
parents: 94
diff changeset
221 * TODO: MT: - ngx_atomic_fetch_add()
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
222 * or protection by critical section or mutex
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
223 *
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
224 * TODO: MP: - allocated in a shared memory
110
dad2fe8ecf08 nginx 0.3.2
Igor Sysoev <http://sysoev.ru>
parents: 94
diff changeset
225 * - ngx_atomic_fetch_add()
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
226 * or protection by critical section or mutex
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
227 */
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
228
110
dad2fe8ecf08 nginx 0.3.2
Igor Sysoev <http://sysoev.ru>
parents: 94
diff changeset
229 c->number = ngx_atomic_fetch_add(ngx_connection_counter, 1);
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
230
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
231 #if (NGX_THREADS)
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
232 rev->lock = pc->lock;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
233 wev->lock = pc->lock;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
234 rev->own_lock = &c->lock;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
235 wev->own_lock = &c->lock;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
236 #endif
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
237
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
238 if (ngx_add_conn) {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
239 if (ngx_add_conn(c) == NGX_ERROR) {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
240 return NGX_ERROR;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
241 }
126
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 112
diff changeset
242 }
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
243
92
45945fa8b8ba nginx 0.2.0
Igor Sysoev <http://sysoev.ru>
parents: 90
diff changeset
244 ngx_log_debug3(NGX_LOG_DEBUG_EVENT, pc->log, 0,
45945fa8b8ba nginx 0.2.0
Igor Sysoev <http://sysoev.ru>
parents: 90
diff changeset
245 "connect to %V, fd:%d #%d", &peer->name, s, c->number);
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
246
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents: 22
diff changeset
247 rc = connect(s, peer->sockaddr, peer->socklen);
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
248
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
249 if (rc == -1) {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
250 err = ngx_socket_errno;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
251
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
252 /* Winsock returns WSAEWOULDBLOCK (NGX_EAGAIN) */
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
253
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
254 if (err != NGX_EINPROGRESS && err != NGX_EAGAIN) {
36
a39d1b793287 nginx 0.1.18
Igor Sysoev <http://sysoev.ru>
parents: 32
diff changeset
255
90
71c46860eb55 nginx 0.1.45
Igor Sysoev <http://sysoev.ru>
parents: 88
diff changeset
256 if (err == NGX_ECONNREFUSED || err == NGX_EHOSTUNREACH) {
71c46860eb55 nginx 0.1.45
Igor Sysoev <http://sysoev.ru>
parents: 88
diff changeset
257 level = NGX_LOG_ERR;
71c46860eb55 nginx 0.1.45
Igor Sysoev <http://sysoev.ru>
parents: 88
diff changeset
258 } else {
71c46860eb55 nginx 0.1.45
Igor Sysoev <http://sysoev.ru>
parents: 88
diff changeset
259 level = NGX_LOG_CRIT;
71c46860eb55 nginx 0.1.45
Igor Sysoev <http://sysoev.ru>
parents: 88
diff changeset
260 }
36
a39d1b793287 nginx 0.1.18
Igor Sysoev <http://sysoev.ru>
parents: 32
diff changeset
261
90
71c46860eb55 nginx 0.1.45
Igor Sysoev <http://sysoev.ru>
parents: 88
diff changeset
262 ngx_log_error(level, c->log, err, "connect() to %V failed",
71c46860eb55 nginx 0.1.45
Igor Sysoev <http://sysoev.ru>
parents: 88
diff changeset
263 &peer->name);
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
264
92
45945fa8b8ba nginx 0.2.0
Igor Sysoev <http://sysoev.ru>
parents: 90
diff changeset
265 return NGX_DECLINED;
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
266 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
267 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
268
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
269 if (ngx_add_conn) {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
270 if (rc == -1) {
36
a39d1b793287 nginx 0.1.18
Igor Sysoev <http://sysoev.ru>
parents: 32
diff changeset
271
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
272 /* NGX_EINPROGRESS */
36
a39d1b793287 nginx 0.1.18
Igor Sysoev <http://sysoev.ru>
parents: 32
diff changeset
273
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
274 return NGX_AGAIN;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
275 }
126
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 112
diff changeset
276
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
277 ngx_log_debug0(NGX_LOG_DEBUG_EVENT, pc->log, 0, "connected");
32
da8c190bdaba nginx 0.1.16
Igor Sysoev <http://sysoev.ru>
parents: 28
diff changeset
278
da8c190bdaba nginx 0.1.16
Igor Sysoev <http://sysoev.ru>
parents: 28
diff changeset
279 wev->ready = 1;
da8c190bdaba nginx 0.1.16
Igor Sysoev <http://sysoev.ru>
parents: 28
diff changeset
280
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
281 return NGX_OK;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
282 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
283
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
284 if (ngx_event_flags & NGX_USE_AIO_EVENT) {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
285
4
4b2dafa26fe2 nginx 0.1.2
Igor Sysoev <http://sysoev.ru>
parents: 0
diff changeset
286 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, pc->log, ngx_socket_errno,
4b2dafa26fe2 nginx 0.1.2
Igor Sysoev <http://sysoev.ru>
parents: 0
diff changeset
287 "connect(): %d", rc);
4b2dafa26fe2 nginx 0.1.2
Igor Sysoev <http://sysoev.ru>
parents: 0
diff changeset
288
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
289 /* aio, iocp */
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
290
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
291 if (ngx_blocking(s) == -1) {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
292 ngx_log_error(NGX_LOG_ALERT, pc->log, ngx_socket_errno,
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
293 ngx_blocking_n " failed");
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
294 return NGX_ERROR;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
295 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
296
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
297 /*
36
a39d1b793287 nginx 0.1.18
Igor Sysoev <http://sysoev.ru>
parents: 32
diff changeset
298 * FreeBSD's aio allows to post an operation on non-connected socket.
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
299 * NT does not support it.
126
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 112
diff changeset
300 *
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
301 * TODO: check in Win32, etc. As workaround we can use NGX_ONESHOT_EVENT
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
302 */
126
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 112
diff changeset
303
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
304 rev->ready = 1;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
305 wev->ready = 1;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
306
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
307 return NGX_OK;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
308 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
309
36
a39d1b793287 nginx 0.1.18
Igor Sysoev <http://sysoev.ru>
parents: 32
diff changeset
310 if (ngx_event_flags & NGX_USE_CLEAR_EVENT) {
a39d1b793287 nginx 0.1.18
Igor Sysoev <http://sysoev.ru>
parents: 32
diff changeset
311
a39d1b793287 nginx 0.1.18
Igor Sysoev <http://sysoev.ru>
parents: 32
diff changeset
312 /* kqueue */
a39d1b793287 nginx 0.1.18
Igor Sysoev <http://sysoev.ru>
parents: 32
diff changeset
313
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
314 event = NGX_CLEAR_EVENT;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
315
36
a39d1b793287 nginx 0.1.18
Igor Sysoev <http://sysoev.ru>
parents: 32
diff changeset
316 } else {
a39d1b793287 nginx 0.1.18
Igor Sysoev <http://sysoev.ru>
parents: 32
diff changeset
317
a39d1b793287 nginx 0.1.18
Igor Sysoev <http://sysoev.ru>
parents: 32
diff changeset
318 /* select, poll, /dev/poll */
a39d1b793287 nginx 0.1.18
Igor Sysoev <http://sysoev.ru>
parents: 32
diff changeset
319
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
320 event = NGX_LEVEL_EVENT;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
321 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
322
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
323 if (ngx_add_event(rev, NGX_READ_EVENT, event) != NGX_OK) {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
324 return NGX_ERROR;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
325 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
326
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
327 if (rc == -1) {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
328
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
329 /* NGX_EINPROGRESS */
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
330
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
331 if (ngx_add_event(wev, NGX_WRITE_EVENT, event) != NGX_OK) {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
332 return NGX_ERROR;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
333 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
334
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
335 return NGX_AGAIN;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
336 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
337
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
338 ngx_log_debug0(NGX_LOG_DEBUG_EVENT, pc->log, 0, "connected");
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
339
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
340 wev->ready = 1;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
341
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
342 return NGX_OK;
196
8759b346e431 nginx 0.3.45
Igor Sysoev <http://sysoev.ru>
parents: 132
diff changeset
343
8759b346e431 nginx 0.3.45
Igor Sysoev <http://sysoev.ru>
parents: 132
diff changeset
344 failed:
8759b346e431 nginx 0.3.45
Igor Sysoev <http://sysoev.ru>
parents: 132
diff changeset
345
8759b346e431 nginx 0.3.45
Igor Sysoev <http://sysoev.ru>
parents: 132
diff changeset
346 /* all peers failed, mark them as live for quick recovery */
8759b346e431 nginx 0.3.45
Igor Sysoev <http://sysoev.ru>
parents: 132
diff changeset
347
8759b346e431 nginx 0.3.45
Igor Sysoev <http://sysoev.ru>
parents: 132
diff changeset
348 for (i = 0; i < pc->peers->number; i++) {
8759b346e431 nginx 0.3.45
Igor Sysoev <http://sysoev.ru>
parents: 132
diff changeset
349 pc->peers->peer[i].fails = 0;
8759b346e431 nginx 0.3.45
Igor Sysoev <http://sysoev.ru>
parents: 132
diff changeset
350 }
8759b346e431 nginx 0.3.45
Igor Sysoev <http://sysoev.ru>
parents: 132
diff changeset
351
8759b346e431 nginx 0.3.45
Igor Sysoev <http://sysoev.ru>
parents: 132
diff changeset
352 /* ngx_unlock_mutex(pc->peers->mutex); */
8759b346e431 nginx 0.3.45
Igor Sysoev <http://sysoev.ru>
parents: 132
diff changeset
353
8759b346e431 nginx 0.3.45
Igor Sysoev <http://sysoev.ru>
parents: 132
diff changeset
354 return NGX_BUSY;
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
355 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
356
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
357
36
a39d1b793287 nginx 0.1.18
Igor Sysoev <http://sysoev.ru>
parents: 32
diff changeset
358 void
74
77969b24f355 nginx 0.1.37
Igor Sysoev <http://sysoev.ru>
parents: 58
diff changeset
359 ngx_event_connect_peer_failed(ngx_peer_connection_t *pc, ngx_uint_t down)
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
360 {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
361 time_t now;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
362
74
77969b24f355 nginx 0.1.37
Igor Sysoev <http://sysoev.ru>
parents: 58
diff changeset
363 if (down) {
77969b24f355 nginx 0.1.37
Igor Sysoev <http://sysoev.ru>
parents: 58
diff changeset
364 now = ngx_time();
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
365
74
77969b24f355 nginx 0.1.37
Igor Sysoev <http://sysoev.ru>
parents: 58
diff changeset
366 /* ngx_lock_mutex(pc->peers->mutex); */
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
367
74
77969b24f355 nginx 0.1.37
Igor Sysoev <http://sysoev.ru>
parents: 58
diff changeset
368 pc->peers->peer[pc->cur_peer].fails++;
77969b24f355 nginx 0.1.37
Igor Sysoev <http://sysoev.ru>
parents: 58
diff changeset
369 pc->peers->peer[pc->cur_peer].accessed = now;
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
370
74
77969b24f355 nginx 0.1.37
Igor Sysoev <http://sysoev.ru>
parents: 58
diff changeset
371 /* ngx_unlock_mutex(pc->peers->mutex); */
77969b24f355 nginx 0.1.37
Igor Sysoev <http://sysoev.ru>
parents: 58
diff changeset
372 }
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
373
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
374 pc->cur_peer++;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
375
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
376 if (pc->cur_peer >= pc->peers->number) {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
377 pc->cur_peer = 0;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
378 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
379
94
c96cb248dc4b nginx 0.2.1
Igor Sysoev <http://sysoev.ru>
parents: 92
diff changeset
380 if (pc->tries) {
c96cb248dc4b nginx 0.2.1
Igor Sysoev <http://sysoev.ru>
parents: 92
diff changeset
381 pc->tries--;
c96cb248dc4b nginx 0.2.1
Igor Sysoev <http://sysoev.ru>
parents: 92
diff changeset
382 }
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
383 }