Mercurial > hg > nginx
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 } |