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