]> git.kaiwu.me - nginx.git/commitdiff
Upstream zone: store peers->name and its data in shared memory.
authorRuslan Ermilov <ru@nginx.com>
Tue, 1 Aug 2017 16:12:10 +0000 (19:12 +0300)
committerRuslan Ermilov <ru@nginx.com>
Tue, 1 Aug 2017 16:12:10 +0000 (19:12 +0300)
The shared objects should generally be allocated from shared memory.
While peers->name and the data it points to allocated from cf->pool
happened to work on UNIX, it broke on Windows.  On UNIX this worked
only because the shared memory zone for upstreams is re-created for
every new configuration.

But on Windows, a worker process does not inherit the address space
of the master process, so the peers->name pointed to data allocated
from cf->pool by the master process, and was invalid.

src/http/modules/ngx_http_upstream_zone_module.c
src/stream/ngx_stream_upstream_zone_module.c

index 7e5bd74764e1c60551d14529ca6589ffd9f8d900..401167bc781bc708ec41e52a3c80eec7ffd0c94c 100644 (file)
@@ -185,6 +185,7 @@ static ngx_http_upstream_rr_peers_t *
 ngx_http_upstream_zone_copy_peers(ngx_slab_pool_t *shpool,
     ngx_http_upstream_srv_conf_t *uscf)
 {
+    ngx_str_t                     *name;
     ngx_http_upstream_rr_peer_t   *peer, **peerp;
     ngx_http_upstream_rr_peers_t  *peers, *backup;
 
@@ -195,6 +196,21 @@ ngx_http_upstream_zone_copy_peers(ngx_slab_pool_t *shpool,
 
     ngx_memcpy(peers, uscf->peer.data, sizeof(ngx_http_upstream_rr_peers_t));
 
+    name = ngx_slab_alloc(shpool, sizeof(ngx_str_t));
+    if (name == NULL) {
+        return NULL;
+    }
+
+    name->data = ngx_slab_alloc(shpool, peers->name->len);
+    if (name->data == NULL) {
+        return NULL;
+    }
+
+    ngx_memcpy(name->data, peers->name->data, peers->name->len);
+    name->len = peers->name->len;
+
+    peers->name = name;
+
     peers->shpool = shpool;
 
     for (peerp = &peers->peer; *peerp; peerp = &peer->next) {
@@ -221,6 +237,8 @@ ngx_http_upstream_zone_copy_peers(ngx_slab_pool_t *shpool,
 
     ngx_memcpy(backup, peers->next, sizeof(ngx_http_upstream_rr_peers_t));
 
+    backup->name = name;
+
     backup->shpool = shpool;
 
     for (peerp = &backup->peer; *peerp; peerp = &peer->next) {
index 07ab88dfa8905ae9e0900a9ba8dd4bdeeba559d4..a02d684dfa39c11ab56d706a4b28510f4f3d3ad4 100644 (file)
@@ -182,6 +182,7 @@ static ngx_stream_upstream_rr_peers_t *
 ngx_stream_upstream_zone_copy_peers(ngx_slab_pool_t *shpool,
     ngx_stream_upstream_srv_conf_t *uscf)
 {
+    ngx_str_t                       *name;
     ngx_stream_upstream_rr_peer_t   *peer, **peerp;
     ngx_stream_upstream_rr_peers_t  *peers, *backup;
 
@@ -192,6 +193,21 @@ ngx_stream_upstream_zone_copy_peers(ngx_slab_pool_t *shpool,
 
     ngx_memcpy(peers, uscf->peer.data, sizeof(ngx_stream_upstream_rr_peers_t));
 
+    name = ngx_slab_alloc(shpool, sizeof(ngx_str_t));
+    if (name == NULL) {
+        return NULL;
+    }
+
+    name->data = ngx_slab_alloc(shpool, peers->name->len);
+    if (name->data == NULL) {
+        return NULL;
+    }
+
+    ngx_memcpy(name->data, peers->name->data, peers->name->len);
+    name->len = peers->name->len;
+
+    peers->name = name;
+
     peers->shpool = shpool;
 
     for (peerp = &peers->peer; *peerp; peerp = &peer->next) {
@@ -218,6 +234,8 @@ ngx_stream_upstream_zone_copy_peers(ngx_slab_pool_t *shpool,
 
     ngx_memcpy(backup, peers->next, sizeof(ngx_stream_upstream_rr_peers_t));
 
+    backup->name = name;
+
     backup->shpool = shpool;
 
     for (peerp = &backup->peer; *peerp; peerp = &peer->next) {