mirror of
https://github.com/nginx/nginx.git
synced 2025-06-06 00:42:40 +08:00
Upstream: fixed shared upstreams on win32.
This commit is contained in:
parent
14ff3d4f87
commit
1e94ab0db0
@ -14,8 +14,8 @@ static char *ngx_http_upstream_zone(ngx_conf_t *cf, ngx_command_t *cmd,
|
||||
void *conf);
|
||||
static ngx_int_t ngx_http_upstream_init_zone(ngx_shm_zone_t *shm_zone,
|
||||
void *data);
|
||||
static ngx_int_t ngx_http_upstream_zone_copy_peers(ngx_slab_pool_t *shpool,
|
||||
ngx_http_upstream_srv_conf_t *uscf);
|
||||
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);
|
||||
|
||||
|
||||
static ngx_command_t ngx_http_upstream_zone_commands[] = {
|
||||
@ -121,13 +121,29 @@ ngx_http_upstream_init_zone(ngx_shm_zone_t *shm_zone, void *data)
|
||||
size_t len;
|
||||
ngx_uint_t i;
|
||||
ngx_slab_pool_t *shpool;
|
||||
ngx_http_upstream_rr_peers_t *peers, **peersp;
|
||||
ngx_http_upstream_srv_conf_t *uscf, **uscfp;
|
||||
ngx_http_upstream_main_conf_t *umcf;
|
||||
|
||||
shpool = (ngx_slab_pool_t *) shm_zone->shm.addr;
|
||||
umcf = shm_zone->data;
|
||||
uscfp = umcf->upstreams.elts;
|
||||
|
||||
if (shm_zone->shm.exists) {
|
||||
return NGX_ERROR;
|
||||
peers = shpool->data;
|
||||
|
||||
for (i = 0; i < umcf->upstreams.nelts; i++) {
|
||||
uscf = uscfp[i];
|
||||
|
||||
if (uscf->shm_zone != shm_zone) {
|
||||
continue;
|
||||
}
|
||||
|
||||
uscf->peer.data = peers;
|
||||
peers = peers->zone_next;
|
||||
}
|
||||
|
||||
return NGX_OK;
|
||||
}
|
||||
|
||||
len = sizeof(" in upstream zone \"\"") + shm_zone->shm.name.len;
|
||||
@ -143,8 +159,7 @@ ngx_http_upstream_init_zone(ngx_shm_zone_t *shm_zone, void *data)
|
||||
|
||||
/* copy peers to shared memory */
|
||||
|
||||
umcf = shm_zone->data;
|
||||
uscfp = umcf->upstreams.elts;
|
||||
peersp = (ngx_http_upstream_rr_peers_t **) &shpool->data;
|
||||
|
||||
for (i = 0; i < umcf->upstreams.nelts; i++) {
|
||||
uscf = uscfp[i];
|
||||
@ -153,16 +168,20 @@ ngx_http_upstream_init_zone(ngx_shm_zone_t *shm_zone, void *data)
|
||||
continue;
|
||||
}
|
||||
|
||||
if (ngx_http_upstream_zone_copy_peers(shpool, uscf) != NGX_OK) {
|
||||
peers = ngx_http_upstream_zone_copy_peers(shpool, uscf);
|
||||
if (peers == NULL) {
|
||||
return NGX_ERROR;
|
||||
}
|
||||
|
||||
*peersp = peers;
|
||||
peersp = &peers->zone_next;
|
||||
}
|
||||
|
||||
return NGX_OK;
|
||||
}
|
||||
|
||||
|
||||
static ngx_int_t
|
||||
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)
|
||||
{
|
||||
@ -171,7 +190,7 @@ ngx_http_upstream_zone_copy_peers(ngx_slab_pool_t *shpool,
|
||||
|
||||
peers = ngx_slab_alloc(shpool, sizeof(ngx_http_upstream_rr_peers_t));
|
||||
if (peers == NULL) {
|
||||
return NGX_ERROR;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
ngx_memcpy(peers, uscf->peer.data, sizeof(ngx_http_upstream_rr_peers_t));
|
||||
@ -183,7 +202,7 @@ ngx_http_upstream_zone_copy_peers(ngx_slab_pool_t *shpool,
|
||||
peer = ngx_slab_calloc_locked(shpool,
|
||||
sizeof(ngx_http_upstream_rr_peer_t));
|
||||
if (peer == NULL) {
|
||||
return NGX_ERROR;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
ngx_memcpy(peer, *peerp, sizeof(ngx_http_upstream_rr_peer_t));
|
||||
@ -197,7 +216,7 @@ ngx_http_upstream_zone_copy_peers(ngx_slab_pool_t *shpool,
|
||||
|
||||
backup = ngx_slab_alloc(shpool, sizeof(ngx_http_upstream_rr_peers_t));
|
||||
if (backup == NULL) {
|
||||
return NGX_ERROR;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
ngx_memcpy(backup, peers->next, sizeof(ngx_http_upstream_rr_peers_t));
|
||||
@ -209,7 +228,7 @@ ngx_http_upstream_zone_copy_peers(ngx_slab_pool_t *shpool,
|
||||
peer = ngx_slab_calloc_locked(shpool,
|
||||
sizeof(ngx_http_upstream_rr_peer_t));
|
||||
if (peer == NULL) {
|
||||
return NGX_ERROR;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
ngx_memcpy(peer, *peerp, sizeof(ngx_http_upstream_rr_peer_t));
|
||||
@ -223,5 +242,5 @@ done:
|
||||
|
||||
uscf->peer.data = peers;
|
||||
|
||||
return NGX_OK;
|
||||
return peers;
|
||||
}
|
||||
|
@ -58,6 +58,7 @@ struct ngx_http_upstream_rr_peers_s {
|
||||
#if (NGX_HTTP_UPSTREAM_ZONE)
|
||||
ngx_slab_pool_t *shpool;
|
||||
ngx_atomic_t rwlock;
|
||||
ngx_http_upstream_rr_peers_t *zone_next;
|
||||
#endif
|
||||
|
||||
ngx_uint_t total_weight;
|
||||
|
@ -58,6 +58,7 @@ struct ngx_stream_upstream_rr_peers_s {
|
||||
#if (NGX_STREAM_UPSTREAM_ZONE)
|
||||
ngx_slab_pool_t *shpool;
|
||||
ngx_atomic_t rwlock;
|
||||
ngx_stream_upstream_rr_peers_t *zone_next;
|
||||
#endif
|
||||
|
||||
ngx_uint_t total_weight;
|
||||
|
@ -14,8 +14,8 @@ static char *ngx_stream_upstream_zone(ngx_conf_t *cf, ngx_command_t *cmd,
|
||||
void *conf);
|
||||
static ngx_int_t ngx_stream_upstream_init_zone(ngx_shm_zone_t *shm_zone,
|
||||
void *data);
|
||||
static ngx_int_t ngx_stream_upstream_zone_copy_peers(ngx_slab_pool_t *shpool,
|
||||
ngx_stream_upstream_srv_conf_t *uscf);
|
||||
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);
|
||||
|
||||
|
||||
static ngx_command_t ngx_stream_upstream_zone_commands[] = {
|
||||
@ -117,13 +117,29 @@ ngx_stream_upstream_init_zone(ngx_shm_zone_t *shm_zone, void *data)
|
||||
size_t len;
|
||||
ngx_uint_t i;
|
||||
ngx_slab_pool_t *shpool;
|
||||
ngx_stream_upstream_rr_peers_t *peers, **peersp;
|
||||
ngx_stream_upstream_srv_conf_t *uscf, **uscfp;
|
||||
ngx_stream_upstream_main_conf_t *umcf;
|
||||
|
||||
shpool = (ngx_slab_pool_t *) shm_zone->shm.addr;
|
||||
umcf = shm_zone->data;
|
||||
uscfp = umcf->upstreams.elts;
|
||||
|
||||
if (shm_zone->shm.exists) {
|
||||
return NGX_ERROR;
|
||||
peers = shpool->data;
|
||||
|
||||
for (i = 0; i < umcf->upstreams.nelts; i++) {
|
||||
uscf = uscfp[i];
|
||||
|
||||
if (uscf->shm_zone != shm_zone) {
|
||||
continue;
|
||||
}
|
||||
|
||||
uscf->peer.data = peers;
|
||||
peers = peers->zone_next;
|
||||
}
|
||||
|
||||
return NGX_OK;
|
||||
}
|
||||
|
||||
len = sizeof(" in upstream zone \"\"") + shm_zone->shm.name.len;
|
||||
@ -139,8 +155,7 @@ ngx_stream_upstream_init_zone(ngx_shm_zone_t *shm_zone, void *data)
|
||||
|
||||
/* copy peers to shared memory */
|
||||
|
||||
umcf = shm_zone->data;
|
||||
uscfp = umcf->upstreams.elts;
|
||||
peersp = (ngx_stream_upstream_rr_peers_t **) &shpool->data;
|
||||
|
||||
for (i = 0; i < umcf->upstreams.nelts; i++) {
|
||||
uscf = uscfp[i];
|
||||
@ -149,16 +164,20 @@ ngx_stream_upstream_init_zone(ngx_shm_zone_t *shm_zone, void *data)
|
||||
continue;
|
||||
}
|
||||
|
||||
if (ngx_stream_upstream_zone_copy_peers(shpool, uscf) != NGX_OK) {
|
||||
peers = ngx_stream_upstream_zone_copy_peers(shpool, uscf);
|
||||
if (peers == NULL) {
|
||||
return NGX_ERROR;
|
||||
}
|
||||
|
||||
*peersp = peers;
|
||||
peersp = &peers->zone_next;
|
||||
}
|
||||
|
||||
return NGX_OK;
|
||||
}
|
||||
|
||||
|
||||
static ngx_int_t
|
||||
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)
|
||||
{
|
||||
@ -167,7 +186,7 @@ ngx_stream_upstream_zone_copy_peers(ngx_slab_pool_t *shpool,
|
||||
|
||||
peers = ngx_slab_alloc(shpool, sizeof(ngx_stream_upstream_rr_peers_t));
|
||||
if (peers == NULL) {
|
||||
return NGX_ERROR;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
ngx_memcpy(peers, uscf->peer.data, sizeof(ngx_stream_upstream_rr_peers_t));
|
||||
@ -179,7 +198,7 @@ ngx_stream_upstream_zone_copy_peers(ngx_slab_pool_t *shpool,
|
||||
peer = ngx_slab_calloc_locked(shpool,
|
||||
sizeof(ngx_stream_upstream_rr_peer_t));
|
||||
if (peer == NULL) {
|
||||
return NGX_ERROR;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
ngx_memcpy(peer, *peerp, sizeof(ngx_stream_upstream_rr_peer_t));
|
||||
@ -193,7 +212,7 @@ ngx_stream_upstream_zone_copy_peers(ngx_slab_pool_t *shpool,
|
||||
|
||||
backup = ngx_slab_alloc(shpool, sizeof(ngx_stream_upstream_rr_peers_t));
|
||||
if (backup == NULL) {
|
||||
return NGX_ERROR;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
ngx_memcpy(backup, peers->next, sizeof(ngx_stream_upstream_rr_peers_t));
|
||||
@ -205,7 +224,7 @@ ngx_stream_upstream_zone_copy_peers(ngx_slab_pool_t *shpool,
|
||||
peer = ngx_slab_calloc_locked(shpool,
|
||||
sizeof(ngx_stream_upstream_rr_peer_t));
|
||||
if (peer == NULL) {
|
||||
return NGX_ERROR;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
ngx_memcpy(peer, *peerp, sizeof(ngx_stream_upstream_rr_peer_t));
|
||||
@ -219,5 +238,5 @@ done:
|
||||
|
||||
uscf->peer.data = peers;
|
||||
|
||||
return NGX_OK;
|
||||
return peers;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user