mirror of
https://github.com/nginx/nginx.git
synced 2025-06-08 02:02:38 +08:00
Upstreams: locking.
This commit is contained in:
parent
3fc23e2542
commit
b0b7b5a356
@ -176,7 +176,10 @@ ngx_http_upstream_get_hash_peer(ngx_peer_connection_t *pc, void *data)
|
|||||||
ngx_log_debug1(NGX_LOG_DEBUG_HTTP, pc->log, 0,
|
ngx_log_debug1(NGX_LOG_DEBUG_HTTP, pc->log, 0,
|
||||||
"get hash peer, try: %ui", pc->tries);
|
"get hash peer, try: %ui", pc->tries);
|
||||||
|
|
||||||
|
ngx_http_upstream_rr_peers_wlock(hp->rrp.peers);
|
||||||
|
|
||||||
if (hp->tries > 20 || hp->rrp.peers->single) {
|
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);
|
return hp->get_rr_peer(pc, &hp->rrp);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -258,6 +261,7 @@ ngx_http_upstream_get_hash_peer(ngx_peer_connection_t *pc, void *data)
|
|||||||
next:
|
next:
|
||||||
|
|
||||||
if (++hp->tries > 20) {
|
if (++hp->tries > 20) {
|
||||||
|
ngx_http_upstream_rr_peers_unlock(hp->rrp.peers);
|
||||||
return hp->get_rr_peer(pc, &hp->rrp);
|
return hp->get_rr_peer(pc, &hp->rrp);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -274,6 +278,8 @@ ngx_http_upstream_get_hash_peer(ngx_peer_connection_t *pc, void *data)
|
|||||||
peer->checked = now;
|
peer->checked = now;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ngx_http_upstream_rr_peers_unlock(hp->rrp.peers);
|
||||||
|
|
||||||
hp->rrp.tried[n] |= m;
|
hp->rrp.tried[n] |= m;
|
||||||
|
|
||||||
return NGX_OK;
|
return NGX_OK;
|
||||||
@ -465,8 +471,13 @@ ngx_http_upstream_init_chash_peer(ngx_http_request_t *r,
|
|||||||
hcf = ngx_http_conf_upstream_srv_conf(us, ngx_http_upstream_hash_module);
|
hcf = ngx_http_conf_upstream_srv_conf(us, ngx_http_upstream_hash_module);
|
||||||
|
|
||||||
hash = ngx_crc32_long(hp->key.data, hp->key.len);
|
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);
|
hp->hash = ngx_http_upstream_find_chash_point(hcf->points, hash);
|
||||||
|
|
||||||
|
ngx_http_upstream_rr_peers_unlock(hp->rrp.peers);
|
||||||
|
|
||||||
return NGX_OK;
|
return NGX_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -489,6 +500,8 @@ ngx_http_upstream_get_chash_peer(ngx_peer_connection_t *pc, void *data)
|
|||||||
ngx_log_debug1(NGX_LOG_DEBUG_HTTP, pc->log, 0,
|
ngx_log_debug1(NGX_LOG_DEBUG_HTTP, pc->log, 0,
|
||||||
"get consistent hash peer, try: %ui", pc->tries);
|
"get consistent hash peer, try: %ui", pc->tries);
|
||||||
|
|
||||||
|
ngx_http_upstream_rr_peers_wlock(hp->rrp.peers);
|
||||||
|
|
||||||
pc->cached = 0;
|
pc->cached = 0;
|
||||||
pc->connection = NULL;
|
pc->connection = NULL;
|
||||||
|
|
||||||
@ -561,6 +574,7 @@ ngx_http_upstream_get_chash_peer(ngx_peer_connection_t *pc, void *data)
|
|||||||
hp->tries++;
|
hp->tries++;
|
||||||
|
|
||||||
if (hp->tries >= points->number) {
|
if (hp->tries >= points->number) {
|
||||||
|
ngx_http_upstream_rr_peers_unlock(hp->rrp.peers);
|
||||||
return NGX_BUSY;
|
return NGX_BUSY;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -579,6 +593,8 @@ found:
|
|||||||
best->checked = now;
|
best->checked = now;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ngx_http_upstream_rr_peers_unlock(hp->rrp.peers);
|
||||||
|
|
||||||
n = best_i / (8 * sizeof(uintptr_t));
|
n = best_i / (8 * sizeof(uintptr_t));
|
||||||
m = (uintptr_t) 1 << best_i % (8 * sizeof(uintptr_t));
|
m = (uintptr_t) 1 << best_i % (8 * sizeof(uintptr_t));
|
||||||
|
|
||||||
|
@ -161,7 +161,10 @@ ngx_http_upstream_get_ip_hash_peer(ngx_peer_connection_t *pc, void *data)
|
|||||||
|
|
||||||
/* TODO: cached */
|
/* TODO: cached */
|
||||||
|
|
||||||
|
ngx_http_upstream_rr_peers_wlock(iphp->rrp.peers);
|
||||||
|
|
||||||
if (iphp->tries > 20 || iphp->rrp.peers->single) {
|
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);
|
return iphp->get_rr_peer(pc, &iphp->rrp);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -212,8 +215,6 @@ ngx_http_upstream_get_ip_hash_peer(ngx_peer_connection_t *pc, void *data)
|
|||||||
ngx_log_debug2(NGX_LOG_DEBUG_HTTP, pc->log, 0,
|
ngx_log_debug2(NGX_LOG_DEBUG_HTTP, pc->log, 0,
|
||||||
"get ip hash peer, hash: %ui %04XA", p, m);
|
"get ip hash peer, hash: %ui %04XA", p, m);
|
||||||
|
|
||||||
/* ngx_lock_mutex(iphp->rrp.peers->mutex); */
|
|
||||||
|
|
||||||
if (peer->down) {
|
if (peer->down) {
|
||||||
goto next_try;
|
goto next_try;
|
||||||
}
|
}
|
||||||
@ -230,14 +231,12 @@ ngx_http_upstream_get_ip_hash_peer(ngx_peer_connection_t *pc, void *data)
|
|||||||
next_try:
|
next_try:
|
||||||
|
|
||||||
iphp->rrp.tried[n] |= m;
|
iphp->rrp.tried[n] |= m;
|
||||||
|
|
||||||
/* ngx_unlock_mutex(iphp->rrp.peers->mutex); */
|
|
||||||
|
|
||||||
pc->tries--;
|
pc->tries--;
|
||||||
|
|
||||||
next:
|
next:
|
||||||
|
|
||||||
if (++iphp->tries > 20) {
|
if (++iphp->tries > 20) {
|
||||||
|
ngx_http_upstream_rr_peers_unlock(iphp->rrp.peers);
|
||||||
return iphp->get_rr_peer(pc, &iphp->rrp);
|
return iphp->get_rr_peer(pc, &iphp->rrp);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -254,7 +253,7 @@ ngx_http_upstream_get_ip_hash_peer(ngx_peer_connection_t *pc, void *data)
|
|||||||
peer->checked = now;
|
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->rrp.tried[n] |= m;
|
||||||
iphp->hash = hash;
|
iphp->hash = hash;
|
||||||
|
@ -122,6 +122,8 @@ ngx_http_upstream_get_least_conn_peer(ngx_peer_connection_t *pc, void *data)
|
|||||||
|
|
||||||
peers = rrp->peers;
|
peers = rrp->peers;
|
||||||
|
|
||||||
|
ngx_http_upstream_rr_peers_wlock(peers);
|
||||||
|
|
||||||
best = NULL;
|
best = NULL;
|
||||||
total = 0;
|
total = 0;
|
||||||
|
|
||||||
@ -241,6 +243,8 @@ ngx_http_upstream_get_least_conn_peer(ngx_peer_connection_t *pc, void *data)
|
|||||||
|
|
||||||
rrp->tried[n] |= m;
|
rrp->tried[n] |= m;
|
||||||
|
|
||||||
|
ngx_http_upstream_rr_peers_unlock(peers);
|
||||||
|
|
||||||
return NGX_OK;
|
return NGX_OK;
|
||||||
|
|
||||||
failed:
|
failed:
|
||||||
@ -258,11 +262,15 @@ failed:
|
|||||||
rrp->tried[i] = 0;
|
rrp->tried[i] = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ngx_http_upstream_rr_peers_unlock(peers);
|
||||||
|
|
||||||
rc = ngx_http_upstream_get_least_conn_peer(pc, rrp);
|
rc = ngx_http_upstream_get_least_conn_peer(pc, rrp);
|
||||||
|
|
||||||
if (rc != NGX_BUSY) {
|
if (rc != NGX_BUSY) {
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ngx_http_upstream_rr_peers_wlock(peers);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* all peers failed, mark them as live for quick recovery */
|
/* all peers failed, mark them as live for quick recovery */
|
||||||
@ -271,6 +279,8 @@ failed:
|
|||||||
peer->fails = 0;
|
peer->fails = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ngx_http_upstream_rr_peers_unlock(peers);
|
||||||
|
|
||||||
pc->name = peers->name;
|
pc->name = peers->name;
|
||||||
|
|
||||||
return NGX_BUSY;
|
return NGX_BUSY;
|
||||||
|
@ -432,8 +432,7 @@ ngx_http_upstream_get_round_robin_peer(ngx_peer_connection_t *pc, void *data)
|
|||||||
pc->connection = NULL;
|
pc->connection = NULL;
|
||||||
|
|
||||||
peers = rrp->peers;
|
peers = rrp->peers;
|
||||||
|
ngx_http_upstream_rr_peers_wlock(peers);
|
||||||
/* ngx_lock_mutex(peers->mutex); */
|
|
||||||
|
|
||||||
if (peers->single) {
|
if (peers->single) {
|
||||||
peer = peers->peer;
|
peer = peers->peer;
|
||||||
@ -465,7 +464,7 @@ ngx_http_upstream_get_round_robin_peer(ngx_peer_connection_t *pc, void *data)
|
|||||||
|
|
||||||
peer->conns++;
|
peer->conns++;
|
||||||
|
|
||||||
/* ngx_unlock_mutex(peers->mutex); */
|
ngx_http_upstream_rr_peers_unlock(peers);
|
||||||
|
|
||||||
return NGX_OK;
|
return NGX_OK;
|
||||||
|
|
||||||
@ -473,8 +472,6 @@ failed:
|
|||||||
|
|
||||||
if (peers->next) {
|
if (peers->next) {
|
||||||
|
|
||||||
/* ngx_unlock_mutex(peers->mutex); */
|
|
||||||
|
|
||||||
ngx_log_debug0(NGX_LOG_DEBUG_HTTP, pc->log, 0, "backup servers");
|
ngx_log_debug0(NGX_LOG_DEBUG_HTTP, pc->log, 0, "backup servers");
|
||||||
|
|
||||||
rrp->peers = peers->next;
|
rrp->peers = peers->next;
|
||||||
@ -486,13 +483,15 @@ failed:
|
|||||||
rrp->tried[i] = 0;
|
rrp->tried[i] = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ngx_http_upstream_rr_peers_unlock(peers);
|
||||||
|
|
||||||
rc = ngx_http_upstream_get_round_robin_peer(pc, rrp);
|
rc = ngx_http_upstream_get_round_robin_peer(pc, rrp);
|
||||||
|
|
||||||
if (rc != NGX_BUSY) {
|
if (rc != NGX_BUSY) {
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ngx_lock_mutex(peers->mutex); */
|
ngx_http_upstream_rr_peers_wlock(peers);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* all peers failed, mark them as live for quick recovery */
|
/* all peers failed, mark them as live for quick recovery */
|
||||||
@ -501,7 +500,7 @@ failed:
|
|||||||
peer->fails = 0;
|
peer->fails = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ngx_unlock_mutex(peers->mutex); */
|
ngx_http_upstream_rr_peers_unlock(peers);
|
||||||
|
|
||||||
pc->name = peers->name;
|
pc->name = peers->name;
|
||||||
|
|
||||||
@ -608,11 +607,12 @@ ngx_http_upstream_free_round_robin_peer(ngx_peer_connection_t *pc, void *data,
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ngx_http_upstream_rr_peers_rlock(rrp->peers);
|
||||||
|
ngx_http_upstream_rr_peer_lock(rrp->peers, peer);
|
||||||
|
|
||||||
if (state & NGX_PEER_FAILED) {
|
if (state & NGX_PEER_FAILED) {
|
||||||
now = ngx_time();
|
now = ngx_time();
|
||||||
|
|
||||||
/* ngx_lock_mutex(rrp->peers->mutex); */
|
|
||||||
|
|
||||||
peer->fails++;
|
peer->fails++;
|
||||||
peer->accessed = now;
|
peer->accessed = now;
|
||||||
peer->checked = now;
|
peer->checked = now;
|
||||||
@ -629,8 +629,6 @@ ngx_http_upstream_free_round_robin_peer(ngx_peer_connection_t *pc, void *data,
|
|||||||
peer->effective_weight = 0;
|
peer->effective_weight = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ngx_unlock_mutex(rrp->peers->mutex); */
|
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
/* mark peer live if check passed */
|
/* mark peer live if check passed */
|
||||||
@ -642,11 +640,12 @@ ngx_http_upstream_free_round_robin_peer(ngx_peer_connection_t *pc, void *data,
|
|||||||
|
|
||||||
peer->conns--;
|
peer->conns--;
|
||||||
|
|
||||||
|
ngx_http_upstream_rr_peer_unlock(rrp->peers, peer);
|
||||||
|
ngx_http_upstream_rr_peers_unlock(rrp->peers);
|
||||||
|
|
||||||
if (pc->tries) {
|
if (pc->tries) {
|
||||||
pc->tries--;
|
pc->tries--;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ngx_unlock_mutex(rrp->peers->mutex); */
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -664,9 +663,6 @@ ngx_http_upstream_set_round_robin_peer_session(ngx_peer_connection_t *pc,
|
|||||||
|
|
||||||
peer = rrp->current;
|
peer = rrp->current;
|
||||||
|
|
||||||
/* TODO: threads only mutex */
|
|
||||||
/* ngx_lock_mutex(rrp->peers->mutex); */
|
|
||||||
|
|
||||||
ssl_session = peer->ssl_session;
|
ssl_session = peer->ssl_session;
|
||||||
|
|
||||||
rc = ngx_ssl_set_session(pc->connection, ssl_session);
|
rc = ngx_ssl_set_session(pc->connection, ssl_session);
|
||||||
@ -674,8 +670,6 @@ ngx_http_upstream_set_round_robin_peer_session(ngx_peer_connection_t *pc,
|
|||||||
ngx_log_debug1(NGX_LOG_DEBUG_HTTP, pc->log, 0,
|
ngx_log_debug1(NGX_LOG_DEBUG_HTTP, pc->log, 0,
|
||||||
"set session: %p", ssl_session);
|
"set session: %p", ssl_session);
|
||||||
|
|
||||||
/* ngx_unlock_mutex(rrp->peers->mutex); */
|
|
||||||
|
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -700,14 +694,9 @@ ngx_http_upstream_save_round_robin_peer_session(ngx_peer_connection_t *pc,
|
|||||||
|
|
||||||
peer = rrp->current;
|
peer = rrp->current;
|
||||||
|
|
||||||
/* TODO: threads only mutex */
|
|
||||||
/* ngx_lock_mutex(rrp->peers->mutex); */
|
|
||||||
|
|
||||||
old_ssl_session = peer->ssl_session;
|
old_ssl_session = peer->ssl_session;
|
||||||
peer->ssl_session = ssl_session;
|
peer->ssl_session = ssl_session;
|
||||||
|
|
||||||
/* ngx_unlock_mutex(rrp->peers->mutex); */
|
|
||||||
|
|
||||||
if (old_ssl_session) {
|
if (old_ssl_session) {
|
||||||
|
|
||||||
ngx_log_debug1(NGX_LOG_DEBUG_HTTP, pc->log, 0,
|
ngx_log_debug1(NGX_LOG_DEBUG_HTTP, pc->log, 0,
|
||||||
|
@ -63,6 +63,13 @@ struct ngx_http_upstream_rr_peers_s {
|
|||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
#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 {
|
typedef struct {
|
||||||
ngx_http_upstream_rr_peers_t *peers;
|
ngx_http_upstream_rr_peers_t *peers;
|
||||||
ngx_http_upstream_rr_peer_t *current;
|
ngx_http_upstream_rr_peer_t *current;
|
||||||
|
Loading…
Reference in New Issue
Block a user