comparison src/stream/ngx_stream_upstream_round_robin.c @ 6643:9757cffc1e2f

Stream: variables in proxy_pass and proxy_ssl_name.
author Vladimir Homutov <vl@nginx.com>
date Tue, 14 Jun 2016 18:29:46 +0300
parents 2cd019520210
children 914d8a63dbad
comparison
equal deleted inserted replaced
6642:72282dd5884e 6643:9757cffc1e2f
21 21
22 static ngx_int_t ngx_stream_upstream_set_round_robin_peer_session( 22 static ngx_int_t ngx_stream_upstream_set_round_robin_peer_session(
23 ngx_peer_connection_t *pc, void *data); 23 ngx_peer_connection_t *pc, void *data);
24 static void ngx_stream_upstream_save_round_robin_peer_session( 24 static void ngx_stream_upstream_save_round_robin_peer_session(
25 ngx_peer_connection_t *pc, void *data); 25 ngx_peer_connection_t *pc, void *data);
26 static ngx_int_t ngx_stream_upstream_empty_set_session(
27 ngx_peer_connection_t *pc, void *data);
28 static void ngx_stream_upstream_empty_save_session(ngx_peer_connection_t *pc,
29 void *data);
26 30
27 #endif 31 #endif
28 32
29 33
30 ngx_int_t 34 ngx_int_t
291 return NGX_OK; 295 return NGX_OK;
292 } 296 }
293 297
294 298
295 ngx_int_t 299 ngx_int_t
300 ngx_stream_upstream_create_round_robin_peer(ngx_stream_session_t *s,
301 ngx_stream_upstream_resolved_t *ur)
302 {
303 u_char *p;
304 size_t len;
305 socklen_t socklen;
306 ngx_uint_t i, n;
307 struct sockaddr *sockaddr;
308 ngx_stream_upstream_rr_peer_t *peer, **peerp;
309 ngx_stream_upstream_rr_peers_t *peers;
310 ngx_stream_upstream_rr_peer_data_t *rrp;
311
312 rrp = s->upstream->peer.data;
313
314 if (rrp == NULL) {
315 rrp = ngx_palloc(s->connection->pool,
316 sizeof(ngx_stream_upstream_rr_peer_data_t));
317 if (rrp == NULL) {
318 return NGX_ERROR;
319 }
320
321 s->upstream->peer.data = rrp;
322 }
323
324 peers = ngx_pcalloc(s->connection->pool,
325 sizeof(ngx_stream_upstream_rr_peers_t));
326 if (peers == NULL) {
327 return NGX_ERROR;
328 }
329
330 peer = ngx_pcalloc(s->connection->pool,
331 sizeof(ngx_stream_upstream_rr_peer_t) * ur->naddrs);
332 if (peer == NULL) {
333 return NGX_ERROR;
334 }
335
336 peers->single = (ur->naddrs == 1);
337 peers->number = ur->naddrs;
338 peers->name = &ur->host;
339
340 if (ur->sockaddr) {
341 peer[0].sockaddr = ur->sockaddr;
342 peer[0].socklen = ur->socklen;
343 peer[0].name = ur->host;
344 peer[0].weight = 1;
345 peer[0].effective_weight = 1;
346 peer[0].current_weight = 0;
347 peer[0].max_fails = 1;
348 peer[0].fail_timeout = 10;
349 peers->peer = peer;
350
351 } else {
352 peerp = &peers->peer;
353
354 for (i = 0; i < ur->naddrs; i++) {
355
356 socklen = ur->addrs[i].socklen;
357
358 sockaddr = ngx_palloc(s->connection->pool, socklen);
359 if (sockaddr == NULL) {
360 return NGX_ERROR;
361 }
362
363 ngx_memcpy(sockaddr, ur->addrs[i].sockaddr, socklen);
364 ngx_inet_set_port(sockaddr, ur->port);
365
366 p = ngx_pnalloc(s->connection->pool, NGX_SOCKADDR_STRLEN);
367 if (p == NULL) {
368 return NGX_ERROR;
369 }
370
371 len = ngx_sock_ntop(sockaddr, socklen, p, NGX_SOCKADDR_STRLEN, 1);
372
373 peer[i].sockaddr = sockaddr;
374 peer[i].socklen = socklen;
375 peer[i].name.len = len;
376 peer[i].name.data = p;
377 peer[i].weight = 1;
378 peer[i].effective_weight = 1;
379 peer[i].current_weight = 0;
380 peer[i].max_fails = 1;
381 peer[i].fail_timeout = 10;
382 *peerp = &peer[i];
383 peerp = &peer[i].next;
384 }
385 }
386
387 rrp->peers = peers;
388 rrp->current = NULL;
389
390 if (rrp->peers->number <= 8 * sizeof(uintptr_t)) {
391 rrp->tried = &rrp->data;
392 rrp->data = 0;
393
394 } else {
395 n = (rrp->peers->number + (8 * sizeof(uintptr_t) - 1))
396 / (8 * sizeof(uintptr_t));
397
398 rrp->tried = ngx_pcalloc(s->connection->pool, n * sizeof(uintptr_t));
399 if (rrp->tried == NULL) {
400 return NGX_ERROR;
401 }
402 }
403
404 s->upstream->peer.get = ngx_stream_upstream_get_round_robin_peer;
405 s->upstream->peer.free = ngx_stream_upstream_free_round_robin_peer;
406 s->upstream->peer.tries = ngx_stream_upstream_tries(rrp->peers);
407 #if (NGX_STREAM_SSL)
408 s->upstream->peer.set_session = ngx_stream_upstream_empty_set_session;
409 s->upstream->peer.save_session = ngx_stream_upstream_empty_save_session;
410 #endif
411
412 return NGX_OK;
413 }
414
415
416 ngx_int_t
296 ngx_stream_upstream_get_round_robin_peer(ngx_peer_connection_t *pc, void *data) 417 ngx_stream_upstream_get_round_robin_peer(ngx_peer_connection_t *pc, void *data)
297 { 418 {
298 ngx_stream_upstream_rr_peer_data_t *rrp = data; 419 ngx_stream_upstream_rr_peer_data_t *rrp = data;
299 420
300 ngx_int_t rc; 421 ngx_int_t rc;
697 818
698 ngx_ssl_free_session(old_ssl_session); 819 ngx_ssl_free_session(old_ssl_session);
699 } 820 }
700 } 821 }
701 822
702 #endif 823
824 static ngx_int_t
825 ngx_stream_upstream_empty_set_session(ngx_peer_connection_t *pc, void *data)
826 {
827 return NGX_OK;
828 }
829
830
831 static void
832 ngx_stream_upstream_empty_save_session(ngx_peer_connection_t *pc, void *data)
833 {
834 return;
835 }
836
837 #endif