Mercurial > hg > nginx-quic
comparison src/http/modules/ngx_http_upstream_ip_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 | 29bf0dbc0a77 |
children |
comparison
equal
deleted
inserted
replaced
7299:faf14dc9ab4d | 7300:ed599ea6c1f1 |
---|---|
159 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, pc->log, 0, | 159 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, pc->log, 0, |
160 "get ip hash peer, try: %ui", pc->tries); | 160 "get ip hash peer, try: %ui", pc->tries); |
161 | 161 |
162 /* TODO: cached */ | 162 /* TODO: cached */ |
163 | 163 |
164 ngx_http_upstream_rr_peers_wlock(iphp->rrp.peers); | 164 ngx_http_upstream_rr_peers_rlock(iphp->rrp.peers); |
165 | 165 |
166 if (iphp->tries > 20 || iphp->rrp.peers->single) { | 166 if (iphp->tries > 20 || iphp->rrp.peers->single) { |
167 ngx_http_upstream_rr_peers_unlock(iphp->rrp.peers); | 167 ngx_http_upstream_rr_peers_unlock(iphp->rrp.peers); |
168 return iphp->get_rr_peer(pc, &iphp->rrp); | 168 return iphp->get_rr_peer(pc, &iphp->rrp); |
169 } | 169 } |
199 } | 199 } |
200 | 200 |
201 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, pc->log, 0, | 201 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, pc->log, 0, |
202 "get ip hash peer, hash: %ui %04XL", p, (uint64_t) m); | 202 "get ip hash peer, hash: %ui %04XL", p, (uint64_t) m); |
203 | 203 |
204 ngx_http_upstream_rr_peer_lock(iphp->rrp.peers, peer); | |
205 | |
204 if (peer->down) { | 206 if (peer->down) { |
207 ngx_http_upstream_rr_peer_unlock(iphp->rrp.peers, peer); | |
205 goto next; | 208 goto next; |
206 } | 209 } |
207 | 210 |
208 if (peer->max_fails | 211 if (peer->max_fails |
209 && peer->fails >= peer->max_fails | 212 && peer->fails >= peer->max_fails |
210 && now - peer->checked <= peer->fail_timeout) | 213 && now - peer->checked <= peer->fail_timeout) |
211 { | 214 { |
215 ngx_http_upstream_rr_peer_unlock(iphp->rrp.peers, peer); | |
212 goto next; | 216 goto next; |
213 } | 217 } |
214 | 218 |
215 if (peer->max_conns && peer->conns >= peer->max_conns) { | 219 if (peer->max_conns && peer->conns >= peer->max_conns) { |
220 ngx_http_upstream_rr_peer_unlock(iphp->rrp.peers, peer); | |
216 goto next; | 221 goto next; |
217 } | 222 } |
218 | 223 |
219 break; | 224 break; |
220 | 225 |
236 | 241 |
237 if (now - peer->checked > peer->fail_timeout) { | 242 if (now - peer->checked > peer->fail_timeout) { |
238 peer->checked = now; | 243 peer->checked = now; |
239 } | 244 } |
240 | 245 |
246 ngx_http_upstream_rr_peer_unlock(iphp->rrp.peers, peer); | |
241 ngx_http_upstream_rr_peers_unlock(iphp->rrp.peers); | 247 ngx_http_upstream_rr_peers_unlock(iphp->rrp.peers); |
242 | 248 |
243 iphp->rrp.tried[n] |= m; | 249 iphp->rrp.tried[n] |= m; |
244 iphp->hash = hash; | 250 iphp->hash = hash; |
245 | 251 |