comparison src/http/modules/ngx_http_upstream_zone_module.c @ 6198:311d232ad803

Upstream: fixed shared upstreams on win32.
author Ruslan Ermilov <ru@nginx.com>
date Tue, 16 Jun 2015 00:43:00 +0300
parents caa103acf180
children 341e4303d25b
comparison
equal deleted inserted replaced
6197:0dcef374b8bb 6198:311d232ad803
12 12
13 static char *ngx_http_upstream_zone(ngx_conf_t *cf, ngx_command_t *cmd, 13 static char *ngx_http_upstream_zone(ngx_conf_t *cf, ngx_command_t *cmd,
14 void *conf); 14 void *conf);
15 static ngx_int_t ngx_http_upstream_init_zone(ngx_shm_zone_t *shm_zone, 15 static ngx_int_t ngx_http_upstream_init_zone(ngx_shm_zone_t *shm_zone,
16 void *data); 16 void *data);
17 static ngx_int_t ngx_http_upstream_zone_copy_peers(ngx_slab_pool_t *shpool, 17 static ngx_http_upstream_rr_peers_t *ngx_http_upstream_zone_copy_peers(
18 ngx_http_upstream_srv_conf_t *uscf); 18 ngx_slab_pool_t *shpool, ngx_http_upstream_srv_conf_t *uscf);
19 19
20 20
21 static ngx_command_t ngx_http_upstream_zone_commands[] = { 21 static ngx_command_t ngx_http_upstream_zone_commands[] = {
22 22
23 { ngx_string("zone"), 23 { ngx_string("zone"),
119 ngx_http_upstream_init_zone(ngx_shm_zone_t *shm_zone, void *data) 119 ngx_http_upstream_init_zone(ngx_shm_zone_t *shm_zone, void *data)
120 { 120 {
121 size_t len; 121 size_t len;
122 ngx_uint_t i; 122 ngx_uint_t i;
123 ngx_slab_pool_t *shpool; 123 ngx_slab_pool_t *shpool;
124 ngx_http_upstream_rr_peers_t *peers, **peersp;
124 ngx_http_upstream_srv_conf_t *uscf, **uscfp; 125 ngx_http_upstream_srv_conf_t *uscf, **uscfp;
125 ngx_http_upstream_main_conf_t *umcf; 126 ngx_http_upstream_main_conf_t *umcf;
126 127
127 shpool = (ngx_slab_pool_t *) shm_zone->shm.addr; 128 shpool = (ngx_slab_pool_t *) shm_zone->shm.addr;
129 umcf = shm_zone->data;
130 uscfp = umcf->upstreams.elts;
128 131
129 if (shm_zone->shm.exists) { 132 if (shm_zone->shm.exists) {
130 return NGX_ERROR; 133 peers = shpool->data;
134
135 for (i = 0; i < umcf->upstreams.nelts; i++) {
136 uscf = uscfp[i];
137
138 if (uscf->shm_zone != shm_zone) {
139 continue;
140 }
141
142 uscf->peer.data = peers;
143 peers = peers->zone_next;
144 }
145
146 return NGX_OK;
131 } 147 }
132 148
133 len = sizeof(" in upstream zone \"\"") + shm_zone->shm.name.len; 149 len = sizeof(" in upstream zone \"\"") + shm_zone->shm.name.len;
134 150
135 shpool->log_ctx = ngx_slab_alloc(shpool, len); 151 shpool->log_ctx = ngx_slab_alloc(shpool, len);
141 &shm_zone->shm.name); 157 &shm_zone->shm.name);
142 158
143 159
144 /* copy peers to shared memory */ 160 /* copy peers to shared memory */
145 161
146 umcf = shm_zone->data; 162 peersp = (ngx_http_upstream_rr_peers_t **) &shpool->data;
147 uscfp = umcf->upstreams.elts;
148 163
149 for (i = 0; i < umcf->upstreams.nelts; i++) { 164 for (i = 0; i < umcf->upstreams.nelts; i++) {
150 uscf = uscfp[i]; 165 uscf = uscfp[i];
151 166
152 if (uscf->shm_zone != shm_zone) { 167 if (uscf->shm_zone != shm_zone) {
153 continue; 168 continue;
154 } 169 }
155 170
156 if (ngx_http_upstream_zone_copy_peers(shpool, uscf) != NGX_OK) { 171 peers = ngx_http_upstream_zone_copy_peers(shpool, uscf);
172 if (peers == NULL) {
157 return NGX_ERROR; 173 return NGX_ERROR;
158 } 174 }
175
176 *peersp = peers;
177 peersp = &peers->zone_next;
159 } 178 }
160 179
161 return NGX_OK; 180 return NGX_OK;
162 } 181 }
163 182
164 183
165 static ngx_int_t 184 static ngx_http_upstream_rr_peers_t *
166 ngx_http_upstream_zone_copy_peers(ngx_slab_pool_t *shpool, 185 ngx_http_upstream_zone_copy_peers(ngx_slab_pool_t *shpool,
167 ngx_http_upstream_srv_conf_t *uscf) 186 ngx_http_upstream_srv_conf_t *uscf)
168 { 187 {
169 ngx_http_upstream_rr_peer_t *peer, **peerp; 188 ngx_http_upstream_rr_peer_t *peer, **peerp;
170 ngx_http_upstream_rr_peers_t *peers, *backup; 189 ngx_http_upstream_rr_peers_t *peers, *backup;
171 190
172 peers = ngx_slab_alloc(shpool, sizeof(ngx_http_upstream_rr_peers_t)); 191 peers = ngx_slab_alloc(shpool, sizeof(ngx_http_upstream_rr_peers_t));
173 if (peers == NULL) { 192 if (peers == NULL) {
174 return NGX_ERROR; 193 return NULL;
175 } 194 }
176 195
177 ngx_memcpy(peers, uscf->peer.data, sizeof(ngx_http_upstream_rr_peers_t)); 196 ngx_memcpy(peers, uscf->peer.data, sizeof(ngx_http_upstream_rr_peers_t));
178 197
179 peers->shpool = shpool; 198 peers->shpool = shpool;
181 for (peerp = &peers->peer; *peerp; peerp = &peer->next) { 200 for (peerp = &peers->peer; *peerp; peerp = &peer->next) {
182 /* pool is unlocked */ 201 /* pool is unlocked */
183 peer = ngx_slab_calloc_locked(shpool, 202 peer = ngx_slab_calloc_locked(shpool,
184 sizeof(ngx_http_upstream_rr_peer_t)); 203 sizeof(ngx_http_upstream_rr_peer_t));
185 if (peer == NULL) { 204 if (peer == NULL) {
186 return NGX_ERROR; 205 return NULL;
187 } 206 }
188 207
189 ngx_memcpy(peer, *peerp, sizeof(ngx_http_upstream_rr_peer_t)); 208 ngx_memcpy(peer, *peerp, sizeof(ngx_http_upstream_rr_peer_t));
190 209
191 *peerp = peer; 210 *peerp = peer;
195 goto done; 214 goto done;
196 } 215 }
197 216
198 backup = ngx_slab_alloc(shpool, sizeof(ngx_http_upstream_rr_peers_t)); 217 backup = ngx_slab_alloc(shpool, sizeof(ngx_http_upstream_rr_peers_t));
199 if (backup == NULL) { 218 if (backup == NULL) {
200 return NGX_ERROR; 219 return NULL;
201 } 220 }
202 221
203 ngx_memcpy(backup, peers->next, sizeof(ngx_http_upstream_rr_peers_t)); 222 ngx_memcpy(backup, peers->next, sizeof(ngx_http_upstream_rr_peers_t));
204 223
205 backup->shpool = shpool; 224 backup->shpool = shpool;
207 for (peerp = &backup->peer; *peerp; peerp = &peer->next) { 226 for (peerp = &backup->peer; *peerp; peerp = &peer->next) {
208 /* pool is unlocked */ 227 /* pool is unlocked */
209 peer = ngx_slab_calloc_locked(shpool, 228 peer = ngx_slab_calloc_locked(shpool,
210 sizeof(ngx_http_upstream_rr_peer_t)); 229 sizeof(ngx_http_upstream_rr_peer_t));
211 if (peer == NULL) { 230 if (peer == NULL) {
212 return NGX_ERROR; 231 return NULL;
213 } 232 }
214 233
215 ngx_memcpy(peer, *peerp, sizeof(ngx_http_upstream_rr_peer_t)); 234 ngx_memcpy(peer, *peerp, sizeof(ngx_http_upstream_rr_peer_t));
216 235
217 *peerp = peer; 236 *peerp = peer;
221 240
222 done: 241 done:
223 242
224 uscf->peer.data = peers; 243 uscf->peer.data = peers;
225 244
226 return NGX_OK; 245 return peers;
227 } 246 }