Mercurial > hg > nginx-vendor-current
comparison src/http/ngx_http_upstream_round_robin.c @ 348:e10168d6e371 NGINX_0_6_18
nginx 0.6.18
*) Change: now the ngx_http_userid_module adds start time microseconds
to the cookie field contains a pid value.
*) Change: now the full request line instead of URI only is written to
error_log.
*) Feature: variables support in the "proxy_pass" directive.
*) Feature: the "resolver" and "resolver_timeout" directives.
*) Feature: now the directive "add_header last-modified ''" deletes a
"Last-Modified" response header line.
*) Bugfix: the "limit_rate" directive did not allow to use full
throughput, even if limit value was very high.
author | Igor Sysoev <http://sysoev.ru> |
---|---|
date | Tue, 27 Nov 2007 00:00:00 +0300 |
parents | 10cc350ed8a1 |
children | a39aab45a53f |
comparison
equal
deleted
inserted
replaced
347:d53199b68e17 | 348:e10168d6e371 |
---|---|
245 return NGX_OK; | 245 return NGX_OK; |
246 } | 246 } |
247 | 247 |
248 | 248 |
249 ngx_int_t | 249 ngx_int_t |
250 ngx_http_upstream_create_round_robin_peer(ngx_http_request_t *r, | |
251 ngx_http_upstream_resolved_t *ur) | |
252 { | |
253 u_char *p; | |
254 size_t len; | |
255 ngx_uint_t i, n; | |
256 struct sockaddr_in *sin; | |
257 ngx_http_upstream_rr_peers_t *peers; | |
258 ngx_http_upstream_rr_peer_data_t *rrp; | |
259 | |
260 rrp = r->upstream->peer.data; | |
261 | |
262 if (rrp == NULL) { | |
263 rrp = ngx_palloc(r->pool, sizeof(ngx_http_upstream_rr_peer_data_t)); | |
264 if (rrp == NULL) { | |
265 return NGX_ERROR; | |
266 } | |
267 | |
268 r->upstream->peer.data = rrp; | |
269 } | |
270 | |
271 peers = ngx_pcalloc(r->pool, sizeof(ngx_http_upstream_rr_peers_t) | |
272 + sizeof(ngx_http_upstream_rr_peer_t) * (ur->naddrs - 1)); | |
273 if (peers == NULL) { | |
274 return NGX_ERROR; | |
275 } | |
276 | |
277 peers->single = (ur->naddrs == 1); | |
278 peers->number = ur->naddrs; | |
279 peers->name = &ur->host; | |
280 | |
281 for (i = 0; i < ur->naddrs; i++) { | |
282 | |
283 len = INET_ADDRSTRLEN - 1 + 1 + sizeof(":65536") - 1; | |
284 | |
285 p = ngx_palloc(r->pool, len); | |
286 if (p == NULL) { | |
287 return NGX_ERROR; | |
288 } | |
289 | |
290 len = ngx_inet_ntop(AF_INET, &ur->addrs[i], p, INET_ADDRSTRLEN); | |
291 len = ngx_sprintf(&p[len], ":%d", ur->port) - p; | |
292 | |
293 sin = ngx_pcalloc(r->pool, sizeof(struct sockaddr_in)); | |
294 if (sin == NULL) { | |
295 return NGX_ERROR; | |
296 } | |
297 | |
298 sin->sin_family = AF_INET; | |
299 sin->sin_port = htons(ur->port); | |
300 sin->sin_addr.s_addr = ur->addrs[i]; | |
301 | |
302 peers->peer[i].sockaddr = (struct sockaddr *) sin; | |
303 peers->peer[i].socklen = sizeof(struct sockaddr_in); | |
304 peers->peer[i].name.len = len; | |
305 peers->peer[i].name.data = p; | |
306 peers->peer[i].weight = 1; | |
307 peers->peer[i].current_weight = 1; | |
308 peers->peer[i].max_fails = 1; | |
309 peers->peer[i].fail_timeout = 10; | |
310 } | |
311 | |
312 rrp->peers = peers; | |
313 rrp->current = 0; | |
314 | |
315 if (rrp->peers->number <= 8 * sizeof(uintptr_t)) { | |
316 rrp->tried = &rrp->data; | |
317 rrp->data = 0; | |
318 | |
319 } else { | |
320 n = (rrp->peers->number + (8 * sizeof(uintptr_t) - 1)) | |
321 / (8 * sizeof(uintptr_t)); | |
322 | |
323 rrp->tried = ngx_pcalloc(r->pool, n * sizeof(uintptr_t)); | |
324 if (rrp->tried == NULL) { | |
325 return NGX_ERROR; | |
326 } | |
327 } | |
328 | |
329 r->upstream->peer.get = ngx_http_upstream_get_round_robin_peer; | |
330 r->upstream->peer.free = ngx_http_upstream_free_round_robin_peer; | |
331 r->upstream->peer.tries = rrp->peers->number; | |
332 #if (NGX_HTTP_SSL) | |
333 r->upstream->peer.set_session = | |
334 ngx_http_upstream_set_round_robin_peer_session; | |
335 r->upstream->peer.save_session = | |
336 ngx_http_upstream_save_round_robin_peer_session; | |
337 #endif | |
338 | |
339 return NGX_OK; | |
340 } | |
341 | |
342 | |
343 ngx_int_t | |
250 ngx_http_upstream_get_round_robin_peer(ngx_peer_connection_t *pc, void *data) | 344 ngx_http_upstream_get_round_robin_peer(ngx_peer_connection_t *pc, void *data) |
251 { | 345 { |
252 ngx_http_upstream_rr_peer_data_t *rrp = data; | 346 ngx_http_upstream_rr_peer_data_t *rrp = data; |
253 | 347 |
254 time_t now; | 348 time_t now; |