comparison 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
comparison
equal deleted inserted replaced
6101:682d8222c6b1 6102:3264b7828f72
120 120
121 now = ngx_time(); 121 now = ngx_time();
122 122
123 peers = rrp->peers; 123 peers = rrp->peers;
124 124
125 ngx_http_upstream_rr_peers_wlock(peers);
126
125 best = NULL; 127 best = NULL;
126 total = 0; 128 total = 0;
127 129
128 #if (NGX_SUPPRESS_WARN) 130 #if (NGX_SUPPRESS_WARN)
129 many = 0; 131 many = 0;
239 n = p / (8 * sizeof(uintptr_t)); 241 n = p / (8 * sizeof(uintptr_t));
240 m = (uintptr_t) 1 << p % (8 * sizeof(uintptr_t)); 242 m = (uintptr_t) 1 << p % (8 * sizeof(uintptr_t));
241 243
242 rrp->tried[n] |= m; 244 rrp->tried[n] |= m;
243 245
246 ngx_http_upstream_rr_peers_unlock(peers);
247
244 return NGX_OK; 248 return NGX_OK;
245 249
246 failed: 250 failed:
247 251
248 if (peers->next) { 252 if (peers->next) {
256 260
257 for (i = 0; i < n; i++) { 261 for (i = 0; i < n; i++) {
258 rrp->tried[i] = 0; 262 rrp->tried[i] = 0;
259 } 263 }
260 264
265 ngx_http_upstream_rr_peers_unlock(peers);
266
261 rc = ngx_http_upstream_get_least_conn_peer(pc, rrp); 267 rc = ngx_http_upstream_get_least_conn_peer(pc, rrp);
262 268
263 if (rc != NGX_BUSY) { 269 if (rc != NGX_BUSY) {
264 return rc; 270 return rc;
265 } 271 }
272
273 ngx_http_upstream_rr_peers_wlock(peers);
266 } 274 }
267 275
268 /* all peers failed, mark them as live for quick recovery */ 276 /* all peers failed, mark them as live for quick recovery */
269 277
270 for (peer = peers->peer; peer; peer = peer->next) { 278 for (peer = peers->peer; peer; peer = peer->next) {
271 peer->fails = 0; 279 peer->fails = 0;
272 } 280 }
281
282 ngx_http_upstream_rr_peers_unlock(peers);
273 283
274 pc->name = peers->name; 284 pc->name = peers->name;
275 285
276 return NGX_BUSY; 286 return NGX_BUSY;
277 } 287 }