Mercurial > hg > nginx
comparison src/http/ngx_http_upstream_round_robin.c @ 6102:3264b7828f72
Upstreams: locking.
author | Ruslan Ermilov <ru@nginx.com> |
---|---|
date | Tue, 14 Apr 2015 19:01:23 +0300 |
parents | c44459611d91 |
children | 79ddb0bdb273 |
comparison
equal
deleted
inserted
replaced
6101:682d8222c6b1 | 6102:3264b7828f72 |
---|---|
430 | 430 |
431 pc->cached = 0; | 431 pc->cached = 0; |
432 pc->connection = NULL; | 432 pc->connection = NULL; |
433 | 433 |
434 peers = rrp->peers; | 434 peers = rrp->peers; |
435 | 435 ngx_http_upstream_rr_peers_wlock(peers); |
436 /* ngx_lock_mutex(peers->mutex); */ | |
437 | 436 |
438 if (peers->single) { | 437 if (peers->single) { |
439 peer = peers->peer; | 438 peer = peers->peer; |
440 | 439 |
441 if (peer->down) { | 440 if (peer->down) { |
463 pc->socklen = peer->socklen; | 462 pc->socklen = peer->socklen; |
464 pc->name = &peer->name; | 463 pc->name = &peer->name; |
465 | 464 |
466 peer->conns++; | 465 peer->conns++; |
467 | 466 |
468 /* ngx_unlock_mutex(peers->mutex); */ | 467 ngx_http_upstream_rr_peers_unlock(peers); |
469 | 468 |
470 return NGX_OK; | 469 return NGX_OK; |
471 | 470 |
472 failed: | 471 failed: |
473 | 472 |
474 if (peers->next) { | 473 if (peers->next) { |
475 | |
476 /* ngx_unlock_mutex(peers->mutex); */ | |
477 | 474 |
478 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, pc->log, 0, "backup servers"); | 475 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, pc->log, 0, "backup servers"); |
479 | 476 |
480 rrp->peers = peers->next; | 477 rrp->peers = peers->next; |
481 | 478 |
484 | 481 |
485 for (i = 0; i < n; i++) { | 482 for (i = 0; i < n; i++) { |
486 rrp->tried[i] = 0; | 483 rrp->tried[i] = 0; |
487 } | 484 } |
488 | 485 |
486 ngx_http_upstream_rr_peers_unlock(peers); | |
487 | |
489 rc = ngx_http_upstream_get_round_robin_peer(pc, rrp); | 488 rc = ngx_http_upstream_get_round_robin_peer(pc, rrp); |
490 | 489 |
491 if (rc != NGX_BUSY) { | 490 if (rc != NGX_BUSY) { |
492 return rc; | 491 return rc; |
493 } | 492 } |
494 | 493 |
495 /* ngx_lock_mutex(peers->mutex); */ | 494 ngx_http_upstream_rr_peers_wlock(peers); |
496 } | 495 } |
497 | 496 |
498 /* all peers failed, mark them as live for quick recovery */ | 497 /* all peers failed, mark them as live for quick recovery */ |
499 | 498 |
500 for (peer = peers->peer; peer; peer = peer->next) { | 499 for (peer = peers->peer; peer; peer = peer->next) { |
501 peer->fails = 0; | 500 peer->fails = 0; |
502 } | 501 } |
503 | 502 |
504 /* ngx_unlock_mutex(peers->mutex); */ | 503 ngx_http_upstream_rr_peers_unlock(peers); |
505 | 504 |
506 pc->name = peers->name; | 505 pc->name = peers->name; |
507 | 506 |
508 return NGX_BUSY; | 507 return NGX_BUSY; |
509 } | 508 } |
606 | 605 |
607 pc->tries = 0; | 606 pc->tries = 0; |
608 return; | 607 return; |
609 } | 608 } |
610 | 609 |
610 ngx_http_upstream_rr_peers_rlock(rrp->peers); | |
611 ngx_http_upstream_rr_peer_lock(rrp->peers, peer); | |
612 | |
611 if (state & NGX_PEER_FAILED) { | 613 if (state & NGX_PEER_FAILED) { |
612 now = ngx_time(); | 614 now = ngx_time(); |
613 | |
614 /* ngx_lock_mutex(rrp->peers->mutex); */ | |
615 | 615 |
616 peer->fails++; | 616 peer->fails++; |
617 peer->accessed = now; | 617 peer->accessed = now; |
618 peer->checked = now; | 618 peer->checked = now; |
619 | 619 |
627 | 627 |
628 if (peer->effective_weight < 0) { | 628 if (peer->effective_weight < 0) { |
629 peer->effective_weight = 0; | 629 peer->effective_weight = 0; |
630 } | 630 } |
631 | 631 |
632 /* ngx_unlock_mutex(rrp->peers->mutex); */ | |
633 | |
634 } else { | 632 } else { |
635 | 633 |
636 /* mark peer live if check passed */ | 634 /* mark peer live if check passed */ |
637 | 635 |
638 if (peer->accessed < peer->checked) { | 636 if (peer->accessed < peer->checked) { |
640 } | 638 } |
641 } | 639 } |
642 | 640 |
643 peer->conns--; | 641 peer->conns--; |
644 | 642 |
643 ngx_http_upstream_rr_peer_unlock(rrp->peers, peer); | |
644 ngx_http_upstream_rr_peers_unlock(rrp->peers); | |
645 | |
645 if (pc->tries) { | 646 if (pc->tries) { |
646 pc->tries--; | 647 pc->tries--; |
647 } | 648 } |
648 | |
649 /* ngx_unlock_mutex(rrp->peers->mutex); */ | |
650 } | 649 } |
651 | 650 |
652 | 651 |
653 #if (NGX_HTTP_SSL) | 652 #if (NGX_HTTP_SSL) |
654 | 653 |
662 ngx_ssl_session_t *ssl_session; | 661 ngx_ssl_session_t *ssl_session; |
663 ngx_http_upstream_rr_peer_t *peer; | 662 ngx_http_upstream_rr_peer_t *peer; |
664 | 663 |
665 peer = rrp->current; | 664 peer = rrp->current; |
666 | 665 |
667 /* TODO: threads only mutex */ | |
668 /* ngx_lock_mutex(rrp->peers->mutex); */ | |
669 | |
670 ssl_session = peer->ssl_session; | 666 ssl_session = peer->ssl_session; |
671 | 667 |
672 rc = ngx_ssl_set_session(pc->connection, ssl_session); | 668 rc = ngx_ssl_set_session(pc->connection, ssl_session); |
673 | 669 |
674 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, pc->log, 0, | 670 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, pc->log, 0, |
675 "set session: %p", ssl_session); | 671 "set session: %p", ssl_session); |
676 | |
677 /* ngx_unlock_mutex(rrp->peers->mutex); */ | |
678 | 672 |
679 return rc; | 673 return rc; |
680 } | 674 } |
681 | 675 |
682 | 676 |
698 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, pc->log, 0, | 692 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, pc->log, 0, |
699 "save session: %p", ssl_session); | 693 "save session: %p", ssl_session); |
700 | 694 |
701 peer = rrp->current; | 695 peer = rrp->current; |
702 | 696 |
703 /* TODO: threads only mutex */ | |
704 /* ngx_lock_mutex(rrp->peers->mutex); */ | |
705 | |
706 old_ssl_session = peer->ssl_session; | 697 old_ssl_session = peer->ssl_session; |
707 peer->ssl_session = ssl_session; | 698 peer->ssl_session = ssl_session; |
708 | 699 |
709 /* ngx_unlock_mutex(rrp->peers->mutex); */ | |
710 | |
711 if (old_ssl_session) { | 700 if (old_ssl_session) { |
712 | 701 |
713 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, pc->log, 0, | 702 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, pc->log, 0, |
714 "old session: %p", old_ssl_session); | 703 "old session: %p", old_ssl_session); |
715 | 704 |