diff src/http/modules/ngx_http_upstream_least_conn_module.c @ 6102:3264b7828f72

Upstreams: locking.
author Ruslan Ermilov <ru@nginx.com>
date Tue, 14 Apr 2015 19:01:23 +0300
parents c44459611d91
children 2cd019520210
line wrap: on
line diff
--- a/src/http/modules/ngx_http_upstream_least_conn_module.c
+++ b/src/http/modules/ngx_http_upstream_least_conn_module.c
@@ -122,6 +122,8 @@ ngx_http_upstream_get_least_conn_peer(ng
 
     peers = rrp->peers;
 
+    ngx_http_upstream_rr_peers_wlock(peers);
+
     best = NULL;
     total = 0;
 
@@ -241,6 +243,8 @@ ngx_http_upstream_get_least_conn_peer(ng
 
     rrp->tried[n] |= m;
 
+    ngx_http_upstream_rr_peers_unlock(peers);
+
     return NGX_OK;
 
 failed:
@@ -258,11 +262,15 @@ failed:
              rrp->tried[i] = 0;
         }
 
+        ngx_http_upstream_rr_peers_unlock(peers);
+
         rc = ngx_http_upstream_get_least_conn_peer(pc, rrp);
 
         if (rc != NGX_BUSY) {
             return rc;
         }
+
+        ngx_http_upstream_rr_peers_wlock(peers);
     }
 
     /* all peers failed, mark them as live for quick recovery */
@@ -271,6 +279,8 @@ failed:
         peer->fails = 0;
     }
 
+    ngx_http_upstream_rr_peers_unlock(peers);
+
     pc->name = peers->name;
 
     return NGX_BUSY;