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 }