annotate src/http/modules/ngx_http_upstream_zone_module.c @ 6986:0cdee26605f3

Cleaned up r->headers_out.headers allocation error handling. If initialization of a header failed for some reason after ngx_list_push(), leaving the header as is can result in uninitialized memory access by the header filter or the log module. The fix is to clear partially initialized headers in case of errors. For the Cache-Control header, the fix is to postpone pushing r->headers_out.cache_control until its value is completed.
author Sergey Kandaurov <pluknet@nginx.com>
date Thu, 20 Apr 2017 18:26:37 +0300
parents 341e4303d25b
children 1eb753aa8e5e
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
6103
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
2 /*
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
3 * Copyright (C) Ruslan Ermilov
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
4 * Copyright (C) Nginx, Inc.
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
5 */
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
6
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
7
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
8 #include <ngx_config.h>
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
9 #include <ngx_core.h>
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
10 #include <ngx_http.h>
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
11
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
12
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
13 static char *ngx_http_upstream_zone(ngx_conf_t *cf, ngx_command_t *cmd,
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
14 void *conf);
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
15 static ngx_int_t ngx_http_upstream_init_zone(ngx_shm_zone_t *shm_zone,
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
16 void *data);
6198
311d232ad803 Upstream: fixed shared upstreams on win32.
Ruslan Ermilov <ru@nginx.com>
parents: 6123
diff changeset
17 static ngx_http_upstream_rr_peers_t *ngx_http_upstream_zone_copy_peers(
311d232ad803 Upstream: fixed shared upstreams on win32.
Ruslan Ermilov <ru@nginx.com>
parents: 6123
diff changeset
18 ngx_slab_pool_t *shpool, ngx_http_upstream_srv_conf_t *uscf);
6103
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
19
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
20
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
21 static ngx_command_t ngx_http_upstream_zone_commands[] = {
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
22
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
23 { ngx_string("zone"),
6123
caa103acf180 Upstream: allow multiple upstreams to use the same shared zone.
Ruslan Ermilov <ru@nginx.com>
parents: 6103
diff changeset
24 NGX_HTTP_UPS_CONF|NGX_CONF_TAKE12,
6103
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
25 ngx_http_upstream_zone,
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
26 0,
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
27 0,
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
28 NULL },
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
29
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
30 ngx_null_command
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
31 };
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
32
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
33
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
34 static ngx_http_module_t ngx_http_upstream_zone_module_ctx = {
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
35 NULL, /* preconfiguration */
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
36 NULL, /* postconfiguration */
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
37
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
38 NULL, /* create main configuration */
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
39 NULL, /* init main configuration */
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
40
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
41 NULL, /* create server configuration */
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
42 NULL, /* merge server configuration */
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
43
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
44 NULL, /* create location configuration */
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
45 NULL /* merge location configuration */
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
46 };
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
47
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
48
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
49 ngx_module_t ngx_http_upstream_zone_module = {
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
50 NGX_MODULE_V1,
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
51 &ngx_http_upstream_zone_module_ctx, /* module context */
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
52 ngx_http_upstream_zone_commands, /* module directives */
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
53 NGX_HTTP_MODULE, /* module type */
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
54 NULL, /* init master */
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
55 NULL, /* init module */
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
56 NULL, /* init process */
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
57 NULL, /* init thread */
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
58 NULL, /* exit thread */
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
59 NULL, /* exit process */
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
60 NULL, /* exit master */
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
61 NGX_MODULE_V1_PADDING
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
62 };
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
63
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
64
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
65 static char *
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
66 ngx_http_upstream_zone(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
67 {
6123
caa103acf180 Upstream: allow multiple upstreams to use the same shared zone.
Ruslan Ermilov <ru@nginx.com>
parents: 6103
diff changeset
68 ssize_t size;
caa103acf180 Upstream: allow multiple upstreams to use the same shared zone.
Ruslan Ermilov <ru@nginx.com>
parents: 6103
diff changeset
69 ngx_str_t *value;
caa103acf180 Upstream: allow multiple upstreams to use the same shared zone.
Ruslan Ermilov <ru@nginx.com>
parents: 6103
diff changeset
70 ngx_http_upstream_srv_conf_t *uscf;
caa103acf180 Upstream: allow multiple upstreams to use the same shared zone.
Ruslan Ermilov <ru@nginx.com>
parents: 6103
diff changeset
71 ngx_http_upstream_main_conf_t *umcf;
6103
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
72
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
73 uscf = ngx_http_conf_get_module_srv_conf(cf, ngx_http_upstream_module);
6123
caa103acf180 Upstream: allow multiple upstreams to use the same shared zone.
Ruslan Ermilov <ru@nginx.com>
parents: 6103
diff changeset
74 umcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_upstream_module);
6103
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
75
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
76 value = cf->args->elts;
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
77
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
78 if (!value[1].len) {
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
79 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
80 "invalid zone name \"%V\"", &value[1]);
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
81 return NGX_CONF_ERROR;
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
82 }
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
83
6123
caa103acf180 Upstream: allow multiple upstreams to use the same shared zone.
Ruslan Ermilov <ru@nginx.com>
parents: 6103
diff changeset
84 if (cf->args->nelts == 3) {
caa103acf180 Upstream: allow multiple upstreams to use the same shared zone.
Ruslan Ermilov <ru@nginx.com>
parents: 6103
diff changeset
85 size = ngx_parse_size(&value[2]);
caa103acf180 Upstream: allow multiple upstreams to use the same shared zone.
Ruslan Ermilov <ru@nginx.com>
parents: 6103
diff changeset
86
caa103acf180 Upstream: allow multiple upstreams to use the same shared zone.
Ruslan Ermilov <ru@nginx.com>
parents: 6103
diff changeset
87 if (size == NGX_ERROR) {
caa103acf180 Upstream: allow multiple upstreams to use the same shared zone.
Ruslan Ermilov <ru@nginx.com>
parents: 6103
diff changeset
88 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
caa103acf180 Upstream: allow multiple upstreams to use the same shared zone.
Ruslan Ermilov <ru@nginx.com>
parents: 6103
diff changeset
89 "invalid zone size \"%V\"", &value[2]);
caa103acf180 Upstream: allow multiple upstreams to use the same shared zone.
Ruslan Ermilov <ru@nginx.com>
parents: 6103
diff changeset
90 return NGX_CONF_ERROR;
caa103acf180 Upstream: allow multiple upstreams to use the same shared zone.
Ruslan Ermilov <ru@nginx.com>
parents: 6103
diff changeset
91 }
6103
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
92
6123
caa103acf180 Upstream: allow multiple upstreams to use the same shared zone.
Ruslan Ermilov <ru@nginx.com>
parents: 6103
diff changeset
93 if (size < (ssize_t) (8 * ngx_pagesize)) {
caa103acf180 Upstream: allow multiple upstreams to use the same shared zone.
Ruslan Ermilov <ru@nginx.com>
parents: 6103
diff changeset
94 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
caa103acf180 Upstream: allow multiple upstreams to use the same shared zone.
Ruslan Ermilov <ru@nginx.com>
parents: 6103
diff changeset
95 "zone \"%V\" is too small", &value[1]);
caa103acf180 Upstream: allow multiple upstreams to use the same shared zone.
Ruslan Ermilov <ru@nginx.com>
parents: 6103
diff changeset
96 return NGX_CONF_ERROR;
caa103acf180 Upstream: allow multiple upstreams to use the same shared zone.
Ruslan Ermilov <ru@nginx.com>
parents: 6103
diff changeset
97 }
6103
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
98
6123
caa103acf180 Upstream: allow multiple upstreams to use the same shared zone.
Ruslan Ermilov <ru@nginx.com>
parents: 6103
diff changeset
99 } else {
caa103acf180 Upstream: allow multiple upstreams to use the same shared zone.
Ruslan Ermilov <ru@nginx.com>
parents: 6103
diff changeset
100 size = 0;
6103
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
101 }
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
102
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
103 uscf->shm_zone = ngx_shared_memory_add(cf, &value[1], size,
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
104 &ngx_http_upstream_module);
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
105 if (uscf->shm_zone == NULL) {
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
106 return NGX_CONF_ERROR;
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
107 }
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
108
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
109 uscf->shm_zone->init = ngx_http_upstream_init_zone;
6123
caa103acf180 Upstream: allow multiple upstreams to use the same shared zone.
Ruslan Ermilov <ru@nginx.com>
parents: 6103
diff changeset
110 uscf->shm_zone->data = umcf;
6103
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
111
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
112 uscf->shm_zone->noreuse = 1;
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
113
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
114 return NGX_CONF_OK;
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
115 }
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
116
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
117
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
118 static ngx_int_t
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
119 ngx_http_upstream_init_zone(ngx_shm_zone_t *shm_zone, void *data)
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
120 {
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
121 size_t len;
6123
caa103acf180 Upstream: allow multiple upstreams to use the same shared zone.
Ruslan Ermilov <ru@nginx.com>
parents: 6103
diff changeset
122 ngx_uint_t i;
6103
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
123 ngx_slab_pool_t *shpool;
6198
311d232ad803 Upstream: fixed shared upstreams on win32.
Ruslan Ermilov <ru@nginx.com>
parents: 6123
diff changeset
124 ngx_http_upstream_rr_peers_t *peers, **peersp;
6123
caa103acf180 Upstream: allow multiple upstreams to use the same shared zone.
Ruslan Ermilov <ru@nginx.com>
parents: 6103
diff changeset
125 ngx_http_upstream_srv_conf_t *uscf, **uscfp;
caa103acf180 Upstream: allow multiple upstreams to use the same shared zone.
Ruslan Ermilov <ru@nginx.com>
parents: 6103
diff changeset
126 ngx_http_upstream_main_conf_t *umcf;
6103
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
127
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
128 shpool = (ngx_slab_pool_t *) shm_zone->shm.addr;
6198
311d232ad803 Upstream: fixed shared upstreams on win32.
Ruslan Ermilov <ru@nginx.com>
parents: 6123
diff changeset
129 umcf = shm_zone->data;
311d232ad803 Upstream: fixed shared upstreams on win32.
Ruslan Ermilov <ru@nginx.com>
parents: 6123
diff changeset
130 uscfp = umcf->upstreams.elts;
6103
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
131
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
132 if (shm_zone->shm.exists) {
6198
311d232ad803 Upstream: fixed shared upstreams on win32.
Ruslan Ermilov <ru@nginx.com>
parents: 6123
diff changeset
133 peers = shpool->data;
311d232ad803 Upstream: fixed shared upstreams on win32.
Ruslan Ermilov <ru@nginx.com>
parents: 6123
diff changeset
134
311d232ad803 Upstream: fixed shared upstreams on win32.
Ruslan Ermilov <ru@nginx.com>
parents: 6123
diff changeset
135 for (i = 0; i < umcf->upstreams.nelts; i++) {
311d232ad803 Upstream: fixed shared upstreams on win32.
Ruslan Ermilov <ru@nginx.com>
parents: 6123
diff changeset
136 uscf = uscfp[i];
311d232ad803 Upstream: fixed shared upstreams on win32.
Ruslan Ermilov <ru@nginx.com>
parents: 6123
diff changeset
137
311d232ad803 Upstream: fixed shared upstreams on win32.
Ruslan Ermilov <ru@nginx.com>
parents: 6123
diff changeset
138 if (uscf->shm_zone != shm_zone) {
311d232ad803 Upstream: fixed shared upstreams on win32.
Ruslan Ermilov <ru@nginx.com>
parents: 6123
diff changeset
139 continue;
311d232ad803 Upstream: fixed shared upstreams on win32.
Ruslan Ermilov <ru@nginx.com>
parents: 6123
diff changeset
140 }
311d232ad803 Upstream: fixed shared upstreams on win32.
Ruslan Ermilov <ru@nginx.com>
parents: 6123
diff changeset
141
311d232ad803 Upstream: fixed shared upstreams on win32.
Ruslan Ermilov <ru@nginx.com>
parents: 6123
diff changeset
142 uscf->peer.data = peers;
311d232ad803 Upstream: fixed shared upstreams on win32.
Ruslan Ermilov <ru@nginx.com>
parents: 6123
diff changeset
143 peers = peers->zone_next;
311d232ad803 Upstream: fixed shared upstreams on win32.
Ruslan Ermilov <ru@nginx.com>
parents: 6123
diff changeset
144 }
311d232ad803 Upstream: fixed shared upstreams on win32.
Ruslan Ermilov <ru@nginx.com>
parents: 6123
diff changeset
145
311d232ad803 Upstream: fixed shared upstreams on win32.
Ruslan Ermilov <ru@nginx.com>
parents: 6123
diff changeset
146 return NGX_OK;
6103
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
147 }
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
148
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
149 len = sizeof(" in upstream zone \"\"") + shm_zone->shm.name.len;
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
150
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
151 shpool->log_ctx = ngx_slab_alloc(shpool, len);
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
152 if (shpool->log_ctx == NULL) {
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
153 return NGX_ERROR;
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
154 }
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
155
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
156 ngx_sprintf(shpool->log_ctx, " in upstream zone \"%V\"%Z",
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
157 &shm_zone->shm.name);
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
158
6123
caa103acf180 Upstream: allow multiple upstreams to use the same shared zone.
Ruslan Ermilov <ru@nginx.com>
parents: 6103
diff changeset
159
caa103acf180 Upstream: allow multiple upstreams to use the same shared zone.
Ruslan Ermilov <ru@nginx.com>
parents: 6103
diff changeset
160 /* copy peers to shared memory */
caa103acf180 Upstream: allow multiple upstreams to use the same shared zone.
Ruslan Ermilov <ru@nginx.com>
parents: 6103
diff changeset
161
6214
341e4303d25b Fixed strict aliasing warnings with old GCC versions.
Ruslan Ermilov <ru@nginx.com>
parents: 6198
diff changeset
162 peersp = (ngx_http_upstream_rr_peers_t **) (void *) &shpool->data;
6123
caa103acf180 Upstream: allow multiple upstreams to use the same shared zone.
Ruslan Ermilov <ru@nginx.com>
parents: 6103
diff changeset
163
caa103acf180 Upstream: allow multiple upstreams to use the same shared zone.
Ruslan Ermilov <ru@nginx.com>
parents: 6103
diff changeset
164 for (i = 0; i < umcf->upstreams.nelts; i++) {
caa103acf180 Upstream: allow multiple upstreams to use the same shared zone.
Ruslan Ermilov <ru@nginx.com>
parents: 6103
diff changeset
165 uscf = uscfp[i];
caa103acf180 Upstream: allow multiple upstreams to use the same shared zone.
Ruslan Ermilov <ru@nginx.com>
parents: 6103
diff changeset
166
caa103acf180 Upstream: allow multiple upstreams to use the same shared zone.
Ruslan Ermilov <ru@nginx.com>
parents: 6103
diff changeset
167 if (uscf->shm_zone != shm_zone) {
caa103acf180 Upstream: allow multiple upstreams to use the same shared zone.
Ruslan Ermilov <ru@nginx.com>
parents: 6103
diff changeset
168 continue;
caa103acf180 Upstream: allow multiple upstreams to use the same shared zone.
Ruslan Ermilov <ru@nginx.com>
parents: 6103
diff changeset
169 }
caa103acf180 Upstream: allow multiple upstreams to use the same shared zone.
Ruslan Ermilov <ru@nginx.com>
parents: 6103
diff changeset
170
6198
311d232ad803 Upstream: fixed shared upstreams on win32.
Ruslan Ermilov <ru@nginx.com>
parents: 6123
diff changeset
171 peers = ngx_http_upstream_zone_copy_peers(shpool, uscf);
311d232ad803 Upstream: fixed shared upstreams on win32.
Ruslan Ermilov <ru@nginx.com>
parents: 6123
diff changeset
172 if (peers == NULL) {
6123
caa103acf180 Upstream: allow multiple upstreams to use the same shared zone.
Ruslan Ermilov <ru@nginx.com>
parents: 6103
diff changeset
173 return NGX_ERROR;
caa103acf180 Upstream: allow multiple upstreams to use the same shared zone.
Ruslan Ermilov <ru@nginx.com>
parents: 6103
diff changeset
174 }
6198
311d232ad803 Upstream: fixed shared upstreams on win32.
Ruslan Ermilov <ru@nginx.com>
parents: 6123
diff changeset
175
311d232ad803 Upstream: fixed shared upstreams on win32.
Ruslan Ermilov <ru@nginx.com>
parents: 6123
diff changeset
176 *peersp = peers;
311d232ad803 Upstream: fixed shared upstreams on win32.
Ruslan Ermilov <ru@nginx.com>
parents: 6123
diff changeset
177 peersp = &peers->zone_next;
6123
caa103acf180 Upstream: allow multiple upstreams to use the same shared zone.
Ruslan Ermilov <ru@nginx.com>
parents: 6103
diff changeset
178 }
caa103acf180 Upstream: allow multiple upstreams to use the same shared zone.
Ruslan Ermilov <ru@nginx.com>
parents: 6103
diff changeset
179
caa103acf180 Upstream: allow multiple upstreams to use the same shared zone.
Ruslan Ermilov <ru@nginx.com>
parents: 6103
diff changeset
180 return NGX_OK;
caa103acf180 Upstream: allow multiple upstreams to use the same shared zone.
Ruslan Ermilov <ru@nginx.com>
parents: 6103
diff changeset
181 }
caa103acf180 Upstream: allow multiple upstreams to use the same shared zone.
Ruslan Ermilov <ru@nginx.com>
parents: 6103
diff changeset
182
caa103acf180 Upstream: allow multiple upstreams to use the same shared zone.
Ruslan Ermilov <ru@nginx.com>
parents: 6103
diff changeset
183
6198
311d232ad803 Upstream: fixed shared upstreams on win32.
Ruslan Ermilov <ru@nginx.com>
parents: 6123
diff changeset
184 static ngx_http_upstream_rr_peers_t *
6123
caa103acf180 Upstream: allow multiple upstreams to use the same shared zone.
Ruslan Ermilov <ru@nginx.com>
parents: 6103
diff changeset
185 ngx_http_upstream_zone_copy_peers(ngx_slab_pool_t *shpool,
caa103acf180 Upstream: allow multiple upstreams to use the same shared zone.
Ruslan Ermilov <ru@nginx.com>
parents: 6103
diff changeset
186 ngx_http_upstream_srv_conf_t *uscf)
caa103acf180 Upstream: allow multiple upstreams to use the same shared zone.
Ruslan Ermilov <ru@nginx.com>
parents: 6103
diff changeset
187 {
caa103acf180 Upstream: allow multiple upstreams to use the same shared zone.
Ruslan Ermilov <ru@nginx.com>
parents: 6103
diff changeset
188 ngx_http_upstream_rr_peer_t *peer, **peerp;
caa103acf180 Upstream: allow multiple upstreams to use the same shared zone.
Ruslan Ermilov <ru@nginx.com>
parents: 6103
diff changeset
189 ngx_http_upstream_rr_peers_t *peers, *backup;
caa103acf180 Upstream: allow multiple upstreams to use the same shared zone.
Ruslan Ermilov <ru@nginx.com>
parents: 6103
diff changeset
190
6103
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
191 peers = ngx_slab_alloc(shpool, sizeof(ngx_http_upstream_rr_peers_t));
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
192 if (peers == NULL) {
6198
311d232ad803 Upstream: fixed shared upstreams on win32.
Ruslan Ermilov <ru@nginx.com>
parents: 6123
diff changeset
193 return NULL;
6103
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
194 }
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
195
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
196 ngx_memcpy(peers, uscf->peer.data, sizeof(ngx_http_upstream_rr_peers_t));
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
197
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
198 peers->shpool = shpool;
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
199
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
200 for (peerp = &peers->peer; *peerp; peerp = &peer->next) {
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
201 /* pool is unlocked */
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
202 peer = ngx_slab_calloc_locked(shpool,
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
203 sizeof(ngx_http_upstream_rr_peer_t));
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
204 if (peer == NULL) {
6198
311d232ad803 Upstream: fixed shared upstreams on win32.
Ruslan Ermilov <ru@nginx.com>
parents: 6123
diff changeset
205 return NULL;
6103
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
206 }
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
207
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
208 ngx_memcpy(peer, *peerp, sizeof(ngx_http_upstream_rr_peer_t));
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
209
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
210 *peerp = peer;
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
211 }
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
212
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
213 if (peers->next == NULL) {
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
214 goto done;
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
215 }
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
216
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
217 backup = ngx_slab_alloc(shpool, sizeof(ngx_http_upstream_rr_peers_t));
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
218 if (backup == NULL) {
6198
311d232ad803 Upstream: fixed shared upstreams on win32.
Ruslan Ermilov <ru@nginx.com>
parents: 6123
diff changeset
219 return NULL;
6103
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
220 }
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
221
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
222 ngx_memcpy(backup, peers->next, sizeof(ngx_http_upstream_rr_peers_t));
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
223
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
224 backup->shpool = shpool;
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
225
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
226 for (peerp = &backup->peer; *peerp; peerp = &peer->next) {
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
227 /* pool is unlocked */
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
228 peer = ngx_slab_calloc_locked(shpool,
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
229 sizeof(ngx_http_upstream_rr_peer_t));
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
230 if (peer == NULL) {
6198
311d232ad803 Upstream: fixed shared upstreams on win32.
Ruslan Ermilov <ru@nginx.com>
parents: 6123
diff changeset
231 return NULL;
6103
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
232 }
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
233
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
234 ngx_memcpy(peer, *peerp, sizeof(ngx_http_upstream_rr_peer_t));
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
235
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
236 *peerp = peer;
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
237 }
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
238
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
239 peers->next = backup;
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
240
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
241 done:
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
242
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
243 uscf->peer.data = peers;
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
244
6198
311d232ad803 Upstream: fixed shared upstreams on win32.
Ruslan Ermilov <ru@nginx.com>
parents: 6123
diff changeset
245 return peers;
6103
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
246 }