diff 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
line wrap: on
line diff
--- a/src/http/ngx_http_upstream_round_robin.c
+++ b/src/http/ngx_http_upstream_round_robin.c
@@ -432,8 +432,7 @@ ngx_http_upstream_get_round_robin_peer(n
     pc->connection = NULL;
 
     peers = rrp->peers;
-
-    /* ngx_lock_mutex(peers->mutex); */
+    ngx_http_upstream_rr_peers_wlock(peers);
 
     if (peers->single) {
         peer = peers->peer;
@@ -465,7 +464,7 @@ ngx_http_upstream_get_round_robin_peer(n
 
     peer->conns++;
 
-    /* ngx_unlock_mutex(peers->mutex); */
+    ngx_http_upstream_rr_peers_unlock(peers);
 
     return NGX_OK;
 
@@ -473,8 +472,6 @@ failed:
 
     if (peers->next) {
 
-        /* ngx_unlock_mutex(peers->mutex); */
-
         ngx_log_debug0(NGX_LOG_DEBUG_HTTP, pc->log, 0, "backup servers");
 
         rrp->peers = peers->next;
@@ -486,13 +483,15 @@ failed:
              rrp->tried[i] = 0;
         }
 
+        ngx_http_upstream_rr_peers_unlock(peers);
+
         rc = ngx_http_upstream_get_round_robin_peer(pc, rrp);
 
         if (rc != NGX_BUSY) {
             return rc;
         }
 
-        /* ngx_lock_mutex(peers->mutex); */
+        ngx_http_upstream_rr_peers_wlock(peers);
     }
 
     /* all peers failed, mark them as live for quick recovery */
@@ -501,7 +500,7 @@ failed:
         peer->fails = 0;
     }
 
-    /* ngx_unlock_mutex(peers->mutex); */
+    ngx_http_upstream_rr_peers_unlock(peers);
 
     pc->name = peers->name;
 
@@ -608,11 +607,12 @@ ngx_http_upstream_free_round_robin_peer(
         return;
     }
 
+    ngx_http_upstream_rr_peers_rlock(rrp->peers);
+    ngx_http_upstream_rr_peer_lock(rrp->peers, peer);
+
     if (state & NGX_PEER_FAILED) {
         now = ngx_time();
 
-        /* ngx_lock_mutex(rrp->peers->mutex); */
-
         peer->fails++;
         peer->accessed = now;
         peer->checked = now;
@@ -629,8 +629,6 @@ ngx_http_upstream_free_round_robin_peer(
             peer->effective_weight = 0;
         }
 
-        /* ngx_unlock_mutex(rrp->peers->mutex); */
-
     } else {
 
         /* mark peer live if check passed */
@@ -642,11 +640,12 @@ ngx_http_upstream_free_round_robin_peer(
 
     peer->conns--;
 
+    ngx_http_upstream_rr_peer_unlock(rrp->peers, peer);
+    ngx_http_upstream_rr_peers_unlock(rrp->peers);
+
     if (pc->tries) {
         pc->tries--;
     }
-
-    /* ngx_unlock_mutex(rrp->peers->mutex); */
 }
 
 
@@ -664,9 +663,6 @@ ngx_http_upstream_set_round_robin_peer_s
 
     peer = rrp->current;
 
-    /* TODO: threads only mutex */
-    /* ngx_lock_mutex(rrp->peers->mutex); */
-
     ssl_session = peer->ssl_session;
 
     rc = ngx_ssl_set_session(pc->connection, ssl_session);
@@ -674,8 +670,6 @@ ngx_http_upstream_set_round_robin_peer_s
     ngx_log_debug1(NGX_LOG_DEBUG_HTTP, pc->log, 0,
                    "set session: %p", ssl_session);
 
-    /* ngx_unlock_mutex(rrp->peers->mutex); */
-
     return rc;
 }
 
@@ -700,14 +694,9 @@ ngx_http_upstream_save_round_robin_peer_
 
     peer = rrp->current;
 
-    /* TODO: threads only mutex */
-    /* ngx_lock_mutex(rrp->peers->mutex); */
-
     old_ssl_session = peer->ssl_session;
     peer->ssl_session = ssl_session;
 
-    /* ngx_unlock_mutex(rrp->peers->mutex); */
-
     if (old_ssl_session) {
 
         ngx_log_debug1(NGX_LOG_DEBUG_HTTP, pc->log, 0,