Mercurial > hg > nginx-quic
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 |