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