ngx_log_debug1(NGX_LOG_DEBUG_HTTP, pc->log, 0,
"get hash peer, try: %ui", pc->tries);
+ ngx_http_upstream_rr_peers_wlock(hp->rrp.peers);
+
if (hp->tries > 20 || hp->rrp.peers->single) {
+ ngx_http_upstream_rr_peers_unlock(hp->rrp.peers);
return hp->get_rr_peer(pc, &hp->rrp);
}
next:
if (++hp->tries > 20) {
+ ngx_http_upstream_rr_peers_unlock(hp->rrp.peers);
return hp->get_rr_peer(pc, &hp->rrp);
}
}
peer->checked = now;
}
+ ngx_http_upstream_rr_peers_unlock(hp->rrp.peers);
+
hp->rrp.tried[n] |= m;
return NGX_OK;
hcf = ngx_http_conf_upstream_srv_conf(us, ngx_http_upstream_hash_module);
hash = ngx_crc32_long(hp->key.data, hp->key.len);
+
+ ngx_http_upstream_rr_peers_rlock(hp->rrp.peers);
+
hp->hash = ngx_http_upstream_find_chash_point(hcf->points, hash);
+ ngx_http_upstream_rr_peers_unlock(hp->rrp.peers);
+
return NGX_OK;
}
ngx_log_debug1(NGX_LOG_DEBUG_HTTP, pc->log, 0,
"get consistent hash peer, try: %ui", pc->tries);
+ ngx_http_upstream_rr_peers_wlock(hp->rrp.peers);
+
pc->cached = 0;
pc->connection = NULL;
hp->tries++;
if (hp->tries >= points->number) {
+ ngx_http_upstream_rr_peers_unlock(hp->rrp.peers);
return NGX_BUSY;
}
}
best->checked = now;
}
+ ngx_http_upstream_rr_peers_unlock(hp->rrp.peers);
+
n = best_i / (8 * sizeof(uintptr_t));
m = (uintptr_t) 1 << best_i % (8 * sizeof(uintptr_t));
/* TODO: cached */
+ ngx_http_upstream_rr_peers_wlock(iphp->rrp.peers);
+
if (iphp->tries > 20 || iphp->rrp.peers->single) {
+ ngx_http_upstream_rr_peers_unlock(iphp->rrp.peers);
return iphp->get_rr_peer(pc, &iphp->rrp);
}
ngx_log_debug2(NGX_LOG_DEBUG_HTTP, pc->log, 0,
"get ip hash peer, hash: %ui %04XA", p, m);
- /* ngx_lock_mutex(iphp->rrp.peers->mutex); */
-
if (peer->down) {
goto next_try;
}
next_try:
iphp->rrp.tried[n] |= m;
-
- /* ngx_unlock_mutex(iphp->rrp.peers->mutex); */
-
pc->tries--;
next:
if (++iphp->tries > 20) {
+ ngx_http_upstream_rr_peers_unlock(iphp->rrp.peers);
return iphp->get_rr_peer(pc, &iphp->rrp);
}
}
peer->checked = now;
}
- /* ngx_unlock_mutex(iphp->rrp.peers->mutex); */
+ ngx_http_upstream_rr_peers_unlock(iphp->rrp.peers);
iphp->rrp.tried[n] |= m;
iphp->hash = hash;
peers = rrp->peers;
+ ngx_http_upstream_rr_peers_wlock(peers);
+
best = NULL;
total = 0;
rrp->tried[n] |= m;
+ ngx_http_upstream_rr_peers_unlock(peers);
+
return NGX_OK;
failed:
rrp->tried[i] = 0;
}
+ ngx_http_upstream_rr_peers_unlock(peers);
+
rc = ngx_http_upstream_get_least_conn_peer(pc, rrp);
if (rc != NGX_BUSY) {
return rc;
}
+
+ ngx_http_upstream_rr_peers_wlock(peers);
}
/* all peers failed, mark them as live for quick recovery */
peer->fails = 0;
}
+ ngx_http_upstream_rr_peers_unlock(peers);
+
pc->name = peers->name;
return NGX_BUSY;
pc->connection = NULL;
peers = rrp->peers;
-
- /* ngx_lock_mutex(peers->mutex); */
+ ngx_http_upstream_rr_peers_wlock(peers);
if (peers->single) {
peer = peers->peer;
peer->conns++;
- /* ngx_unlock_mutex(peers->mutex); */
+ ngx_http_upstream_rr_peers_unlock(peers);
return NGX_OK;
if (peers->next) {
- /* ngx_unlock_mutex(peers->mutex); */
-
ngx_log_debug0(NGX_LOG_DEBUG_HTTP, pc->log, 0, "backup servers");
rrp->peers = peers->next;
rrp->tried[i] = 0;
}
+ ngx_http_upstream_rr_peers_unlock(peers);
+
rc = ngx_http_upstream_get_round_robin_peer(pc, rrp);
if (rc != NGX_BUSY) {
return rc;
}
- /* ngx_lock_mutex(peers->mutex); */
+ ngx_http_upstream_rr_peers_wlock(peers);
}
/* all peers failed, mark them as live for quick recovery */
peer->fails = 0;
}
- /* ngx_unlock_mutex(peers->mutex); */
+ ngx_http_upstream_rr_peers_unlock(peers);
pc->name = peers->name;
return;
}
+ ngx_http_upstream_rr_peers_rlock(rrp->peers);
+ ngx_http_upstream_rr_peer_lock(rrp->peers, peer);
+
if (state & NGX_PEER_FAILED) {
now = ngx_time();
- /* ngx_lock_mutex(rrp->peers->mutex); */
-
peer->fails++;
peer->accessed = now;
peer->checked = now;
peer->effective_weight = 0;
}
- /* ngx_unlock_mutex(rrp->peers->mutex); */
-
} else {
/* mark peer live if check passed */
peer->conns--;
+ ngx_http_upstream_rr_peer_unlock(rrp->peers, peer);
+ ngx_http_upstream_rr_peers_unlock(rrp->peers);
+
if (pc->tries) {
pc->tries--;
}
-
- /* ngx_unlock_mutex(rrp->peers->mutex); */
}
peer = rrp->current;
- /* TODO: threads only mutex */
- /* ngx_lock_mutex(rrp->peers->mutex); */
-
ssl_session = peer->ssl_session;
rc = ngx_ssl_set_session(pc->connection, ssl_session);
ngx_log_debug1(NGX_LOG_DEBUG_HTTP, pc->log, 0,
"set session: %p", ssl_session);
- /* ngx_unlock_mutex(rrp->peers->mutex); */
-
return rc;
}
peer = rrp->current;
- /* TODO: threads only mutex */
- /* ngx_lock_mutex(rrp->peers->mutex); */
-
old_ssl_session = peer->ssl_session;
peer->ssl_session = ssl_session;
- /* ngx_unlock_mutex(rrp->peers->mutex); */
-
if (old_ssl_session) {
ngx_log_debug1(NGX_LOG_DEBUG_HTTP, pc->log, 0,
};
+#define ngx_http_upstream_rr_peers_rlock(peers)
+#define ngx_http_upstream_rr_peers_wlock(peers)
+#define ngx_http_upstream_rr_peers_unlock(peers)
+#define ngx_http_upstream_rr_peer_lock(peers, peer)
+#define ngx_http_upstream_rr_peer_unlock(peers, peer)
+
+
typedef struct {
ngx_http_upstream_rr_peers_t *peers;
ngx_http_upstream_rr_peer_t *current;