Mercurial > hg > nginx
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; |