From 45554176cafc12e0e234a6511b5b4cd453dc8a31 Mon Sep 17 00:00:00 2001 From: Vladimir Homutov Date: Mon, 24 Oct 2016 12:41:10 +0300 Subject: [PATCH] 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. --- src/http/ngx_http_upstream_round_robin.c | 18 +++++++++++++++--- src/http/ngx_http_upstream_round_robin.h | 2 ++ src/stream/ngx_stream_upstream_round_robin.c | 18 +++++++++++++++--- src/stream/ngx_stream_upstream_round_robin.h | 2 ++ 4 files changed, 34 insertions(+), 6 deletions(-) diff --git a/src/http/ngx_http_upstream_round_robin.c b/src/http/ngx_http_upstream_round_robin.c index 412281767..7b8c07414 100644 --- a/src/http/ngx_http_upstream_round_robin.c +++ b/src/http/ngx_http_upstream_round_robin.c @@ -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) { diff --git a/src/http/ngx_http_upstream_round_robin.h b/src/http/ngx_http_upstream_round_robin.h index 95c7ae190..76a888945 100644 --- a/src/http/ngx_http_upstream_round_robin.h +++ b/src/http/ngx_http_upstream_round_robin.h @@ -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 diff --git a/src/stream/ngx_stream_upstream_round_robin.c b/src/stream/ngx_stream_upstream_round_robin.c index dd80322c8..1901138d3 100644 --- a/src/stream/ngx_stream_upstream_round_robin.c +++ b/src/stream/ngx_stream_upstream_round_robin.c @@ -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) { diff --git a/src/stream/ngx_stream_upstream_round_robin.h b/src/stream/ngx_stream_upstream_round_robin.h index d36c2ad06..0a4d4c9d8 100644 --- a/src/stream/ngx_stream_upstream_round_robin.h +++ b/src/stream/ngx_stream_upstream_round_robin.h @@ -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_ */ -- 2.47.3