annotate ngx_http_upstream_keepalive_module.c @ 24:2ee28064a04a 0.4

Keepalive: correctly close connections on gracefull shutdown. On gracefull shutdown nginx calls read handler on all idle connections with c->close set. Make sure we don't confuse such read handler calls with stale events and actually close connections. This fixes "open socket ... left in connection ..." alerts.
author Maxim Dounin <mdounin@mdounin.ru>
date Wed, 15 Dec 2010 21:12:36 +0300
parents 9a4ee6fe1c6d
children cb15f6f4d820
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2 /*
1
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
3 * Copyright (C) Maxim Dounin
0
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4 */
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
5
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
6
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
7 #include <ngx_config.h>
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
8 #include <ngx_core.h>
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
9 #include <ngx_http.h>
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
10
5
e7d1b49e0611 Keepalive: style.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4
diff changeset
11
2
8545bbda9e4b Keepalive: reimplement using queues.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
12 typedef struct {
1
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
13 ngx_uint_t max_cached;
6
bef88ba0b378 Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5
diff changeset
14 ngx_uint_t single; /* unsigned:1 */
1
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
15
2
8545bbda9e4b Keepalive: reimplement using queues.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
16 ngx_queue_t cache;
8545bbda9e4b Keepalive: reimplement using queues.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
17 ngx_queue_t free;
0
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
18
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
19 ngx_http_upstream_init_pt original_init_upstream;
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
20 ngx_http_upstream_init_peer_pt original_init_peer;
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
21
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
22 } ngx_http_upstream_keepalive_srv_conf_t;
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
23
5
e7d1b49e0611 Keepalive: style.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4
diff changeset
24
0
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
25 typedef struct {
1
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
26 ngx_http_upstream_keepalive_srv_conf_t *conf;
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
27
11
15530a464dba Keepalive: don't cache invalid connections.
Maxim Dounin <mdounin@mdounin.ru>
parents: 10
diff changeset
28 ngx_http_upstream_t *upstream;
15530a464dba Keepalive: don't cache invalid connections.
Maxim Dounin <mdounin@mdounin.ru>
parents: 10
diff changeset
29
0
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
30 void *data;
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
31
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
32 ngx_event_get_peer_pt original_get_peer;
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
33 ngx_event_free_peer_pt original_free_peer;
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
34
11
15530a464dba Keepalive: don't cache invalid connections.
Maxim Dounin <mdounin@mdounin.ru>
parents: 10
diff changeset
35 ngx_uint_t failed; /* unsigned:1 */
15530a464dba Keepalive: don't cache invalid connections.
Maxim Dounin <mdounin@mdounin.ru>
parents: 10
diff changeset
36
0
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
37 } ngx_http_upstream_keepalive_peer_data_t;
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
38
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
39
8
565939797f5c Keepalive: fix connection closing and avoid for loop there.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6
diff changeset
40 typedef struct {
565939797f5c Keepalive: fix connection closing and avoid for loop there.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6
diff changeset
41 ngx_http_upstream_keepalive_srv_conf_t *conf;
565939797f5c Keepalive: fix connection closing and avoid for loop there.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6
diff changeset
42
565939797f5c Keepalive: fix connection closing and avoid for loop there.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6
diff changeset
43 ngx_queue_t queue;
565939797f5c Keepalive: fix connection closing and avoid for loop there.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6
diff changeset
44 ngx_connection_t *connection;
565939797f5c Keepalive: fix connection closing and avoid for loop there.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6
diff changeset
45
565939797f5c Keepalive: fix connection closing and avoid for loop there.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6
diff changeset
46 socklen_t socklen;
565939797f5c Keepalive: fix connection closing and avoid for loop there.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6
diff changeset
47 struct sockaddr_storage sockaddr;
565939797f5c Keepalive: fix connection closing and avoid for loop there.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6
diff changeset
48
565939797f5c Keepalive: fix connection closing and avoid for loop there.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6
diff changeset
49 } ngx_http_upstream_keepalive_cache_t;
565939797f5c Keepalive: fix connection closing and avoid for loop there.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6
diff changeset
50
565939797f5c Keepalive: fix connection closing and avoid for loop there.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6
diff changeset
51
0
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
52 static ngx_int_t ngx_http_upstream_init_keepalive_peer(ngx_http_request_t *r,
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
53 ngx_http_upstream_srv_conf_t *us);
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
54 static ngx_int_t ngx_http_upstream_get_keepalive_peer(ngx_peer_connection_t *pc,
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
55 void *data);
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
56 static void ngx_http_upstream_free_keepalive_peer(ngx_peer_connection_t *pc,
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
57 void *data, ngx_uint_t state);
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
58
1
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
59 static void ngx_http_upstream_keepalive_dummy_handler(ngx_event_t *ev);
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
60 static void ngx_http_upstream_keepalive_close_handler(ngx_event_t *ev);
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
61
0
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
62 static void *ngx_http_upstream_keepalive_create_conf(ngx_conf_t *cf);
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
63 static char *ngx_http_upstream_keepalive(ngx_conf_t *cf, ngx_command_t *cmd,
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
64 void *conf);
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
65
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
66
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
67 static ngx_command_t ngx_http_upstream_keepalive_commands[] = {
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
68
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
69 { ngx_string("keepalive"),
6
bef88ba0b378 Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5
diff changeset
70 NGX_HTTP_UPS_CONF|NGX_CONF_TAKE12,
0
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
71 ngx_http_upstream_keepalive,
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
72 0,
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
73 0,
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
74 NULL },
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
75
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
76 ngx_null_command
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
77 };
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
78
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
79
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
80 static ngx_http_module_t ngx_http_upstream_keepalive_module_ctx = {
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
81 NULL, /* preconfiguration */
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
82 NULL, /* postconfiguration */
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
83
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
84 NULL, /* create main configuration */
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
85 NULL, /* init main configuration */
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
86
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
87 ngx_http_upstream_keepalive_create_conf, /* create server configuration */
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
88 NULL, /* merge server configuration */
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
89
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
90 NULL, /* create location configuration */
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
91 NULL /* merge location configuration */
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
92 };
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
93
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
94
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
95 ngx_module_t ngx_http_upstream_keepalive_module = {
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
96 NGX_MODULE_V1,
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
97 &ngx_http_upstream_keepalive_module_ctx, /* module context */
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
98 ngx_http_upstream_keepalive_commands, /* module directives */
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
99 NGX_HTTP_MODULE, /* module type */
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
100 NULL, /* init master */
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
101 NULL, /* init module */
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
102 NULL, /* init process */
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
103 NULL, /* init thread */
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
104 NULL, /* exit thread */
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
105 NULL, /* exit process */
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
106 NULL, /* exit master */
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
107 NGX_MODULE_V1_PADDING
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
108 };
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
109
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
110
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
111 ngx_int_t
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
112 ngx_http_upstream_init_keepalive(ngx_conf_t *cf,
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
113 ngx_http_upstream_srv_conf_t *us)
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
114 {
2
8545bbda9e4b Keepalive: reimplement using queues.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
115 ngx_uint_t i;
0
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
116 ngx_http_upstream_keepalive_srv_conf_t *kcf;
2
8545bbda9e4b Keepalive: reimplement using queues.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
117 ngx_http_upstream_keepalive_cache_t *cached;
0
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
118
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
119 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, cf->log, 0,
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
120 "init keepalive");
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
121
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
122 kcf = ngx_http_conf_upstream_srv_conf(us,
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
123 ngx_http_upstream_keepalive_module);
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
124
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
125 if (kcf->original_init_upstream(cf, us) != NGX_OK) {
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
126 return NGX_ERROR;
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
127 }
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
128
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
129 kcf->original_init_peer = us->peer.init;
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
130
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
131 us->peer.init = ngx_http_upstream_init_keepalive_peer;
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
132
2
8545bbda9e4b Keepalive: reimplement using queues.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
133 /* allocate cache items and add to free queue */
8545bbda9e4b Keepalive: reimplement using queues.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
134
8545bbda9e4b Keepalive: reimplement using queues.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
135 cached = ngx_pcalloc(cf->pool,
8545bbda9e4b Keepalive: reimplement using queues.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
136 sizeof(ngx_http_upstream_keepalive_cache_t) * kcf->max_cached);
8545bbda9e4b Keepalive: reimplement using queues.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
137 if (cached == NULL) {
1
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
138 return NGX_ERROR;
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
139 }
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
140
2
8545bbda9e4b Keepalive: reimplement using queues.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
141 ngx_queue_init(&kcf->cache);
8545bbda9e4b Keepalive: reimplement using queues.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
142 ngx_queue_init(&kcf->free);
8545bbda9e4b Keepalive: reimplement using queues.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
143
8545bbda9e4b Keepalive: reimplement using queues.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
144 for (i = 0; i < kcf->max_cached; i++) {
8545bbda9e4b Keepalive: reimplement using queues.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
145 ngx_queue_insert_head(&kcf->free, &cached[i].queue);
8
565939797f5c Keepalive: fix connection closing and avoid for loop there.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6
diff changeset
146 cached[i].conf = kcf;
2
8545bbda9e4b Keepalive: reimplement using queues.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
147 }
1
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
148
0
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
149 return NGX_OK;
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
150 }
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
151
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
152
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
153 static ngx_int_t
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
154 ngx_http_upstream_init_keepalive_peer(ngx_http_request_t *r,
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
155 ngx_http_upstream_srv_conf_t *us)
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
156 {
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
157 ngx_http_upstream_keepalive_peer_data_t *kp;
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
158 ngx_http_upstream_keepalive_srv_conf_t *kcf;
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
159
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
160 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
161 "init keepalive peer");
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
162
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
163 kcf = ngx_http_conf_upstream_srv_conf(us,
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
164 ngx_http_upstream_keepalive_module);
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
165
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
166 kp = ngx_palloc(r->pool, sizeof(ngx_http_upstream_keepalive_peer_data_t));
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
167 if (kp == NULL) {
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
168 return NGX_ERROR;
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
169 }
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
170
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
171 if (kcf->original_init_peer(r, us) != NGX_OK) {
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
172 return NGX_ERROR;
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
173 }
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
174
1
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
175 kp->conf = kcf;
11
15530a464dba Keepalive: don't cache invalid connections.
Maxim Dounin <mdounin@mdounin.ru>
parents: 10
diff changeset
176 kp->upstream = r->upstream;
0
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
177 kp->data = r->upstream->peer.data;
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
178 kp->original_get_peer = r->upstream->peer.get;
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
179 kp->original_free_peer = r->upstream->peer.free;
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
180
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
181 r->upstream->peer.data = kp;
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
182 r->upstream->peer.get = ngx_http_upstream_get_keepalive_peer;
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
183 r->upstream->peer.free = ngx_http_upstream_free_keepalive_peer;
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
184
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
185 return NGX_OK;
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
186 }
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
187
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
188
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
189 static ngx_int_t
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
190 ngx_http_upstream_get_keepalive_peer(ngx_peer_connection_t *pc, void *data)
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
191 {
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
192 ngx_http_upstream_keepalive_peer_data_t *kp = data;
2
8545bbda9e4b Keepalive: reimplement using queues.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
193 ngx_http_upstream_keepalive_cache_t *item;
0
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
194
6
bef88ba0b378 Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5
diff changeset
195 ngx_int_t rc;
bef88ba0b378 Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5
diff changeset
196 ngx_queue_t *q, *cache;
5
e7d1b49e0611 Keepalive: style.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4
diff changeset
197 ngx_connection_t *c;
1
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
198
0
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
199 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, pc->log, 0,
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
200 "get keepalive peer");
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
201
11
15530a464dba Keepalive: don't cache invalid connections.
Maxim Dounin <mdounin@mdounin.ru>
parents: 10
diff changeset
202 kp->failed = 0;
15530a464dba Keepalive: don't cache invalid connections.
Maxim Dounin <mdounin@mdounin.ru>
parents: 10
diff changeset
203
6
bef88ba0b378 Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5
diff changeset
204 /* single pool of cached connections */
1
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
205
6
bef88ba0b378 Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5
diff changeset
206 if (kp->conf->single && !ngx_queue_empty(&kp->conf->cache)) {
2
8545bbda9e4b Keepalive: reimplement using queues.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
207
8545bbda9e4b Keepalive: reimplement using queues.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
208 q = ngx_queue_head(&kp->conf->cache);
8545bbda9e4b Keepalive: reimplement using queues.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
209 ngx_queue_remove(q);
1
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
210
2
8545bbda9e4b Keepalive: reimplement using queues.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
211 item = ngx_queue_data(q, ngx_http_upstream_keepalive_cache_t, queue);
8545bbda9e4b Keepalive: reimplement using queues.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
212 c = item->connection;
8545bbda9e4b Keepalive: reimplement using queues.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
213
8545bbda9e4b Keepalive: reimplement using queues.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
214 ngx_queue_insert_head(&kp->conf->free, q);
1
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
215
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
216 c->idle = 0;
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
217 c->log = pc->log;
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
218 c->read->log = pc->log;
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
219 c->write->log = pc->log;
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
220
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
221 pc->connection = c;
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
222 pc->cached = 1;
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
223
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
224 return NGX_DONE;
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
225 }
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
226
6
bef88ba0b378 Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5
diff changeset
227 rc = kp->original_get_peer(pc, kp->data);
bef88ba0b378 Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5
diff changeset
228
bef88ba0b378 Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5
diff changeset
229 if (kp->conf->single || rc != NGX_OK) {
bef88ba0b378 Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5
diff changeset
230 return rc;
bef88ba0b378 Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5
diff changeset
231 }
bef88ba0b378 Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5
diff changeset
232
bef88ba0b378 Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5
diff changeset
233 /* search cache for suitable connection */
bef88ba0b378 Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5
diff changeset
234
bef88ba0b378 Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5
diff changeset
235 cache = &kp->conf->cache;
bef88ba0b378 Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5
diff changeset
236
bef88ba0b378 Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5
diff changeset
237 for (q = ngx_queue_head(cache);
bef88ba0b378 Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5
diff changeset
238 q != ngx_queue_sentinel(cache);
bef88ba0b378 Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5
diff changeset
239 q = ngx_queue_next(q))
bef88ba0b378 Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5
diff changeset
240 {
bef88ba0b378 Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5
diff changeset
241 item = ngx_queue_data(q, ngx_http_upstream_keepalive_cache_t, queue);
bef88ba0b378 Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5
diff changeset
242 c = item->connection;
bef88ba0b378 Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5
diff changeset
243
bef88ba0b378 Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5
diff changeset
244 if (ngx_memn2cmp((u_char *) &item->sockaddr, (u_char *) pc->sockaddr,
bef88ba0b378 Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5
diff changeset
245 item->socklen, pc->socklen)
bef88ba0b378 Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5
diff changeset
246 == 0)
bef88ba0b378 Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5
diff changeset
247 {
bef88ba0b378 Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5
diff changeset
248 ngx_queue_remove(q);
bef88ba0b378 Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5
diff changeset
249 ngx_queue_insert_head(&kp->conf->free, q);
bef88ba0b378 Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5
diff changeset
250
bef88ba0b378 Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5
diff changeset
251 c->idle = 0;
bef88ba0b378 Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5
diff changeset
252 c->log = pc->log;
bef88ba0b378 Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5
diff changeset
253 c->read->log = pc->log;
bef88ba0b378 Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5
diff changeset
254 c->write->log = pc->log;
bef88ba0b378 Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5
diff changeset
255
bef88ba0b378 Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5
diff changeset
256 pc->connection = c;
bef88ba0b378 Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5
diff changeset
257 pc->cached = 1;
bef88ba0b378 Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5
diff changeset
258
bef88ba0b378 Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5
diff changeset
259 return NGX_DONE;
bef88ba0b378 Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5
diff changeset
260 }
bef88ba0b378 Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5
diff changeset
261 }
bef88ba0b378 Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5
diff changeset
262
bef88ba0b378 Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5
diff changeset
263 return NGX_OK;
0
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
264 }
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
265
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
266
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
267 static void
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
268 ngx_http_upstream_free_keepalive_peer(ngx_peer_connection_t *pc, void *data,
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
269 ngx_uint_t state)
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
270 {
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
271 ngx_http_upstream_keepalive_peer_data_t *kp = data;
2
8545bbda9e4b Keepalive: reimplement using queues.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
272 ngx_http_upstream_keepalive_cache_t *item;
0
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
273
11
15530a464dba Keepalive: don't cache invalid connections.
Maxim Dounin <mdounin@mdounin.ru>
parents: 10
diff changeset
274 ngx_uint_t status;
15530a464dba Keepalive: don't cache invalid connections.
Maxim Dounin <mdounin@mdounin.ru>
parents: 10
diff changeset
275 ngx_queue_t *q;
15530a464dba Keepalive: don't cache invalid connections.
Maxim Dounin <mdounin@mdounin.ru>
parents: 10
diff changeset
276 ngx_connection_t *c;
15530a464dba Keepalive: don't cache invalid connections.
Maxim Dounin <mdounin@mdounin.ru>
parents: 10
diff changeset
277 ngx_http_upstream_t *u;
1
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
278
0
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
279 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, pc->log, 0,
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
280 "free keepalive peer");
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
281
11
15530a464dba Keepalive: don't cache invalid connections.
Maxim Dounin <mdounin@mdounin.ru>
parents: 10
diff changeset
282 /* remember failed state - peer.free() may be called more than once */
15530a464dba Keepalive: don't cache invalid connections.
Maxim Dounin <mdounin@mdounin.ru>
parents: 10
diff changeset
283
15530a464dba Keepalive: don't cache invalid connections.
Maxim Dounin <mdounin@mdounin.ru>
parents: 10
diff changeset
284 if (state & NGX_PEER_FAILED) {
15530a464dba Keepalive: don't cache invalid connections.
Maxim Dounin <mdounin@mdounin.ru>
parents: 10
diff changeset
285 kp->failed = 1;
15530a464dba Keepalive: don't cache invalid connections.
Maxim Dounin <mdounin@mdounin.ru>
parents: 10
diff changeset
286 }
15530a464dba Keepalive: don't cache invalid connections.
Maxim Dounin <mdounin@mdounin.ru>
parents: 10
diff changeset
287
15530a464dba Keepalive: don't cache invalid connections.
Maxim Dounin <mdounin@mdounin.ru>
parents: 10
diff changeset
288 /*
15530a464dba Keepalive: don't cache invalid connections.
Maxim Dounin <mdounin@mdounin.ru>
parents: 10
diff changeset
289 * cache valid connections
15530a464dba Keepalive: don't cache invalid connections.
Maxim Dounin <mdounin@mdounin.ru>
parents: 10
diff changeset
290 *
15530a464dba Keepalive: don't cache invalid connections.
Maxim Dounin <mdounin@mdounin.ru>
parents: 10
diff changeset
291 * For memcached this means status either 404 or 200. For status 200 we
15530a464dba Keepalive: don't cache invalid connections.
Maxim Dounin <mdounin@mdounin.ru>
parents: 10
diff changeset
292 * should also check if all response body was read (u->length == 0) and
15530a464dba Keepalive: don't cache invalid connections.
Maxim Dounin <mdounin@mdounin.ru>
parents: 10
diff changeset
293 * make sure that u->length is valid (we use u->header_sent flag to test
15530a464dba Keepalive: don't cache invalid connections.
Maxim Dounin <mdounin@mdounin.ru>
parents: 10
diff changeset
294 * this). Memcached is the only supported protocol for now.
15530a464dba Keepalive: don't cache invalid connections.
Maxim Dounin <mdounin@mdounin.ru>
parents: 10
diff changeset
295 *
15530a464dba Keepalive: don't cache invalid connections.
Maxim Dounin <mdounin@mdounin.ru>
parents: 10
diff changeset
296 * Some notes on other possibilities (incomplete):
15530a464dba Keepalive: don't cache invalid connections.
Maxim Dounin <mdounin@mdounin.ru>
parents: 10
diff changeset
297 *
15530a464dba Keepalive: don't cache invalid connections.
Maxim Dounin <mdounin@mdounin.ru>
parents: 10
diff changeset
298 * fastcgi: u->pipe->upstream_done should be sufficient
15530a464dba Keepalive: don't cache invalid connections.
Maxim Dounin <mdounin@mdounin.ru>
parents: 10
diff changeset
299 *
15530a464dba Keepalive: don't cache invalid connections.
Maxim Dounin <mdounin@mdounin.ru>
parents: 10
diff changeset
300 * proxy buffered: u->pipe->upstream_done, 304 replies, replies to head
15530a464dba Keepalive: don't cache invalid connections.
Maxim Dounin <mdounin@mdounin.ru>
parents: 10
diff changeset
301 * requests (see RFC 2616, 4.4 Message Length)
15530a464dba Keepalive: don't cache invalid connections.
Maxim Dounin <mdounin@mdounin.ru>
parents: 10
diff changeset
302 *
15530a464dba Keepalive: don't cache invalid connections.
Maxim Dounin <mdounin@mdounin.ru>
parents: 10
diff changeset
303 * proxy unbuffered: 200 as for memcached (with u->length == 0 and
15530a464dba Keepalive: don't cache invalid connections.
Maxim Dounin <mdounin@mdounin.ru>
parents: 10
diff changeset
304 * header_sent), 304, replies to head requests
15530a464dba Keepalive: don't cache invalid connections.
Maxim Dounin <mdounin@mdounin.ru>
parents: 10
diff changeset
305 *
15530a464dba Keepalive: don't cache invalid connections.
Maxim Dounin <mdounin@mdounin.ru>
parents: 10
diff changeset
306 * subrequest_in_memory: won't work as of now
15530a464dba Keepalive: don't cache invalid connections.
Maxim Dounin <mdounin@mdounin.ru>
parents: 10
diff changeset
307 *
15530a464dba Keepalive: don't cache invalid connections.
Maxim Dounin <mdounin@mdounin.ru>
parents: 10
diff changeset
308 * TODO: move this logic to protocol modules (NGX_PEER_KEEPALIVE?)
15530a464dba Keepalive: don't cache invalid connections.
Maxim Dounin <mdounin@mdounin.ru>
parents: 10
diff changeset
309 */
15530a464dba Keepalive: don't cache invalid connections.
Maxim Dounin <mdounin@mdounin.ru>
parents: 10
diff changeset
310
15530a464dba Keepalive: don't cache invalid connections.
Maxim Dounin <mdounin@mdounin.ru>
parents: 10
diff changeset
311 u = kp->upstream;
15530a464dba Keepalive: don't cache invalid connections.
Maxim Dounin <mdounin@mdounin.ru>
parents: 10
diff changeset
312 status = u->headers_in.status_n;
15530a464dba Keepalive: don't cache invalid connections.
Maxim Dounin <mdounin@mdounin.ru>
parents: 10
diff changeset
313
15530a464dba Keepalive: don't cache invalid connections.
Maxim Dounin <mdounin@mdounin.ru>
parents: 10
diff changeset
314 if (!kp->failed
15530a464dba Keepalive: don't cache invalid connections.
Maxim Dounin <mdounin@mdounin.ru>
parents: 10
diff changeset
315 && pc->connection != NULL
14
28af4b0b32c1 Keepalive: experimental fastcgi support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 11
diff changeset
316 #if (NGX_UPSTREAM_KEEPALIVE_PATCHED)
28af4b0b32c1 Keepalive: experimental fastcgi support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 11
diff changeset
317 && u->keepalive)
28af4b0b32c1 Keepalive: experimental fastcgi support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 11
diff changeset
318 #else
11
15530a464dba Keepalive: don't cache invalid connections.
Maxim Dounin <mdounin@mdounin.ru>
parents: 10
diff changeset
319 && (status == NGX_HTTP_NOT_FOUND
15530a464dba Keepalive: don't cache invalid connections.
Maxim Dounin <mdounin@mdounin.ru>
parents: 10
diff changeset
320 || (status == NGX_HTTP_OK && u->header_sent && u->length == 0)))
14
28af4b0b32c1 Keepalive: experimental fastcgi support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 11
diff changeset
321 #endif
1
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
322 {
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
323 c = pc->connection;
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
324
10
06bd0e50e696 Keepalive: log saving connection.
Maxim Dounin <mdounin@mdounin.ru>
parents: 8
diff changeset
325 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, pc->log, 0,
06bd0e50e696 Keepalive: log saving connection.
Maxim Dounin <mdounin@mdounin.ru>
parents: 8
diff changeset
326 "free keepalive peer: saving connection %p", c);
06bd0e50e696 Keepalive: log saving connection.
Maxim Dounin <mdounin@mdounin.ru>
parents: 8
diff changeset
327
3
42e64900483b Keepalive: always save connections to cache.
Maxim Dounin <mdounin@mdounin.ru>
parents: 2
diff changeset
328 if (ngx_queue_empty(&kp->conf->free)) {
42e64900483b Keepalive: always save connections to cache.
Maxim Dounin <mdounin@mdounin.ru>
parents: 2
diff changeset
329
42e64900483b Keepalive: always save connections to cache.
Maxim Dounin <mdounin@mdounin.ru>
parents: 2
diff changeset
330 q = ngx_queue_last(&kp->conf->cache);
42e64900483b Keepalive: always save connections to cache.
Maxim Dounin <mdounin@mdounin.ru>
parents: 2
diff changeset
331 ngx_queue_remove(q);
42e64900483b Keepalive: always save connections to cache.
Maxim Dounin <mdounin@mdounin.ru>
parents: 2
diff changeset
332
42e64900483b Keepalive: always save connections to cache.
Maxim Dounin <mdounin@mdounin.ru>
parents: 2
diff changeset
333 item = ngx_queue_data(q, ngx_http_upstream_keepalive_cache_t,
42e64900483b Keepalive: always save connections to cache.
Maxim Dounin <mdounin@mdounin.ru>
parents: 2
diff changeset
334 queue);
42e64900483b Keepalive: always save connections to cache.
Maxim Dounin <mdounin@mdounin.ru>
parents: 2
diff changeset
335
42e64900483b Keepalive: always save connections to cache.
Maxim Dounin <mdounin@mdounin.ru>
parents: 2
diff changeset
336 ngx_close_connection(item->connection);
2
8545bbda9e4b Keepalive: reimplement using queues.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
337
3
42e64900483b Keepalive: always save connections to cache.
Maxim Dounin <mdounin@mdounin.ru>
parents: 2
diff changeset
338 } else {
42e64900483b Keepalive: always save connections to cache.
Maxim Dounin <mdounin@mdounin.ru>
parents: 2
diff changeset
339 q = ngx_queue_head(&kp->conf->free);
42e64900483b Keepalive: always save connections to cache.
Maxim Dounin <mdounin@mdounin.ru>
parents: 2
diff changeset
340 ngx_queue_remove(q);
42e64900483b Keepalive: always save connections to cache.
Maxim Dounin <mdounin@mdounin.ru>
parents: 2
diff changeset
341
42e64900483b Keepalive: always save connections to cache.
Maxim Dounin <mdounin@mdounin.ru>
parents: 2
diff changeset
342 item = ngx_queue_data(q, ngx_http_upstream_keepalive_cache_t,
42e64900483b Keepalive: always save connections to cache.
Maxim Dounin <mdounin@mdounin.ru>
parents: 2
diff changeset
343 queue);
42e64900483b Keepalive: always save connections to cache.
Maxim Dounin <mdounin@mdounin.ru>
parents: 2
diff changeset
344 }
42e64900483b Keepalive: always save connections to cache.
Maxim Dounin <mdounin@mdounin.ru>
parents: 2
diff changeset
345
2
8545bbda9e4b Keepalive: reimplement using queues.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
346 item->connection = c;
8545bbda9e4b Keepalive: reimplement using queues.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
347 ngx_queue_insert_head(&kp->conf->cache, q);
8545bbda9e4b Keepalive: reimplement using queues.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
348
1
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
349 pc->connection = NULL;
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
350
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
351 if (c->read->timer_set) {
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
352 ngx_del_timer(c->read);
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
353 }
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
354 if (c->write->timer_set) {
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
355 ngx_del_timer(c->write);
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
356 }
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
357
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
358 c->write->handler = ngx_http_upstream_keepalive_dummy_handler;
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
359 c->read->handler = ngx_http_upstream_keepalive_close_handler;
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
360
8
565939797f5c Keepalive: fix connection closing and avoid for loop there.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6
diff changeset
361 c->data = item;
1
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
362 c->idle = 1;
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
363 c->log = ngx_cycle->log;
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
364 c->read->log = ngx_cycle->log;
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
365 c->write->log = ngx_cycle->log;
6
bef88ba0b378 Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5
diff changeset
366
bef88ba0b378 Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5
diff changeset
367 item->socklen = pc->socklen;
bef88ba0b378 Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5
diff changeset
368 ngx_memcpy(&item->sockaddr, pc->sockaddr, pc->socklen);
1
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
369 }
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
370
0
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
371 return kp->original_free_peer(pc, kp->data, state);
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
372 }
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
373
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
374
1
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
375 static void
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
376 ngx_http_upstream_keepalive_dummy_handler(ngx_event_t *ev)
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
377 {
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
378 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, ev->log, 0,
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
379 "keepalive dummy handler");
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
380 }
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
381
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
382
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
383 static void
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
384 ngx_http_upstream_keepalive_close_handler(ngx_event_t *ev)
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
385 {
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
386 ngx_http_upstream_keepalive_srv_conf_t *conf;
2
8545bbda9e4b Keepalive: reimplement using queues.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
387 ngx_http_upstream_keepalive_cache_t *item;
1
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
388
21
9a4ee6fe1c6d Keepalive: avoid closing upstream connection on stale events.
Maxim Dounin <mdounin@mdounin.ru>
parents: 18
diff changeset
389 int n;
9a4ee6fe1c6d Keepalive: avoid closing upstream connection on stale events.
Maxim Dounin <mdounin@mdounin.ru>
parents: 18
diff changeset
390 char buf[1];
1
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
391 ngx_connection_t *c;
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
392
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
393 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, ev->log, 0,
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
394 "keepalive close handler");
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
395
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
396 c = ev->data;
21
9a4ee6fe1c6d Keepalive: avoid closing upstream connection on stale events.
Maxim Dounin <mdounin@mdounin.ru>
parents: 18
diff changeset
397
24
2ee28064a04a Keepalive: correctly close connections on gracefull shutdown.
Maxim Dounin <mdounin@mdounin.ru>
parents: 21
diff changeset
398 if (c->close) {
2ee28064a04a Keepalive: correctly close connections on gracefull shutdown.
Maxim Dounin <mdounin@mdounin.ru>
parents: 21
diff changeset
399 goto close;
2ee28064a04a Keepalive: correctly close connections on gracefull shutdown.
Maxim Dounin <mdounin@mdounin.ru>
parents: 21
diff changeset
400 }
2ee28064a04a Keepalive: correctly close connections on gracefull shutdown.
Maxim Dounin <mdounin@mdounin.ru>
parents: 21
diff changeset
401
21
9a4ee6fe1c6d Keepalive: avoid closing upstream connection on stale events.
Maxim Dounin <mdounin@mdounin.ru>
parents: 18
diff changeset
402 n = recv(c->fd, buf, 1, MSG_PEEK);
9a4ee6fe1c6d Keepalive: avoid closing upstream connection on stale events.
Maxim Dounin <mdounin@mdounin.ru>
parents: 18
diff changeset
403
9a4ee6fe1c6d Keepalive: avoid closing upstream connection on stale events.
Maxim Dounin <mdounin@mdounin.ru>
parents: 18
diff changeset
404 if (n == -1 && ngx_socket_errno == NGX_EAGAIN) {
9a4ee6fe1c6d Keepalive: avoid closing upstream connection on stale events.
Maxim Dounin <mdounin@mdounin.ru>
parents: 18
diff changeset
405 /* stale event */
9a4ee6fe1c6d Keepalive: avoid closing upstream connection on stale events.
Maxim Dounin <mdounin@mdounin.ru>
parents: 18
diff changeset
406
9a4ee6fe1c6d Keepalive: avoid closing upstream connection on stale events.
Maxim Dounin <mdounin@mdounin.ru>
parents: 18
diff changeset
407 if (ngx_handle_read_event(c->read, 0) != NGX_OK) {
9a4ee6fe1c6d Keepalive: avoid closing upstream connection on stale events.
Maxim Dounin <mdounin@mdounin.ru>
parents: 18
diff changeset
408 goto close;
9a4ee6fe1c6d Keepalive: avoid closing upstream connection on stale events.
Maxim Dounin <mdounin@mdounin.ru>
parents: 18
diff changeset
409 }
9a4ee6fe1c6d Keepalive: avoid closing upstream connection on stale events.
Maxim Dounin <mdounin@mdounin.ru>
parents: 18
diff changeset
410
9a4ee6fe1c6d Keepalive: avoid closing upstream connection on stale events.
Maxim Dounin <mdounin@mdounin.ru>
parents: 18
diff changeset
411 return;
9a4ee6fe1c6d Keepalive: avoid closing upstream connection on stale events.
Maxim Dounin <mdounin@mdounin.ru>
parents: 18
diff changeset
412 }
9a4ee6fe1c6d Keepalive: avoid closing upstream connection on stale events.
Maxim Dounin <mdounin@mdounin.ru>
parents: 18
diff changeset
413
9a4ee6fe1c6d Keepalive: avoid closing upstream connection on stale events.
Maxim Dounin <mdounin@mdounin.ru>
parents: 18
diff changeset
414 close:
9a4ee6fe1c6d Keepalive: avoid closing upstream connection on stale events.
Maxim Dounin <mdounin@mdounin.ru>
parents: 18
diff changeset
415
8
565939797f5c Keepalive: fix connection closing and avoid for loop there.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6
diff changeset
416 item = c->data;
565939797f5c Keepalive: fix connection closing and avoid for loop there.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6
diff changeset
417 conf = item->conf;
1
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
418
8
565939797f5c Keepalive: fix connection closing and avoid for loop there.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6
diff changeset
419 ngx_queue_remove(&item->queue);
565939797f5c Keepalive: fix connection closing and avoid for loop there.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6
diff changeset
420 ngx_close_connection(item->connection);
565939797f5c Keepalive: fix connection closing and avoid for loop there.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6
diff changeset
421 ngx_queue_insert_head(&conf->free, &item->queue);
1
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
422 }
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
423
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
424
0
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
425 static void *
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
426 ngx_http_upstream_keepalive_create_conf(ngx_conf_t *cf)
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
427 {
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
428 ngx_http_upstream_keepalive_srv_conf_t *conf;
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
429
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
430 conf = ngx_pcalloc(cf->pool,
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
431 sizeof(ngx_http_upstream_keepalive_srv_conf_t));
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
432 if (conf == NULL) {
18
2054159546d0 Keepalive: fix create_conf to return NULL on errors.
Maxim Dounin <mdounin@mdounin.ru>
parents: 14
diff changeset
433 return NULL;
0
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
434 }
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
435
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
436 /*
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
437 * set by ngx_pcalloc():
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
438 *
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
439 * conf->original_init_upstream = NULL;
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
440 * conf->original_init_peer = NULL;
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
441 */
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
442
1
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
443 conf->max_cached = 1;
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
444
0
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
445 return conf;
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
446 }
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
447
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
448
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
449 static char *
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
450 ngx_http_upstream_keepalive(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
451 {
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
452 ngx_http_upstream_srv_conf_t *uscf;
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
453 ngx_http_upstream_keepalive_srv_conf_t *kcf;
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
454
1
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
455 ngx_int_t n;
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
456 ngx_str_t *value;
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
457 ngx_uint_t i;
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
458
0
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
459 uscf = ngx_http_conf_get_module_srv_conf(cf, ngx_http_upstream_module);
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
460
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
461 kcf = ngx_http_conf_upstream_srv_conf(uscf,
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
462 ngx_http_upstream_keepalive_module);
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
463
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
464 kcf->original_init_upstream = uscf->peer.init_upstream
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
465 ? uscf->peer.init_upstream
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
466 : ngx_http_upstream_init_round_robin;
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
467
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
468 uscf->peer.init_upstream = ngx_http_upstream_init_keepalive;
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
469
1
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
470 /* read options */
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
471
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
472 value = cf->args->elts;
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
473
6
bef88ba0b378 Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5
diff changeset
474 n = ngx_atoi(value[1].data, value[1].len);
1
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
475
6
bef88ba0b378 Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5
diff changeset
476 if (n == NGX_ERROR || n == 0) {
bef88ba0b378 Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5
diff changeset
477 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
bef88ba0b378 Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5
diff changeset
478 "invalid value \"%V\" in \"%V\" directive",
bef88ba0b378 Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5
diff changeset
479 &value[1], &cmd->name);
bef88ba0b378 Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5
diff changeset
480 return NGX_CONF_ERROR;
bef88ba0b378 Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5
diff changeset
481 }
1
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
482
6
bef88ba0b378 Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5
diff changeset
483 kcf->max_cached = n;
bef88ba0b378 Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5
diff changeset
484
bef88ba0b378 Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5
diff changeset
485 for (i = 2; i < cf->args->nelts; i++) {
bef88ba0b378 Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5
diff changeset
486
bef88ba0b378 Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5
diff changeset
487 if (ngx_strcmp(value[i].data, "single") == 0) {
bef88ba0b378 Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5
diff changeset
488
bef88ba0b378 Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5
diff changeset
489 kcf->single = 1;
1
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
490
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
491 continue;
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
492 }
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
493
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
494 goto invalid;
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
495 }
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
496
0
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
497 return NGX_CONF_OK;
1
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
498
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
499 invalid:
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
500
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
501 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
502 "invalid parameter \"%V\"", &value[i]);
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
503
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
504 return NGX_CONF_ERROR;
0
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
505 }