annotate src/stream/ngx_stream_limit_conn_module.c @ 6927:c36d160cd4e0

Access log: removed dead ev->timedout check in flush timer handler. The ev->timedout flag is set on first timer expiration, and never reset after it. Due to this the code to stop the timer when the timer was canceled never worked (except in a very specific time frame immediately after start), and the timer was always armed again. This essentially resulted in a buffer flush at the end of an event loop iteration. This behaviour actually seems to be better than just stopping the flush timer for the whole shutdown, so it is preserved as is instead of fixing the code to actually remove the timer. It will be further improved by upcoming changes to preserve cancelable timers if there are other timers blocking shutdown.
author Maxim Dounin <mdounin@mdounin.ru>
date Tue, 07 Mar 2017 18:51:12 +0300
parents 3908156a51fa
children 359b0ea2b067
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
6197
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
2 /*
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
3 * Copyright (C) Igor Sysoev
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
4 * Copyright (C) Nginx, Inc.
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
5 */
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
6
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
7
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
8 #include <ngx_config.h>
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
9 #include <ngx_core.h>
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
10 #include <ngx_stream.h>
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
11
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
12
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
13 typedef struct {
6610
d5b5866c06c4 Stream: got rid of pseudo variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
14 u_char color;
d5b5866c06c4 Stream: got rid of pseudo variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
15 u_char len;
d5b5866c06c4 Stream: got rid of pseudo variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
16 u_short conn;
d5b5866c06c4 Stream: got rid of pseudo variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
17 u_char data[1];
6197
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
18 } ngx_stream_limit_conn_node_t;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
19
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
20
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
21 typedef struct {
6610
d5b5866c06c4 Stream: got rid of pseudo variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
22 ngx_shm_zone_t *shm_zone;
d5b5866c06c4 Stream: got rid of pseudo variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
23 ngx_rbtree_node_t *node;
6197
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
24 } ngx_stream_limit_conn_cleanup_t;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
25
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
26
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
27 typedef struct {
6610
d5b5866c06c4 Stream: got rid of pseudo variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
28 ngx_rbtree_t *rbtree;
d5b5866c06c4 Stream: got rid of pseudo variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
29 ngx_stream_complex_value_t key;
6197
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
30 } ngx_stream_limit_conn_ctx_t;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
31
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
32
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
33 typedef struct {
6610
d5b5866c06c4 Stream: got rid of pseudo variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
34 ngx_shm_zone_t *shm_zone;
d5b5866c06c4 Stream: got rid of pseudo variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
35 ngx_uint_t conn;
6197
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
36 } ngx_stream_limit_conn_limit_t;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
37
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
38
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
39 typedef struct {
6610
d5b5866c06c4 Stream: got rid of pseudo variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
40 ngx_array_t limits;
d5b5866c06c4 Stream: got rid of pseudo variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
41 ngx_uint_t log_level;
6197
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
42 } ngx_stream_limit_conn_conf_t;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
43
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
44
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
45 static ngx_rbtree_node_t *ngx_stream_limit_conn_lookup(ngx_rbtree_t *rbtree,
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
46 ngx_str_t *key, uint32_t hash);
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
47 static void ngx_stream_limit_conn_cleanup(void *data);
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
48 static ngx_inline void ngx_stream_limit_conn_cleanup_all(ngx_pool_t *pool);
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
49
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
50 static void *ngx_stream_limit_conn_create_conf(ngx_conf_t *cf);
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
51 static char *ngx_stream_limit_conn_merge_conf(ngx_conf_t *cf, void *parent,
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
52 void *child);
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
53 static char *ngx_stream_limit_conn_zone(ngx_conf_t *cf, ngx_command_t *cmd,
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
54 void *conf);
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
55 static char *ngx_stream_limit_conn(ngx_conf_t *cf, ngx_command_t *cmd,
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
56 void *conf);
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
57 static ngx_int_t ngx_stream_limit_conn_init(ngx_conf_t *cf);
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
58
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
59
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
60 static ngx_conf_enum_t ngx_stream_limit_conn_log_levels[] = {
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
61 { ngx_string("info"), NGX_LOG_INFO },
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
62 { ngx_string("notice"), NGX_LOG_NOTICE },
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
63 { ngx_string("warn"), NGX_LOG_WARN },
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
64 { ngx_string("error"), NGX_LOG_ERR },
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
65 { ngx_null_string, 0 }
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
66 };
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
67
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
68
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
69 static ngx_command_t ngx_stream_limit_conn_commands[] = {
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
70
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
71 { ngx_string("limit_conn_zone"),
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
72 NGX_STREAM_MAIN_CONF|NGX_CONF_TAKE2,
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
73 ngx_stream_limit_conn_zone,
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
74 0,
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
75 0,
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
76 NULL },
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
77
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
78 { ngx_string("limit_conn"),
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
79 NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_TAKE2,
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
80 ngx_stream_limit_conn,
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
81 NGX_STREAM_SRV_CONF_OFFSET,
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
82 0,
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
83 NULL },
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
84
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
85 { ngx_string("limit_conn_log_level"),
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
86 NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_TAKE1,
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
87 ngx_conf_set_enum_slot,
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
88 NGX_STREAM_SRV_CONF_OFFSET,
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
89 offsetof(ngx_stream_limit_conn_conf_t, log_level),
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
90 &ngx_stream_limit_conn_log_levels },
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
91
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
92 ngx_null_command
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
93 };
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
94
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
95
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
96 static ngx_stream_module_t ngx_stream_limit_conn_module_ctx = {
6606
2f41d383c9c7 Stream: added preconfiguration step.
Vladimir Homutov <vl@nginx.com>
parents: 6601
diff changeset
97 NULL, /* preconfiguration */
6197
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
98 ngx_stream_limit_conn_init, /* postconfiguration */
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
99
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
100 NULL, /* create main configuration */
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
101 NULL, /* init main configuration */
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
102
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
103 ngx_stream_limit_conn_create_conf, /* create server configuration */
6629
8ed51b02f655 Stream: style.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
104 ngx_stream_limit_conn_merge_conf /* merge server configuration */
6197
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
105 };
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
106
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
107
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
108 ngx_module_t ngx_stream_limit_conn_module = {
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
109 NGX_MODULE_V1,
6601
Roman Arutyunyan <arut@nginx.com>
parents: 6480
diff changeset
110 &ngx_stream_limit_conn_module_ctx, /* module context */
Roman Arutyunyan <arut@nginx.com>
parents: 6480
diff changeset
111 ngx_stream_limit_conn_commands, /* module directives */
Roman Arutyunyan <arut@nginx.com>
parents: 6480
diff changeset
112 NGX_STREAM_MODULE, /* module type */
Roman Arutyunyan <arut@nginx.com>
parents: 6480
diff changeset
113 NULL, /* init master */
Roman Arutyunyan <arut@nginx.com>
parents: 6480
diff changeset
114 NULL, /* init module */
Roman Arutyunyan <arut@nginx.com>
parents: 6480
diff changeset
115 NULL, /* init process */
Roman Arutyunyan <arut@nginx.com>
parents: 6480
diff changeset
116 NULL, /* init thread */
Roman Arutyunyan <arut@nginx.com>
parents: 6480
diff changeset
117 NULL, /* exit thread */
Roman Arutyunyan <arut@nginx.com>
parents: 6480
diff changeset
118 NULL, /* exit process */
Roman Arutyunyan <arut@nginx.com>
parents: 6480
diff changeset
119 NULL, /* exit master */
6197
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
120 NGX_MODULE_V1_PADDING
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
121 };
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
122
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
123
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
124 static ngx_int_t
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
125 ngx_stream_limit_conn_handler(ngx_stream_session_t *s)
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
126 {
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
127 size_t n;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
128 uint32_t hash;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
129 ngx_str_t key;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
130 ngx_uint_t i;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
131 ngx_slab_pool_t *shpool;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
132 ngx_rbtree_node_t *node;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
133 ngx_pool_cleanup_t *cln;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
134 ngx_stream_limit_conn_ctx_t *ctx;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
135 ngx_stream_limit_conn_node_t *lc;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
136 ngx_stream_limit_conn_conf_t *lccf;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
137 ngx_stream_limit_conn_limit_t *limits;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
138 ngx_stream_limit_conn_cleanup_t *lccln;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
139
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
140 lccf = ngx_stream_get_module_srv_conf(s, ngx_stream_limit_conn_module);
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
141 limits = lccf->limits.elts;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
142
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
143 for (i = 0; i < lccf->limits.nelts; i++) {
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
144 ctx = limits[i].shm_zone->data;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
145
6610
d5b5866c06c4 Stream: got rid of pseudo variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
146 if (ngx_stream_complex_value(s, &ctx->key, &key) != NGX_OK) {
d5b5866c06c4 Stream: got rid of pseudo variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
147 return NGX_ERROR;
d5b5866c06c4 Stream: got rid of pseudo variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
148 }
d5b5866c06c4 Stream: got rid of pseudo variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
149
d5b5866c06c4 Stream: got rid of pseudo variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
150 if (key.len == 0) {
d5b5866c06c4 Stream: got rid of pseudo variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
151 continue;
d5b5866c06c4 Stream: got rid of pseudo variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
152 }
d5b5866c06c4 Stream: got rid of pseudo variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
153
d5b5866c06c4 Stream: got rid of pseudo variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
154 if (key.len > 255) {
d5b5866c06c4 Stream: got rid of pseudo variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
155 ngx_log_error(NGX_LOG_ERR, s->connection->log, 0,
d5b5866c06c4 Stream: got rid of pseudo variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
156 "the value of the \"%V\" key "
d5b5866c06c4 Stream: got rid of pseudo variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
157 "is more than 255 bytes: \"%V\"",
d5b5866c06c4 Stream: got rid of pseudo variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
158 &ctx->key.value, &key);
d5b5866c06c4 Stream: got rid of pseudo variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
159 continue;
d5b5866c06c4 Stream: got rid of pseudo variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
160 }
d5b5866c06c4 Stream: got rid of pseudo variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
161
d5b5866c06c4 Stream: got rid of pseudo variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
162 hash = ngx_crc32_short(key.data, key.len);
d5b5866c06c4 Stream: got rid of pseudo variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
163
6197
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
164 shpool = (ngx_slab_pool_t *) limits[i].shm_zone->shm.addr;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
165
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
166 ngx_shmtx_lock(&shpool->mutex);
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
167
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
168 node = ngx_stream_limit_conn_lookup(ctx->rbtree, &key, hash);
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
169
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
170 if (node == NULL) {
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
171
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
172 n = offsetof(ngx_rbtree_node_t, color)
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
173 + offsetof(ngx_stream_limit_conn_node_t, data)
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
174 + key.len;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
175
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
176 node = ngx_slab_alloc_locked(shpool, n);
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
177
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
178 if (node == NULL) {
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
179 ngx_shmtx_unlock(&shpool->mutex);
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
180 ngx_stream_limit_conn_cleanup_all(s->connection->pool);
6693
3908156a51fa Stream: phases.
Roman Arutyunyan <arut@nginx.com>
parents: 6629
diff changeset
181 return NGX_STREAM_SERVICE_UNAVAILABLE;
6197
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
182 }
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
183
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
184 lc = (ngx_stream_limit_conn_node_t *) &node->color;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
185
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
186 node->key = hash;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
187 lc->len = (u_char) key.len;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
188 lc->conn = 1;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
189 ngx_memcpy(lc->data, key.data, key.len);
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
190
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
191 ngx_rbtree_insert(ctx->rbtree, node);
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
192
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
193 } else {
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
194
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
195 lc = (ngx_stream_limit_conn_node_t *) &node->color;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
196
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
197 if ((ngx_uint_t) lc->conn >= limits[i].conn) {
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
198
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
199 ngx_shmtx_unlock(&shpool->mutex);
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
200
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
201 ngx_log_error(lccf->log_level, s->connection->log, 0,
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
202 "limiting connections by zone \"%V\"",
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
203 &limits[i].shm_zone->shm.name);
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
204
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
205 ngx_stream_limit_conn_cleanup_all(s->connection->pool);
6693
3908156a51fa Stream: phases.
Roman Arutyunyan <arut@nginx.com>
parents: 6629
diff changeset
206 return NGX_STREAM_SERVICE_UNAVAILABLE;
6197
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
207 }
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
208
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
209 lc->conn++;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
210 }
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
211
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
212 ngx_log_debug2(NGX_LOG_DEBUG_STREAM, s->connection->log, 0,
6480
f01ab2dbcfdc Fixed logging.
Sergey Kandaurov <pluknet@nginx.com>
parents: 6197
diff changeset
213 "limit conn: %08Xi %d", node->key, lc->conn);
6197
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
214
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
215 ngx_shmtx_unlock(&shpool->mutex);
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
216
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
217 cln = ngx_pool_cleanup_add(s->connection->pool,
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
218 sizeof(ngx_stream_limit_conn_cleanup_t));
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
219 if (cln == NULL) {
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
220 return NGX_ERROR;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
221 }
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
222
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
223 cln->handler = ngx_stream_limit_conn_cleanup;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
224 lccln = cln->data;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
225
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
226 lccln->shm_zone = limits[i].shm_zone;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
227 lccln->node = node;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
228 }
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
229
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
230 return NGX_DECLINED;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
231 }
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
232
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
233
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
234 static void
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
235 ngx_stream_limit_conn_rbtree_insert_value(ngx_rbtree_node_t *temp,
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
236 ngx_rbtree_node_t *node, ngx_rbtree_node_t *sentinel)
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
237 {
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
238 ngx_rbtree_node_t **p;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
239 ngx_stream_limit_conn_node_t *lcn, *lcnt;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
240
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
241 for ( ;; ) {
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
242
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
243 if (node->key < temp->key) {
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
244
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
245 p = &temp->left;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
246
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
247 } else if (node->key > temp->key) {
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
248
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
249 p = &temp->right;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
250
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
251 } else { /* node->key == temp->key */
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
252
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
253 lcn = (ngx_stream_limit_conn_node_t *) &node->color;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
254 lcnt = (ngx_stream_limit_conn_node_t *) &temp->color;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
255
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
256 p = (ngx_memn2cmp(lcn->data, lcnt->data, lcn->len, lcnt->len) < 0)
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
257 ? &temp->left : &temp->right;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
258 }
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
259
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
260 if (*p == sentinel) {
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
261 break;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
262 }
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
263
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
264 temp = *p;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
265 }
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
266
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
267 *p = node;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
268 node->parent = temp;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
269 node->left = sentinel;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
270 node->right = sentinel;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
271 ngx_rbt_red(node);
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
272 }
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
273
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
274
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
275 static ngx_rbtree_node_t *
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
276 ngx_stream_limit_conn_lookup(ngx_rbtree_t *rbtree, ngx_str_t *key,
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
277 uint32_t hash)
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
278 {
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
279 ngx_int_t rc;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
280 ngx_rbtree_node_t *node, *sentinel;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
281 ngx_stream_limit_conn_node_t *lcn;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
282
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
283 node = rbtree->root;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
284 sentinel = rbtree->sentinel;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
285
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
286 while (node != sentinel) {
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
287
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
288 if (hash < node->key) {
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
289 node = node->left;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
290 continue;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
291 }
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
292
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
293 if (hash > node->key) {
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
294 node = node->right;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
295 continue;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
296 }
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
297
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
298 /* hash == node->key */
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
299
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
300 lcn = (ngx_stream_limit_conn_node_t *) &node->color;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
301
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
302 rc = ngx_memn2cmp(key->data, lcn->data, key->len, (size_t) lcn->len);
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
303
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
304 if (rc == 0) {
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
305 return node;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
306 }
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
307
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
308 node = (rc < 0) ? node->left : node->right;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
309 }
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
310
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
311 return NULL;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
312 }
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
313
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
314
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
315 static void
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
316 ngx_stream_limit_conn_cleanup(void *data)
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
317 {
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
318 ngx_stream_limit_conn_cleanup_t *lccln = data;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
319
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
320 ngx_slab_pool_t *shpool;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
321 ngx_rbtree_node_t *node;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
322 ngx_stream_limit_conn_ctx_t *ctx;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
323 ngx_stream_limit_conn_node_t *lc;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
324
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
325 ctx = lccln->shm_zone->data;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
326 shpool = (ngx_slab_pool_t *) lccln->shm_zone->shm.addr;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
327 node = lccln->node;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
328 lc = (ngx_stream_limit_conn_node_t *) &node->color;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
329
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
330 ngx_shmtx_lock(&shpool->mutex);
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
331
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
332 ngx_log_debug2(NGX_LOG_DEBUG_STREAM, lccln->shm_zone->shm.log, 0,
6480
f01ab2dbcfdc Fixed logging.
Sergey Kandaurov <pluknet@nginx.com>
parents: 6197
diff changeset
333 "limit conn cleanup: %08Xi %d", node->key, lc->conn);
6197
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
334
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
335 lc->conn--;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
336
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
337 if (lc->conn == 0) {
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
338 ngx_rbtree_delete(ctx->rbtree, node);
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
339 ngx_slab_free_locked(shpool, node);
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
340 }
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
341
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
342 ngx_shmtx_unlock(&shpool->mutex);
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
343 }
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
344
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
345
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
346 static ngx_inline void
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
347 ngx_stream_limit_conn_cleanup_all(ngx_pool_t *pool)
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
348 {
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
349 ngx_pool_cleanup_t *cln;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
350
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
351 cln = pool->cleanup;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
352
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
353 while (cln && cln->handler == ngx_stream_limit_conn_cleanup) {
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
354 ngx_stream_limit_conn_cleanup(cln->data);
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
355 cln = cln->next;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
356 }
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
357
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
358 pool->cleanup = cln;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
359 }
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
360
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
361
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
362 static ngx_int_t
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
363 ngx_stream_limit_conn_init_zone(ngx_shm_zone_t *shm_zone, void *data)
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
364 {
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
365 ngx_stream_limit_conn_ctx_t *octx = data;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
366
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
367 size_t len;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
368 ngx_slab_pool_t *shpool;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
369 ngx_rbtree_node_t *sentinel;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
370 ngx_stream_limit_conn_ctx_t *ctx;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
371
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
372 ctx = shm_zone->data;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
373
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
374 if (octx) {
6610
d5b5866c06c4 Stream: got rid of pseudo variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
375 if (ctx->key.value.len != octx->key.value.len
d5b5866c06c4 Stream: got rid of pseudo variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
376 || ngx_strncmp(ctx->key.value.data, octx->key.value.data,
d5b5866c06c4 Stream: got rid of pseudo variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
377 ctx->key.value.len)
d5b5866c06c4 Stream: got rid of pseudo variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
378 != 0)
d5b5866c06c4 Stream: got rid of pseudo variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
379 {
d5b5866c06c4 Stream: got rid of pseudo variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
380 ngx_log_error(NGX_LOG_EMERG, shm_zone->shm.log, 0,
d5b5866c06c4 Stream: got rid of pseudo variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
381 "limit_conn_zone \"%V\" uses the \"%V\" key "
d5b5866c06c4 Stream: got rid of pseudo variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
382 "while previously it used the \"%V\" key",
d5b5866c06c4 Stream: got rid of pseudo variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
383 &shm_zone->shm.name, &ctx->key.value,
d5b5866c06c4 Stream: got rid of pseudo variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
384 &octx->key.value);
d5b5866c06c4 Stream: got rid of pseudo variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
385 return NGX_ERROR;
d5b5866c06c4 Stream: got rid of pseudo variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
386 }
d5b5866c06c4 Stream: got rid of pseudo variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
387
6197
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
388 ctx->rbtree = octx->rbtree;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
389
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
390 return NGX_OK;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
391 }
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
392
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
393 shpool = (ngx_slab_pool_t *) shm_zone->shm.addr;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
394
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
395 if (shm_zone->shm.exists) {
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
396 ctx->rbtree = shpool->data;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
397
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
398 return NGX_OK;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
399 }
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
400
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
401 ctx->rbtree = ngx_slab_alloc(shpool, sizeof(ngx_rbtree_t));
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
402 if (ctx->rbtree == NULL) {
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
403 return NGX_ERROR;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
404 }
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
405
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
406 shpool->data = ctx->rbtree;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
407
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
408 sentinel = ngx_slab_alloc(shpool, sizeof(ngx_rbtree_node_t));
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
409 if (sentinel == NULL) {
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
410 return NGX_ERROR;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
411 }
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
412
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
413 ngx_rbtree_init(ctx->rbtree, sentinel,
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
414 ngx_stream_limit_conn_rbtree_insert_value);
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
415
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
416 len = sizeof(" in limit_conn_zone \"\"") + shm_zone->shm.name.len;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
417
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
418 shpool->log_ctx = ngx_slab_alloc(shpool, len);
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
419 if (shpool->log_ctx == NULL) {
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
420 return NGX_ERROR;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
421 }
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
422
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
423 ngx_sprintf(shpool->log_ctx, " in limit_conn_zone \"%V\"%Z",
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
424 &shm_zone->shm.name);
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
425
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
426 return NGX_OK;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
427 }
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
428
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
429
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
430 static void *
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
431 ngx_stream_limit_conn_create_conf(ngx_conf_t *cf)
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
432 {
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
433 ngx_stream_limit_conn_conf_t *conf;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
434
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
435 conf = ngx_pcalloc(cf->pool, sizeof(ngx_stream_limit_conn_conf_t));
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
436 if (conf == NULL) {
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
437 return NULL;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
438 }
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
439
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
440 /*
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
441 * set by ngx_pcalloc():
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
442 *
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
443 * conf->limits.elts = NULL;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
444 */
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
445
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
446 conf->log_level = NGX_CONF_UNSET_UINT;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
447
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
448 return conf;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
449 }
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
450
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
451
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
452 static char *
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
453 ngx_stream_limit_conn_merge_conf(ngx_conf_t *cf, void *parent, void *child)
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
454 {
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
455 ngx_stream_limit_conn_conf_t *prev = parent;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
456 ngx_stream_limit_conn_conf_t *conf = child;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
457
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
458 if (conf->limits.elts == NULL) {
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
459 conf->limits = prev->limits;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
460 }
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
461
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
462 ngx_conf_merge_uint_value(conf->log_level, prev->log_level, NGX_LOG_ERR);
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
463
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
464 return NGX_CONF_OK;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
465 }
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
466
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
467
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
468 static char *
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
469 ngx_stream_limit_conn_zone(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
470 {
6610
d5b5866c06c4 Stream: got rid of pseudo variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
471 u_char *p;
d5b5866c06c4 Stream: got rid of pseudo variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
472 ssize_t size;
d5b5866c06c4 Stream: got rid of pseudo variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
473 ngx_str_t *value, name, s;
d5b5866c06c4 Stream: got rid of pseudo variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
474 ngx_uint_t i;
d5b5866c06c4 Stream: got rid of pseudo variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
475 ngx_shm_zone_t *shm_zone;
d5b5866c06c4 Stream: got rid of pseudo variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
476 ngx_stream_limit_conn_ctx_t *ctx;
d5b5866c06c4 Stream: got rid of pseudo variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
477 ngx_stream_compile_complex_value_t ccv;
6197
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
478
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
479 value = cf->args->elts;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
480
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
481 ctx = ngx_pcalloc(cf->pool, sizeof(ngx_stream_limit_conn_ctx_t));
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
482 if (ctx == NULL) {
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
483 return NGX_CONF_ERROR;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
484 }
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
485
6610
d5b5866c06c4 Stream: got rid of pseudo variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
486 ngx_memzero(&ccv, sizeof(ngx_stream_compile_complex_value_t));
d5b5866c06c4 Stream: got rid of pseudo variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
487
d5b5866c06c4 Stream: got rid of pseudo variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
488 ccv.cf = cf;
d5b5866c06c4 Stream: got rid of pseudo variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
489 ccv.value = &value[1];
d5b5866c06c4 Stream: got rid of pseudo variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
490 ccv.complex_value = &ctx->key;
d5b5866c06c4 Stream: got rid of pseudo variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
491
d5b5866c06c4 Stream: got rid of pseudo variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
492 if (ngx_stream_compile_complex_value(&ccv) != NGX_OK) {
d5b5866c06c4 Stream: got rid of pseudo variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
493 return NGX_CONF_ERROR;
d5b5866c06c4 Stream: got rid of pseudo variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
494 }
d5b5866c06c4 Stream: got rid of pseudo variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
495
6197
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
496 size = 0;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
497 name.len = 0;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
498
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
499 for (i = 2; i < cf->args->nelts; i++) {
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
500
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
501 if (ngx_strncmp(value[i].data, "zone=", 5) == 0) {
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
502
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
503 name.data = value[i].data + 5;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
504
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
505 p = (u_char *) ngx_strchr(name.data, ':');
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
506
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
507 if (p == NULL) {
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
508 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
509 "invalid zone size \"%V\"", &value[i]);
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
510 return NGX_CONF_ERROR;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
511 }
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
512
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
513 name.len = p - name.data;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
514
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
515 s.data = p + 1;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
516 s.len = value[i].data + value[i].len - s.data;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
517
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
518 size = ngx_parse_size(&s);
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
519
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
520 if (size == NGX_ERROR) {
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
521 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
522 "invalid zone size \"%V\"", &value[i]);
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
523 return NGX_CONF_ERROR;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
524 }
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
525
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
526 if (size < (ssize_t) (8 * ngx_pagesize)) {
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
527 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
528 "zone \"%V\" is too small", &value[i]);
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
529 return NGX_CONF_ERROR;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
530 }
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
531
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
532 continue;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
533 }
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
534
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
535 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
536 "invalid parameter \"%V\"", &value[i]);
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
537 return NGX_CONF_ERROR;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
538 }
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
539
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
540 if (name.len == 0) {
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
541 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
542 "\"%V\" must have \"zone\" parameter",
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
543 &cmd->name);
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
544 return NGX_CONF_ERROR;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
545 }
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
546
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
547 shm_zone = ngx_shared_memory_add(cf, &name, size,
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
548 &ngx_stream_limit_conn_module);
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
549 if (shm_zone == NULL) {
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
550 return NGX_CONF_ERROR;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
551 }
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
552
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
553 if (shm_zone->data) {
6610
d5b5866c06c4 Stream: got rid of pseudo variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
554 ctx = shm_zone->data;
d5b5866c06c4 Stream: got rid of pseudo variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
555
6197
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
556 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
6610
d5b5866c06c4 Stream: got rid of pseudo variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
557 "%V \"%V\" is already bound to key \"%V\"",
d5b5866c06c4 Stream: got rid of pseudo variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
558 &cmd->name, &name, &ctx->key.value);
6197
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
559 return NGX_CONF_ERROR;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
560 }
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
561
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
562 shm_zone->init = ngx_stream_limit_conn_init_zone;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
563 shm_zone->data = ctx;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
564
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
565 return NGX_CONF_OK;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
566 }
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
567
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
568
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
569 static char *
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
570 ngx_stream_limit_conn(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
571 {
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
572 ngx_shm_zone_t *shm_zone;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
573 ngx_stream_limit_conn_conf_t *lccf = conf;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
574 ngx_stream_limit_conn_limit_t *limit, *limits;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
575
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
576 ngx_str_t *value;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
577 ngx_int_t n;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
578 ngx_uint_t i;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
579
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
580 value = cf->args->elts;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
581
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
582 shm_zone = ngx_shared_memory_add(cf, &value[1], 0,
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
583 &ngx_stream_limit_conn_module);
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
584 if (shm_zone == NULL) {
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
585 return NGX_CONF_ERROR;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
586 }
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
587
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
588 limits = lccf->limits.elts;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
589
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
590 if (limits == NULL) {
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
591 if (ngx_array_init(&lccf->limits, cf->pool, 1,
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
592 sizeof(ngx_stream_limit_conn_limit_t))
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
593 != NGX_OK)
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
594 {
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
595 return NGX_CONF_ERROR;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
596 }
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
597 }
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
598
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
599 for (i = 0; i < lccf->limits.nelts; i++) {
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
600 if (shm_zone == limits[i].shm_zone) {
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
601 return "is duplicate";
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
602 }
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
603 }
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
604
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
605 n = ngx_atoi(value[2].data, value[2].len);
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
606 if (n <= 0) {
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
607 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
608 "invalid number of connections \"%V\"", &value[2]);
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
609 return NGX_CONF_ERROR;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
610 }
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
611
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
612 if (n > 65535) {
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
613 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
614 "connection limit must be less 65536");
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
615 return NGX_CONF_ERROR;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
616 }
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
617
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
618 limit = ngx_array_push(&lccf->limits);
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
619 if (limit == NULL) {
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
620 return NGX_CONF_ERROR;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
621 }
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
622
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
623 limit->conn = n;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
624 limit->shm_zone = shm_zone;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
625
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
626 return NGX_CONF_OK;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
627 }
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
628
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
629
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
630 static ngx_int_t
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
631 ngx_stream_limit_conn_init(ngx_conf_t *cf)
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
632 {
6693
3908156a51fa Stream: phases.
Roman Arutyunyan <arut@nginx.com>
parents: 6629
diff changeset
633 ngx_stream_handler_pt *h;
6197
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
634 ngx_stream_core_main_conf_t *cmcf;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
635
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
636 cmcf = ngx_stream_conf_get_module_main_conf(cf, ngx_stream_core_module);
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
637
6693
3908156a51fa Stream: phases.
Roman Arutyunyan <arut@nginx.com>
parents: 6629
diff changeset
638 h = ngx_array_push(&cmcf->phases[NGX_STREAM_PREACCESS_PHASE].handlers);
3908156a51fa Stream: phases.
Roman Arutyunyan <arut@nginx.com>
parents: 6629
diff changeset
639 if (h == NULL) {
3908156a51fa Stream: phases.
Roman Arutyunyan <arut@nginx.com>
parents: 6629
diff changeset
640 return NGX_ERROR;
3908156a51fa Stream: phases.
Roman Arutyunyan <arut@nginx.com>
parents: 6629
diff changeset
641 }
3908156a51fa Stream: phases.
Roman Arutyunyan <arut@nginx.com>
parents: 6629
diff changeset
642
3908156a51fa Stream: phases.
Roman Arutyunyan <arut@nginx.com>
parents: 6629
diff changeset
643 *h = ngx_stream_limit_conn_handler;
6197
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
644
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
645 return NGX_OK;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
646 }