]> git.kaiwu.me - nginx.git/commitdiff
Upstream: locked version of ngx_*_upstream_free_round_robin_peer().
authorVladimir Homutov <vl@nginx.com>
Mon, 24 Oct 2016 09:41:10 +0000 (12:41 +0300)
committerSai Krishna Kumar Reddy YADAMAKANTI <46914419+saikrishnakumarreddy@users.noreply.github.com>
Mon, 4 May 2026 15:49:40 +0000 (21:19 +0530)
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
src/http/ngx_http_upstream_round_robin.h
src/stream/ngx_stream_upstream_round_robin.c
src/stream/ngx_stream_upstream_round_robin.h

index 41228176726ce638f70b8c5fe75bb34e41d4e436..7b8c07414118dd950ec50d0d0871e1f0717ae0ca 100644 (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) {
index 95c7ae19060a19d7496473ce566edeb813ad9094..76a8889451a5938138311db99c9f7851f0a8fad1 100644 (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
index dd80322c8b577f306a2e6e0afefee091b84a00e5..1901138d3ed6124a51751ae02e172864a4e15480 100644 (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) {
index d36c2ad069717f40a6b69c6cef44c847855a0b44..0a4d4c9d8a685d0b676ee3a23166b34e1fe73bc7 100644 (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_ */