]> git.kaiwu.me - nginx.git/commitdiff
Upstream: fixed shared upstreams on win32.
authorRuslan Ermilov <ru@nginx.com>
Mon, 15 Jun 2015 21:43:00 +0000 (00:43 +0300)
committerRuslan Ermilov <ru@nginx.com>
Mon, 15 Jun 2015 21:43:00 +0000 (00:43 +0300)
src/http/modules/ngx_http_upstream_zone_module.c
src/http/ngx_http_upstream_round_robin.h
src/stream/ngx_stream_upstream_round_robin.h
src/stream/ngx_stream_upstream_zone_module.c

index ea7c43b8454f68ed547222cf8e929ce304aa23ce..7169c365e4538630dc950e712d1a082798790a2b 100644 (file)
@@ -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;
 }
index 454515cdd55897491c9861b5947cc6e96e669b5f..f2c573f3f527512dd6372d8bf450b8c77522ed82 100644 (file)
@@ -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;
index 83fd8b5a8b8116fb541fa3d68552c75028dc9a2d..77ee0ab5324d2485d67fc3e42e683827f00d4254 100644 (file)
@@ -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;
index 6025aee7d63f42847459ee52e751b6aab28191ee..87ddc03d5332876b0e856d76fbb0ddcd3eff90a1 100644 (file)
@@ -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;
 }