Upstream: locked version of ngx_*_upstream_free_round_robin_peer().

This allows optimizing ngx_http_upstream_free_least_time_peer() by
not releasing and re-taking the same lock.
This commit is contained in:
Vladimir Homutov 2016-10-24 12:41:10 +03:00 committed by Sai Krishna Kumar Reddy YADAMAKANTI
parent 35510ddc94
commit 45554176ca
4 changed files with 34 additions and 6 deletions

View file

@ -1007,6 +1007,21 @@ failed:
void
ngx_http_upstream_free_round_robin_peer(ngx_peer_connection_t *pc, void *data,
ngx_uint_t state)
{
#if (NGX_HTTP_UPSTREAM_ZONE)
ngx_http_upstream_rr_peer_data_t *rrp = data;
ngx_http_upstream_rr_peers_rlock(rrp->peers);
ngx_http_upstream_rr_peer_lock(rrp->peers, rrp->current);
#endif
ngx_http_upstream_free_round_robin_peer_locked(pc, data, state);
}
void
ngx_http_upstream_free_round_robin_peer_locked(ngx_peer_connection_t *pc,
void *data, ngx_uint_t state)
{
ngx_http_upstream_rr_peer_data_t *rrp = data;
@ -1020,9 +1035,6 @@ ngx_http_upstream_free_round_robin_peer(ngx_peer_connection_t *pc, void *data,
peer = rrp->current;
ngx_http_upstream_rr_peers_rlock(rrp->peers);
ngx_http_upstream_rr_peer_lock(rrp->peers, peer);
if (rrp->peers->single) {
if (peer->fails) {

View file

@ -248,6 +248,8 @@ ngx_int_t ngx_http_upstream_get_round_robin_peer(ngx_peer_connection_t *pc,
void *data);
void ngx_http_upstream_free_round_robin_peer(ngx_peer_connection_t *pc,
void *data, ngx_uint_t state);
void ngx_http_upstream_free_round_robin_peer_locked(ngx_peer_connection_t *pc,
void *data, ngx_uint_t state);
#if (NGX_HTTP_SSL)
ngx_int_t

View file

@ -791,6 +791,21 @@ ngx_stream_upstream_get_peer(ngx_stream_upstream_rr_peer_data_t *rrp)
void
ngx_stream_upstream_free_round_robin_peer(ngx_peer_connection_t *pc, void *data,
ngx_uint_t state)
{
#if (NGX_STREAM_UPSTREAM_ZONE)
ngx_stream_upstream_rr_peer_data_t *rrp = data;
ngx_stream_upstream_rr_peers_rlock(rrp->peers);
ngx_stream_upstream_rr_peer_lock(rrp->peers, rrp->current);
#endif
ngx_stream_upstream_free_round_robin_peer_locked(pc, data, state);
}
void
ngx_stream_upstream_free_round_robin_peer_locked(ngx_peer_connection_t *pc,
void *data, ngx_uint_t state)
{
ngx_stream_upstream_rr_peer_data_t *rrp = data;
@ -802,9 +817,6 @@ ngx_stream_upstream_free_round_robin_peer(ngx_peer_connection_t *pc, void *data,
peer = rrp->current;
ngx_stream_upstream_rr_peers_rlock(rrp->peers);
ngx_stream_upstream_rr_peer_lock(rrp->peers, peer);
if (rrp->peers->single) {
if (peer->fails) {

View file

@ -227,6 +227,8 @@ ngx_int_t ngx_stream_upstream_get_round_robin_peer(ngx_peer_connection_t *pc,
void *data);
void ngx_stream_upstream_free_round_robin_peer(ngx_peer_connection_t *pc,
void *data, ngx_uint_t state);
void ngx_stream_upstream_free_round_robin_peer_locked(ngx_peer_connection_t *pc,
void *data, ngx_uint_t state);
#endif /* _NGX_STREAM_UPSTREAM_ROUND_ROBIN_H_INCLUDED_ */