Mercurial > hg > nginx
comparison src/stream/ngx_stream_upstream_zone_module.c @ 7080:ac120e797d28
Upstream: copy peer data in shared memory.
This, in addition to 1eb753aa8e5e, fixes "upstream zone" on Windows.
author | Ruslan Ermilov <ru@nginx.com> |
---|---|
date | Fri, 04 Aug 2017 17:03:10 +0300 |
parents | 1eb753aa8e5e |
children | 3b1b81e248bc |
comparison
equal
deleted
inserted
replaced
7079:7564a919d333 | 7080:ac120e797d28 |
---|---|
14 void *conf); | 14 void *conf); |
15 static ngx_int_t ngx_stream_upstream_init_zone(ngx_shm_zone_t *shm_zone, | 15 static ngx_int_t ngx_stream_upstream_init_zone(ngx_shm_zone_t *shm_zone, |
16 void *data); | 16 void *data); |
17 static ngx_stream_upstream_rr_peers_t *ngx_stream_upstream_zone_copy_peers( | 17 static ngx_stream_upstream_rr_peers_t *ngx_stream_upstream_zone_copy_peers( |
18 ngx_slab_pool_t *shpool, ngx_stream_upstream_srv_conf_t *uscf); | 18 ngx_slab_pool_t *shpool, ngx_stream_upstream_srv_conf_t *uscf); |
19 static ngx_stream_upstream_rr_peer_t *ngx_stream_upstream_zone_copy_peer( | |
20 ngx_stream_upstream_rr_peers_t *peers, ngx_stream_upstream_rr_peer_t *src); | |
19 | 21 |
20 | 22 |
21 static ngx_command_t ngx_stream_upstream_zone_commands[] = { | 23 static ngx_command_t ngx_stream_upstream_zone_commands[] = { |
22 | 24 |
23 { ngx_string("zone"), | 25 { ngx_string("zone"), |
210 | 212 |
211 peers->shpool = shpool; | 213 peers->shpool = shpool; |
212 | 214 |
213 for (peerp = &peers->peer; *peerp; peerp = &peer->next) { | 215 for (peerp = &peers->peer; *peerp; peerp = &peer->next) { |
214 /* pool is unlocked */ | 216 /* pool is unlocked */ |
215 peer = ngx_slab_calloc_locked(shpool, | 217 peer = ngx_stream_upstream_zone_copy_peer(peers, *peerp); |
216 sizeof(ngx_stream_upstream_rr_peer_t)); | |
217 if (peer == NULL) { | 218 if (peer == NULL) { |
218 return NULL; | 219 return NULL; |
219 } | 220 } |
220 | 221 |
221 ngx_memcpy(peer, *peerp, sizeof(ngx_stream_upstream_rr_peer_t)); | |
222 | |
223 *peerp = peer; | 222 *peerp = peer; |
224 } | 223 } |
225 | 224 |
226 if (peers->next == NULL) { | 225 if (peers->next == NULL) { |
227 goto done; | 226 goto done; |
238 | 237 |
239 backup->shpool = shpool; | 238 backup->shpool = shpool; |
240 | 239 |
241 for (peerp = &backup->peer; *peerp; peerp = &peer->next) { | 240 for (peerp = &backup->peer; *peerp; peerp = &peer->next) { |
242 /* pool is unlocked */ | 241 /* pool is unlocked */ |
243 peer = ngx_slab_calloc_locked(shpool, | 242 peer = ngx_stream_upstream_zone_copy_peer(backup, *peerp); |
244 sizeof(ngx_stream_upstream_rr_peer_t)); | |
245 if (peer == NULL) { | 243 if (peer == NULL) { |
246 return NULL; | 244 return NULL; |
247 } | 245 } |
248 | 246 |
249 ngx_memcpy(peer, *peerp, sizeof(ngx_stream_upstream_rr_peer_t)); | |
250 | |
251 *peerp = peer; | 247 *peerp = peer; |
252 } | 248 } |
253 | 249 |
254 peers->next = backup; | 250 peers->next = backup; |
255 | 251 |
257 | 253 |
258 uscf->peer.data = peers; | 254 uscf->peer.data = peers; |
259 | 255 |
260 return peers; | 256 return peers; |
261 } | 257 } |
258 | |
259 | |
260 static ngx_stream_upstream_rr_peer_t * | |
261 ngx_stream_upstream_zone_copy_peer(ngx_stream_upstream_rr_peers_t *peers, | |
262 ngx_stream_upstream_rr_peer_t *src) | |
263 { | |
264 ngx_slab_pool_t *pool; | |
265 ngx_stream_upstream_rr_peer_t *dst; | |
266 | |
267 pool = peers->shpool; | |
268 | |
269 dst = ngx_slab_calloc_locked(pool, sizeof(ngx_stream_upstream_rr_peer_t)); | |
270 if (dst == NULL) { | |
271 return NULL; | |
272 } | |
273 | |
274 if (src) { | |
275 ngx_memcpy(dst, src, sizeof(ngx_stream_upstream_rr_peer_t)); | |
276 dst->sockaddr = NULL; | |
277 dst->name.data = NULL; | |
278 dst->server.data = NULL; | |
279 } | |
280 | |
281 dst->sockaddr = ngx_slab_calloc_locked(pool, NGX_SOCKADDRLEN); | |
282 if (dst->sockaddr == NULL) { | |
283 goto failed; | |
284 } | |
285 | |
286 dst->name.data = ngx_slab_calloc_locked(pool, NGX_SOCKADDR_STRLEN); | |
287 if (dst->name.data == NULL) { | |
288 goto failed; | |
289 } | |
290 | |
291 if (src) { | |
292 ngx_memcpy(dst->sockaddr, src->sockaddr, src->socklen); | |
293 ngx_memcpy(dst->name.data, src->name.data, src->name.len); | |
294 | |
295 dst->server.data = ngx_slab_alloc_locked(pool, src->server.len); | |
296 if (dst->server.data == NULL) { | |
297 goto failed; | |
298 } | |
299 | |
300 ngx_memcpy(dst->server.data, src->server.data, src->server.len); | |
301 } | |
302 | |
303 return dst; | |
304 | |
305 failed: | |
306 | |
307 if (dst->server.data) { | |
308 ngx_slab_free_locked(pool, dst->server.data); | |
309 } | |
310 | |
311 if (dst->name.data) { | |
312 ngx_slab_free_locked(pool, dst->name.data); | |
313 } | |
314 | |
315 if (dst->sockaddr) { | |
316 ngx_slab_free_locked(pool, dst->sockaddr); | |
317 } | |
318 | |
319 ngx_slab_free_locked(pool, dst); | |
320 | |
321 return NULL; | |
322 } |