comparison src/http/modules/ngx_http_upstream_hash_module.c @ 7300:ed599ea6c1f1

Upstream: improved peer selection concurrency for hash and ip_hash.
author Ruslan Ermilov <ru@nginx.com>
date Thu, 14 Jun 2018 07:03:50 +0300
parents 3b4fa572d56d
children d964b0aee8e7
comparison
equal deleted inserted replaced
7299:faf14dc9ab4d 7300:ed599ea6c1f1
174 ngx_http_upstream_rr_peer_t *peer; 174 ngx_http_upstream_rr_peer_t *peer;
175 175
176 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, pc->log, 0, 176 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, pc->log, 0,
177 "get hash peer, try: %ui", pc->tries); 177 "get hash peer, try: %ui", pc->tries);
178 178
179 ngx_http_upstream_rr_peers_wlock(hp->rrp.peers); 179 ngx_http_upstream_rr_peers_rlock(hp->rrp.peers);
180 180
181 if (hp->tries > 20 || hp->rrp.peers->single) { 181 if (hp->tries > 20 || hp->rrp.peers->single) {
182 ngx_http_upstream_rr_peers_unlock(hp->rrp.peers); 182 ngx_http_upstream_rr_peers_unlock(hp->rrp.peers);
183 return hp->get_rr_peer(pc, &hp->rrp); 183 return hp->get_rr_peer(pc, &hp->rrp);
184 } 184 }
226 226
227 if (hp->rrp.tried[n] & m) { 227 if (hp->rrp.tried[n] & m) {
228 goto next; 228 goto next;
229 } 229 }
230 230
231 ngx_http_upstream_rr_peer_lock(hp->rrp.peers, peer);
232
231 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, pc->log, 0, 233 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, pc->log, 0,
232 "get hash peer, value:%uD, peer:%ui", hp->hash, p); 234 "get hash peer, value:%uD, peer:%ui", hp->hash, p);
233 235
234 if (peer->down) { 236 if (peer->down) {
237 ngx_http_upstream_rr_peer_unlock(hp->rrp.peers, peer);
235 goto next; 238 goto next;
236 } 239 }
237 240
238 if (peer->max_fails 241 if (peer->max_fails
239 && peer->fails >= peer->max_fails 242 && peer->fails >= peer->max_fails
240 && now - peer->checked <= peer->fail_timeout) 243 && now - peer->checked <= peer->fail_timeout)
241 { 244 {
245 ngx_http_upstream_rr_peer_unlock(hp->rrp.peers, peer);
242 goto next; 246 goto next;
243 } 247 }
244 248
245 if (peer->max_conns && peer->conns >= peer->max_conns) { 249 if (peer->max_conns && peer->conns >= peer->max_conns) {
250 ngx_http_upstream_rr_peer_unlock(hp->rrp.peers, peer);
246 goto next; 251 goto next;
247 } 252 }
248 253
249 break; 254 break;
250 255
266 271
267 if (now - peer->checked > peer->fail_timeout) { 272 if (now - peer->checked > peer->fail_timeout) {
268 peer->checked = now; 273 peer->checked = now;
269 } 274 }
270 275
276 ngx_http_upstream_rr_peer_unlock(hp->rrp.peers, peer);
271 ngx_http_upstream_rr_peers_unlock(hp->rrp.peers); 277 ngx_http_upstream_rr_peers_unlock(hp->rrp.peers);
272 278
273 hp->rrp.tried[n] |= m; 279 hp->rrp.tried[n] |= m;
274 280
275 return NGX_OK; 281 return NGX_OK;