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;