Skip to content

Commit

Permalink
Upstream zone: store peers->name and its data in shared memory.
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
mdocguard committed Aug 1, 2017
1 parent b992f72 commit d846f27
Show file tree
Hide file tree
Showing 2 changed files with 36 additions and 0 deletions.
18 changes: 18 additions & 0 deletions src/http/modules/ngx_http_upstream_zone_module.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand All @@ -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) {
Expand All @@ -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) {
Expand Down
18 changes: 18 additions & 0 deletions src/stream/ngx_stream_upstream_zone_module.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand All @@ -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) {
Expand All @@ -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) {
Expand Down

0 comments on commit d846f27

Please sign in to comment.