Mercurial > hg > nginx-quic
comparison src/stream/ngx_stream_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_stream_upstream_rr_peer_t *peer; | 174 ngx_stream_upstream_rr_peer_t *peer; |
175 | 175 |
176 ngx_log_debug1(NGX_LOG_DEBUG_STREAM, pc->log, 0, | 176 ngx_log_debug1(NGX_LOG_DEBUG_STREAM, pc->log, 0, |
177 "get hash peer, try: %ui", pc->tries); | 177 "get hash peer, try: %ui", pc->tries); |
178 | 178 |
179 ngx_stream_upstream_rr_peers_wlock(hp->rrp.peers); | 179 ngx_stream_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_stream_upstream_rr_peers_unlock(hp->rrp.peers); | 182 ngx_stream_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 } |
225 | 225 |
226 if (hp->rrp.tried[n] & m) { | 226 if (hp->rrp.tried[n] & m) { |
227 goto next; | 227 goto next; |
228 } | 228 } |
229 | 229 |
230 ngx_stream_upstream_rr_peer_lock(hp->rrp.peers, peer); | |
231 | |
230 ngx_log_debug2(NGX_LOG_DEBUG_STREAM, pc->log, 0, | 232 ngx_log_debug2(NGX_LOG_DEBUG_STREAM, pc->log, 0, |
231 "get hash peer, value:%uD, peer:%ui", hp->hash, p); | 233 "get hash peer, value:%uD, peer:%ui", hp->hash, p); |
232 | 234 |
233 if (peer->down) { | 235 if (peer->down) { |
236 ngx_stream_upstream_rr_peer_unlock(hp->rrp.peers, peer); | |
234 goto next; | 237 goto next; |
235 } | 238 } |
236 | 239 |
237 if (peer->max_fails | 240 if (peer->max_fails |
238 && peer->fails >= peer->max_fails | 241 && peer->fails >= peer->max_fails |
239 && now - peer->checked <= peer->fail_timeout) | 242 && now - peer->checked <= peer->fail_timeout) |
240 { | 243 { |
244 ngx_stream_upstream_rr_peer_unlock(hp->rrp.peers, peer); | |
241 goto next; | 245 goto next; |
242 } | 246 } |
243 | 247 |
244 if (peer->max_conns && peer->conns >= peer->max_conns) { | 248 if (peer->max_conns && peer->conns >= peer->max_conns) { |
249 ngx_stream_upstream_rr_peer_unlock(hp->rrp.peers, peer); | |
245 goto next; | 250 goto next; |
246 } | 251 } |
247 | 252 |
248 break; | 253 break; |
249 | 254 |
265 | 270 |
266 if (now - peer->checked > peer->fail_timeout) { | 271 if (now - peer->checked > peer->fail_timeout) { |
267 peer->checked = now; | 272 peer->checked = now; |
268 } | 273 } |
269 | 274 |
275 ngx_stream_upstream_rr_peer_unlock(hp->rrp.peers, peer); | |
270 ngx_stream_upstream_rr_peers_unlock(hp->rrp.peers); | 276 ngx_stream_upstream_rr_peers_unlock(hp->rrp.peers); |
271 | 277 |
272 hp->rrp.tried[n] |= m; | 278 hp->rrp.tried[n] |= m; |
273 | 279 |
274 return NGX_OK; | 280 return NGX_OK; |