mirror of
https://github.com/nginx/nginx.git
synced 2025-06-09 02:42:48 +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);
|
void *conf);
|
||||||
static ngx_int_t ngx_http_upstream_init_zone(ngx_shm_zone_t *shm_zone,
|
static ngx_int_t ngx_http_upstream_init_zone(ngx_shm_zone_t *shm_zone,
|
||||||
void *data);
|
void *data);
|
||||||
static ngx_int_t ngx_http_upstream_zone_copy_peers(ngx_slab_pool_t *shpool,
|
static ngx_http_upstream_rr_peers_t *ngx_http_upstream_zone_copy_peers(
|
||||||
ngx_http_upstream_srv_conf_t *uscf);
|
ngx_slab_pool_t *shpool, ngx_http_upstream_srv_conf_t *uscf);
|
||||||
|
|
||||||
|
|
||||||
static ngx_command_t ngx_http_upstream_zone_commands[] = {
|
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;
|
size_t len;
|
||||||
ngx_uint_t i;
|
ngx_uint_t i;
|
||||||
ngx_slab_pool_t *shpool;
|
ngx_slab_pool_t *shpool;
|
||||||
|
ngx_http_upstream_rr_peers_t *peers, **peersp;
|
||||||
ngx_http_upstream_srv_conf_t *uscf, **uscfp;
|
ngx_http_upstream_srv_conf_t *uscf, **uscfp;
|
||||||
ngx_http_upstream_main_conf_t *umcf;
|
ngx_http_upstream_main_conf_t *umcf;
|
||||||
|
|
||||||
shpool = (ngx_slab_pool_t *) shm_zone->shm.addr;
|
shpool = (ngx_slab_pool_t *) shm_zone->shm.addr;
|
||||||
|
umcf = shm_zone->data;
|
||||||
|
uscfp = umcf->upstreams.elts;
|
||||||
|
|
||||||
if (shm_zone->shm.exists) {
|
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;
|
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 */
|
/* copy peers to shared memory */
|
||||||
|
|
||||||
umcf = shm_zone->data;
|
peersp = (ngx_http_upstream_rr_peers_t **) &shpool->data;
|
||||||
uscfp = umcf->upstreams.elts;
|
|
||||||
|
|
||||||
for (i = 0; i < umcf->upstreams.nelts; i++) {
|
for (i = 0; i < umcf->upstreams.nelts; i++) {
|
||||||
uscf = uscfp[i];
|
uscf = uscfp[i];
|
||||||
@ -153,16 +168,20 @@ ngx_http_upstream_init_zone(ngx_shm_zone_t *shm_zone, void *data)
|
|||||||
continue;
|
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;
|
return NGX_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
*peersp = peers;
|
||||||
|
peersp = &peers->zone_next;
|
||||||
}
|
}
|
||||||
|
|
||||||
return NGX_OK;
|
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_zone_copy_peers(ngx_slab_pool_t *shpool,
|
||||||
ngx_http_upstream_srv_conf_t *uscf)
|
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));
|
peers = ngx_slab_alloc(shpool, sizeof(ngx_http_upstream_rr_peers_t));
|
||||||
if (peers == NULL) {
|
if (peers == NULL) {
|
||||||
return NGX_ERROR;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
ngx_memcpy(peers, uscf->peer.data, sizeof(ngx_http_upstream_rr_peers_t));
|
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,
|
peer = ngx_slab_calloc_locked(shpool,
|
||||||
sizeof(ngx_http_upstream_rr_peer_t));
|
sizeof(ngx_http_upstream_rr_peer_t));
|
||||||
if (peer == NULL) {
|
if (peer == NULL) {
|
||||||
return NGX_ERROR;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
ngx_memcpy(peer, *peerp, sizeof(ngx_http_upstream_rr_peer_t));
|
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));
|
backup = ngx_slab_alloc(shpool, sizeof(ngx_http_upstream_rr_peers_t));
|
||||||
if (backup == NULL) {
|
if (backup == NULL) {
|
||||||
return NGX_ERROR;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
ngx_memcpy(backup, peers->next, sizeof(ngx_http_upstream_rr_peers_t));
|
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,
|
peer = ngx_slab_calloc_locked(shpool,
|
||||||
sizeof(ngx_http_upstream_rr_peer_t));
|
sizeof(ngx_http_upstream_rr_peer_t));
|
||||||
if (peer == NULL) {
|
if (peer == NULL) {
|
||||||
return NGX_ERROR;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
ngx_memcpy(peer, *peerp, sizeof(ngx_http_upstream_rr_peer_t));
|
ngx_memcpy(peer, *peerp, sizeof(ngx_http_upstream_rr_peer_t));
|
||||||
@ -223,5 +242,5 @@ done:
|
|||||||
|
|
||||||
uscf->peer.data = peers;
|
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)
|
#if (NGX_HTTP_UPSTREAM_ZONE)
|
||||||
ngx_slab_pool_t *shpool;
|
ngx_slab_pool_t *shpool;
|
||||||
ngx_atomic_t rwlock;
|
ngx_atomic_t rwlock;
|
||||||
|
ngx_http_upstream_rr_peers_t *zone_next;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
ngx_uint_t total_weight;
|
ngx_uint_t total_weight;
|
||||||
|
@ -58,6 +58,7 @@ struct ngx_stream_upstream_rr_peers_s {
|
|||||||
#if (NGX_STREAM_UPSTREAM_ZONE)
|
#if (NGX_STREAM_UPSTREAM_ZONE)
|
||||||
ngx_slab_pool_t *shpool;
|
ngx_slab_pool_t *shpool;
|
||||||
ngx_atomic_t rwlock;
|
ngx_atomic_t rwlock;
|
||||||
|
ngx_stream_upstream_rr_peers_t *zone_next;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
ngx_uint_t total_weight;
|
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);
|
void *conf);
|
||||||
static ngx_int_t ngx_stream_upstream_init_zone(ngx_shm_zone_t *shm_zone,
|
static ngx_int_t ngx_stream_upstream_init_zone(ngx_shm_zone_t *shm_zone,
|
||||||
void *data);
|
void *data);
|
||||||
static ngx_int_t ngx_stream_upstream_zone_copy_peers(ngx_slab_pool_t *shpool,
|
static ngx_stream_upstream_rr_peers_t *ngx_stream_upstream_zone_copy_peers(
|
||||||
ngx_stream_upstream_srv_conf_t *uscf);
|
ngx_slab_pool_t *shpool, ngx_stream_upstream_srv_conf_t *uscf);
|
||||||
|
|
||||||
|
|
||||||
static ngx_command_t ngx_stream_upstream_zone_commands[] = {
|
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;
|
size_t len;
|
||||||
ngx_uint_t i;
|
ngx_uint_t i;
|
||||||
ngx_slab_pool_t *shpool;
|
ngx_slab_pool_t *shpool;
|
||||||
|
ngx_stream_upstream_rr_peers_t *peers, **peersp;
|
||||||
ngx_stream_upstream_srv_conf_t *uscf, **uscfp;
|
ngx_stream_upstream_srv_conf_t *uscf, **uscfp;
|
||||||
ngx_stream_upstream_main_conf_t *umcf;
|
ngx_stream_upstream_main_conf_t *umcf;
|
||||||
|
|
||||||
shpool = (ngx_slab_pool_t *) shm_zone->shm.addr;
|
shpool = (ngx_slab_pool_t *) shm_zone->shm.addr;
|
||||||
|
umcf = shm_zone->data;
|
||||||
|
uscfp = umcf->upstreams.elts;
|
||||||
|
|
||||||
if (shm_zone->shm.exists) {
|
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;
|
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 */
|
/* copy peers to shared memory */
|
||||||
|
|
||||||
umcf = shm_zone->data;
|
peersp = (ngx_stream_upstream_rr_peers_t **) &shpool->data;
|
||||||
uscfp = umcf->upstreams.elts;
|
|
||||||
|
|
||||||
for (i = 0; i < umcf->upstreams.nelts; i++) {
|
for (i = 0; i < umcf->upstreams.nelts; i++) {
|
||||||
uscf = uscfp[i];
|
uscf = uscfp[i];
|
||||||
@ -149,16 +164,20 @@ ngx_stream_upstream_init_zone(ngx_shm_zone_t *shm_zone, void *data)
|
|||||||
continue;
|
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;
|
return NGX_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
*peersp = peers;
|
||||||
|
peersp = &peers->zone_next;
|
||||||
}
|
}
|
||||||
|
|
||||||
return NGX_OK;
|
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_zone_copy_peers(ngx_slab_pool_t *shpool,
|
||||||
ngx_stream_upstream_srv_conf_t *uscf)
|
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));
|
peers = ngx_slab_alloc(shpool, sizeof(ngx_stream_upstream_rr_peers_t));
|
||||||
if (peers == NULL) {
|
if (peers == NULL) {
|
||||||
return NGX_ERROR;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
ngx_memcpy(peers, uscf->peer.data, sizeof(ngx_stream_upstream_rr_peers_t));
|
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,
|
peer = ngx_slab_calloc_locked(shpool,
|
||||||
sizeof(ngx_stream_upstream_rr_peer_t));
|
sizeof(ngx_stream_upstream_rr_peer_t));
|
||||||
if (peer == NULL) {
|
if (peer == NULL) {
|
||||||
return NGX_ERROR;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
ngx_memcpy(peer, *peerp, sizeof(ngx_stream_upstream_rr_peer_t));
|
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));
|
backup = ngx_slab_alloc(shpool, sizeof(ngx_stream_upstream_rr_peers_t));
|
||||||
if (backup == NULL) {
|
if (backup == NULL) {
|
||||||
return NGX_ERROR;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
ngx_memcpy(backup, peers->next, sizeof(ngx_stream_upstream_rr_peers_t));
|
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,
|
peer = ngx_slab_calloc_locked(shpool,
|
||||||
sizeof(ngx_stream_upstream_rr_peer_t));
|
sizeof(ngx_stream_upstream_rr_peer_t));
|
||||||
if (peer == NULL) {
|
if (peer == NULL) {
|
||||||
return NGX_ERROR;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
ngx_memcpy(peer, *peerp, sizeof(ngx_stream_upstream_rr_peer_t));
|
ngx_memcpy(peer, *peerp, sizeof(ngx_stream_upstream_rr_peer_t));
|
||||||
@ -219,5 +238,5 @@ done:
|
|||||||
|
|
||||||
uscf->peer.data = peers;
|
uscf->peer.data = peers;
|
||||||
|
|
||||||
return NGX_OK;
|
return peers;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user