annotate ngx_http_upstream_keepalive_module.c @ 6:bef88ba0b378

Keepalive: distinguish between upstream servers by default. Option 'single' may be used if single pool of connections desired for some reason.
author Maxim Dounin <mdounin@mdounin.ru>
date Fri, 24 Oct 2008 02:03:39 +0400
parents e7d1b49e0611
children 565939797f5c
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 {
8545bbda9e4b Keepalive: reimplement using queues.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
13 ngx_queue_t queue;
8545bbda9e4b Keepalive: reimplement using queues.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
14 ngx_connection_t *connection;
6
bef88ba0b378 Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5
diff changeset
15
bef88ba0b378 Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5
diff changeset
16 socklen_t socklen;
bef88ba0b378 Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5
diff changeset
17 struct sockaddr_storage sockaddr;
bef88ba0b378 Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5
diff changeset
18
2
8545bbda9e4b Keepalive: reimplement using queues.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
19 } ngx_http_upstream_keepalive_cache_t;
0
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
20
5
e7d1b49e0611 Keepalive: style.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4
diff changeset
21
0
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
22 typedef struct {
1
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
23 ngx_uint_t max_cached;
6
bef88ba0b378 Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5
diff changeset
24 ngx_uint_t single; /* unsigned:1 */
1
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
25
2
8545bbda9e4b Keepalive: reimplement using queues.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
26 ngx_queue_t cache;
8545bbda9e4b Keepalive: reimplement using queues.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
27 ngx_queue_t free;
0
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
28
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
29 ngx_http_upstream_init_pt original_init_upstream;
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
30 ngx_http_upstream_init_peer_pt original_init_peer;
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_http_upstream_keepalive_srv_conf_t;
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
33
5
e7d1b49e0611 Keepalive: style.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4
diff changeset
34
0
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
35 typedef struct {
1
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
36 ngx_http_upstream_keepalive_srv_conf_t *conf;
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
37
0
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
38 void *data;
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
39
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
40 ngx_event_get_peer_pt original_get_peer;
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
41 ngx_event_free_peer_pt original_free_peer;
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
42
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
43 } ngx_http_upstream_keepalive_peer_data_t;
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
44
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
45
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
46 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
47 ngx_http_upstream_srv_conf_t *us);
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
48 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
49 void *data);
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
50 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
51 void *data, ngx_uint_t state);
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
52
1
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
53 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
54 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
55
0
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
56 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
57 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
58 void *conf);
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
59
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
60
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
61 static ngx_command_t ngx_http_upstream_keepalive_commands[] = {
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
62
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
63 { ngx_string("keepalive"),
6
bef88ba0b378 Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5
diff changeset
64 NGX_HTTP_UPS_CONF|NGX_CONF_TAKE12,
0
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
65 ngx_http_upstream_keepalive,
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
66 0,
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
67 0,
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
68 NULL },
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
69
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
70 ngx_null_command
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
71 };
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
72
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
73
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
74 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
75 NULL, /* preconfiguration */
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
76 NULL, /* postconfiguration */
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 NULL, /* create main configuration */
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
79 NULL, /* init main configuration */
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
80
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
81 ngx_http_upstream_keepalive_create_conf, /* create server configuration */
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
82 NULL, /* merge server configuration */
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 location configuration */
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
85 NULL /* merge location 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
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
88
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
89 ngx_module_t ngx_http_upstream_keepalive_module = {
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
90 NGX_MODULE_V1,
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
91 &ngx_http_upstream_keepalive_module_ctx, /* module context */
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
92 ngx_http_upstream_keepalive_commands, /* module directives */
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
93 NGX_HTTP_MODULE, /* module type */
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
94 NULL, /* init master */
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
95 NULL, /* init module */
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
96 NULL, /* init process */
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
97 NULL, /* init thread */
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
98 NULL, /* exit thread */
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
99 NULL, /* exit process */
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
100 NULL, /* exit master */
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
101 NGX_MODULE_V1_PADDING
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
102 };
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
103
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
104
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
105 ngx_int_t
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
106 ngx_http_upstream_init_keepalive(ngx_conf_t *cf,
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
107 ngx_http_upstream_srv_conf_t *us)
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
108 {
2
8545bbda9e4b Keepalive: reimplement using queues.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
109 ngx_uint_t i;
0
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
110 ngx_http_upstream_keepalive_srv_conf_t *kcf;
2
8545bbda9e4b Keepalive: reimplement using queues.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
111 ngx_http_upstream_keepalive_cache_t *cached;
0
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
112
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
113 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, cf->log, 0,
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
114 "init keepalive");
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
115
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
116 kcf = ngx_http_conf_upstream_srv_conf(us,
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
117 ngx_http_upstream_keepalive_module);
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 if (kcf->original_init_upstream(cf, us) != NGX_OK) {
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
120 return NGX_ERROR;
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
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
123 kcf->original_init_peer = us->peer.init;
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 us->peer.init = ngx_http_upstream_init_keepalive_peer;
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
126
2
8545bbda9e4b Keepalive: reimplement using queues.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
127 /* allocate cache items and add to free queue */
8545bbda9e4b Keepalive: reimplement using queues.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
128
8545bbda9e4b Keepalive: reimplement using queues.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
129 cached = ngx_pcalloc(cf->pool,
8545bbda9e4b Keepalive: reimplement using queues.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
130 sizeof(ngx_http_upstream_keepalive_cache_t) * kcf->max_cached);
8545bbda9e4b Keepalive: reimplement using queues.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
131 if (cached == NULL) {
1
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
132 return NGX_ERROR;
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
133 }
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
134
2
8545bbda9e4b Keepalive: reimplement using queues.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
135 ngx_queue_init(&kcf->cache);
8545bbda9e4b Keepalive: reimplement using queues.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
136 ngx_queue_init(&kcf->free);
8545bbda9e4b Keepalive: reimplement using queues.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
137
8545bbda9e4b Keepalive: reimplement using queues.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
138 for (i = 0; i < kcf->max_cached; i++) {
8545bbda9e4b Keepalive: reimplement using queues.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
139 ngx_queue_insert_head(&kcf->free, &cached[i].queue);
8545bbda9e4b Keepalive: reimplement using queues.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
140 }
1
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
141
0
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
142 return NGX_OK;
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
143 }
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
144
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
145
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
146 static ngx_int_t
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
147 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
148 ngx_http_upstream_srv_conf_t *us)
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
149 {
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
150 ngx_http_upstream_keepalive_peer_data_t *kp;
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
151 ngx_http_upstream_keepalive_srv_conf_t *kcf;
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 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
154 "init keepalive peer");
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
155
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
156 kcf = ngx_http_conf_upstream_srv_conf(us,
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
157 ngx_http_upstream_keepalive_module);
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
158
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
159 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
160 if (kp == NULL) {
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
161 return NGX_ERROR;
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
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
164 if (kcf->original_init_peer(r, us) != NGX_OK) {
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
165 return NGX_ERROR;
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
166 }
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
167
1
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
168 kp->conf = kcf;
0
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
169 kp->data = r->upstream->peer.data;
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
170 kp->original_get_peer = r->upstream->peer.get;
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
171 kp->original_free_peer = r->upstream->peer.free;
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
172
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
173 r->upstream->peer.data = kp;
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
174 r->upstream->peer.get = ngx_http_upstream_get_keepalive_peer;
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
175 r->upstream->peer.free = ngx_http_upstream_free_keepalive_peer;
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
176
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
177 return NGX_OK;
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
178 }
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
179
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 static ngx_int_t
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
182 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
183 {
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
184 ngx_http_upstream_keepalive_peer_data_t *kp = data;
2
8545bbda9e4b Keepalive: reimplement using queues.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
185 ngx_http_upstream_keepalive_cache_t *item;
0
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
186
6
bef88ba0b378 Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5
diff changeset
187 ngx_int_t rc;
bef88ba0b378 Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5
diff changeset
188 ngx_queue_t *q, *cache;
5
e7d1b49e0611 Keepalive: style.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4
diff changeset
189 ngx_connection_t *c;
1
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
190
0
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
191 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, pc->log, 0,
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
192 "get keepalive peer");
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
193
6
bef88ba0b378 Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5
diff changeset
194 /* single pool of cached connections */
1
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
195
6
bef88ba0b378 Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5
diff changeset
196 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
197
8545bbda9e4b Keepalive: reimplement using queues.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
198 q = ngx_queue_head(&kp->conf->cache);
8545bbda9e4b Keepalive: reimplement using queues.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
199 ngx_queue_remove(q);
1
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
200
2
8545bbda9e4b Keepalive: reimplement using queues.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
201 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
202 c = item->connection;
8545bbda9e4b Keepalive: reimplement using queues.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
203
8545bbda9e4b Keepalive: reimplement using queues.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
204 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
205
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
206 c->idle = 0;
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
207 c->log = pc->log;
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
208 c->read->log = pc->log;
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
209 c->write->log = pc->log;
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
210
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
211 pc->connection = c;
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
212 pc->cached = 1;
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
213
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
214 return NGX_DONE;
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
6
bef88ba0b378 Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5
diff changeset
217 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
218
bef88ba0b378 Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5
diff changeset
219 if (kp->conf->single || rc != NGX_OK) {
bef88ba0b378 Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5
diff changeset
220 return rc;
bef88ba0b378 Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5
diff changeset
221 }
bef88ba0b378 Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5
diff changeset
222
bef88ba0b378 Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5
diff changeset
223 /* search cache for suitable connection */
bef88ba0b378 Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5
diff changeset
224
bef88ba0b378 Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5
diff changeset
225 cache = &kp->conf->cache;
bef88ba0b378 Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5
diff changeset
226
bef88ba0b378 Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5
diff changeset
227 for (q = ngx_queue_head(cache);
bef88ba0b378 Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5
diff changeset
228 q != ngx_queue_sentinel(cache);
bef88ba0b378 Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5
diff changeset
229 q = ngx_queue_next(q))
bef88ba0b378 Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5
diff changeset
230 {
bef88ba0b378 Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5
diff changeset
231 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
232 c = item->connection;
bef88ba0b378 Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5
diff changeset
233
bef88ba0b378 Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5
diff changeset
234 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
235 item->socklen, pc->socklen)
bef88ba0b378 Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5
diff changeset
236 == 0)
bef88ba0b378 Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5
diff changeset
237 {
bef88ba0b378 Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5
diff changeset
238 ngx_queue_remove(q);
bef88ba0b378 Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5
diff changeset
239 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
240
bef88ba0b378 Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5
diff changeset
241 c->idle = 0;
bef88ba0b378 Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5
diff changeset
242 c->log = pc->log;
bef88ba0b378 Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5
diff changeset
243 c->read->log = pc->log;
bef88ba0b378 Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5
diff changeset
244 c->write->log = pc->log;
bef88ba0b378 Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5
diff changeset
245
bef88ba0b378 Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5
diff changeset
246 pc->connection = c;
bef88ba0b378 Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5
diff changeset
247 pc->cached = 1;
bef88ba0b378 Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5
diff changeset
248
bef88ba0b378 Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5
diff changeset
249 return NGX_DONE;
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 }
bef88ba0b378 Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5
diff changeset
252
bef88ba0b378 Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5
diff changeset
253 return NGX_OK;
0
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
254 }
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
255
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
256
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
257 static void
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
258 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
259 ngx_uint_t state)
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
260 {
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
261 ngx_http_upstream_keepalive_peer_data_t *kp = data;
2
8545bbda9e4b Keepalive: reimplement using queues.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
262 ngx_http_upstream_keepalive_cache_t *item;
0
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
263
2
8545bbda9e4b Keepalive: reimplement using queues.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
264 ngx_queue_t *q;
1
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
265 ngx_connection_t *c;
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
266
0
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
267 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, pc->log, 0,
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
268 "free keepalive peer");
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
269
1
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
270 if (!(state & NGX_PEER_FAILED)
3
42e64900483b Keepalive: always save connections to cache.
Maxim Dounin <mdounin@mdounin.ru>
parents: 2
diff changeset
271 && pc->connection != NULL)
1
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
272 {
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
273 c = pc->connection;
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
274
3
42e64900483b Keepalive: always save connections to cache.
Maxim Dounin <mdounin@mdounin.ru>
parents: 2
diff changeset
275 if (ngx_queue_empty(&kp->conf->free)) {
42e64900483b Keepalive: always save connections to cache.
Maxim Dounin <mdounin@mdounin.ru>
parents: 2
diff changeset
276
42e64900483b Keepalive: always save connections to cache.
Maxim Dounin <mdounin@mdounin.ru>
parents: 2
diff changeset
277 q = ngx_queue_last(&kp->conf->cache);
42e64900483b Keepalive: always save connections to cache.
Maxim Dounin <mdounin@mdounin.ru>
parents: 2
diff changeset
278 ngx_queue_remove(q);
42e64900483b Keepalive: always save connections to cache.
Maxim Dounin <mdounin@mdounin.ru>
parents: 2
diff changeset
279
42e64900483b Keepalive: always save connections to cache.
Maxim Dounin <mdounin@mdounin.ru>
parents: 2
diff changeset
280 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
281 queue);
42e64900483b Keepalive: always save connections to cache.
Maxim Dounin <mdounin@mdounin.ru>
parents: 2
diff changeset
282
42e64900483b Keepalive: always save connections to cache.
Maxim Dounin <mdounin@mdounin.ru>
parents: 2
diff changeset
283 ngx_close_connection(item->connection);
2
8545bbda9e4b Keepalive: reimplement using queues.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
284
3
42e64900483b Keepalive: always save connections to cache.
Maxim Dounin <mdounin@mdounin.ru>
parents: 2
diff changeset
285 } else {
42e64900483b Keepalive: always save connections to cache.
Maxim Dounin <mdounin@mdounin.ru>
parents: 2
diff changeset
286 q = ngx_queue_head(&kp->conf->free);
42e64900483b Keepalive: always save connections to cache.
Maxim Dounin <mdounin@mdounin.ru>
parents: 2
diff changeset
287 ngx_queue_remove(q);
42e64900483b Keepalive: always save connections to cache.
Maxim Dounin <mdounin@mdounin.ru>
parents: 2
diff changeset
288
42e64900483b Keepalive: always save connections to cache.
Maxim Dounin <mdounin@mdounin.ru>
parents: 2
diff changeset
289 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
290 queue);
42e64900483b Keepalive: always save connections to cache.
Maxim Dounin <mdounin@mdounin.ru>
parents: 2
diff changeset
291 }
42e64900483b Keepalive: always save connections to cache.
Maxim Dounin <mdounin@mdounin.ru>
parents: 2
diff changeset
292
2
8545bbda9e4b Keepalive: reimplement using queues.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
293 item->connection = c;
8545bbda9e4b Keepalive: reimplement using queues.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
294 ngx_queue_insert_head(&kp->conf->cache, q);
8545bbda9e4b Keepalive: reimplement using queues.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
295
1
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
296 pc->connection = NULL;
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
297
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
298 if (c->read->timer_set) {
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
299 ngx_del_timer(c->read);
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
300 }
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
301 if (c->write->timer_set) {
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
302 ngx_del_timer(c->write);
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
303 }
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
304
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
305 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
306 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
307
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
308 c->data = kp->conf;
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
309 c->idle = 1;
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
310 c->log = ngx_cycle->log;
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
311 c->read->log = ngx_cycle->log;
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
312 c->write->log = ngx_cycle->log;
6
bef88ba0b378 Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5
diff changeset
313
bef88ba0b378 Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5
diff changeset
314 item->socklen = pc->socklen;
bef88ba0b378 Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5
diff changeset
315 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
316 }
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
317
0
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
318 return kp->original_free_peer(pc, kp->data, state);
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
319 }
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
320
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
321
1
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
322 static void
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
323 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
324 {
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
325 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
326 "keepalive dummy handler");
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
327 }
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
328
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
329
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
330 static void
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
331 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
332 {
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
333 ngx_http_upstream_keepalive_srv_conf_t *conf;
2
8545bbda9e4b Keepalive: reimplement using queues.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
334 ngx_http_upstream_keepalive_cache_t *item;
1
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
335
2
8545bbda9e4b Keepalive: reimplement using queues.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
336 ngx_queue_t *q, *cache;
1
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
337 ngx_connection_t *c;
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
338
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
339 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
340 "keepalive close handler");
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
341
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
342 c = ev->data;
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
343 conf = c->data;
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
344
2
8545bbda9e4b Keepalive: reimplement using queues.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
345 cache = &conf->cache;
1
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
346
2
8545bbda9e4b Keepalive: reimplement using queues.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
347 for (q = ngx_queue_head(cache);
8545bbda9e4b Keepalive: reimplement using queues.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
348 q != ngx_queue_sentinel(cache);
8545bbda9e4b Keepalive: reimplement using queues.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
349 q = ngx_queue_next(q))
8545bbda9e4b Keepalive: reimplement using queues.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
350 {
8545bbda9e4b Keepalive: reimplement using queues.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
351 item = ngx_queue_data(q, ngx_http_upstream_keepalive_cache_t, queue);
1
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
352
2
8545bbda9e4b Keepalive: reimplement using queues.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
353 if (item->connection == c) {
8545bbda9e4b Keepalive: reimplement using queues.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
354 ngx_queue_remove(q);
1
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
355 ngx_close_connection(c);
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
356 return;
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 }
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
359
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
360 ngx_log_error(NGX_LOG_ALERT, ev->log, 0,
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
361 "keepalive close handler: unknown connection %p", c);
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
362 ngx_close_connection(c);
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
363 }
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
364
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
365
0
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
366 static void *
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
367 ngx_http_upstream_keepalive_create_conf(ngx_conf_t *cf)
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
368 {
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
369 ngx_http_upstream_keepalive_srv_conf_t *conf;
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
370
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
371 conf = ngx_pcalloc(cf->pool,
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
372 sizeof(ngx_http_upstream_keepalive_srv_conf_t));
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
373 if (conf == NULL) {
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
374 return NGX_CONF_ERROR;
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
375 }
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
376
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
377 /*
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
378 * set by ngx_pcalloc():
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
379 *
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
380 * conf->original_init_upstream = NULL;
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
381 * conf->original_init_peer = NULL;
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
382 */
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
383
1
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
384 conf->max_cached = 1;
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
385
0
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
386 return conf;
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
387 }
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
388
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
389
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
390 static char *
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
391 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
392 {
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
393 ngx_http_upstream_srv_conf_t *uscf;
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
394 ngx_http_upstream_keepalive_srv_conf_t *kcf;
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
395
1
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
396 ngx_int_t n;
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
397 ngx_str_t *value;
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
398 ngx_uint_t i;
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
399
0
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
400 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
401
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
402 kcf = ngx_http_conf_upstream_srv_conf(uscf,
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
403 ngx_http_upstream_keepalive_module);
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
404
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
405 kcf->original_init_upstream = uscf->peer.init_upstream
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
406 ? uscf->peer.init_upstream
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
407 : ngx_http_upstream_init_round_robin;
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
408
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
409 uscf->peer.init_upstream = ngx_http_upstream_init_keepalive;
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
410
1
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
411 /* read options */
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
412
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
413 value = cf->args->elts;
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
414
6
bef88ba0b378 Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5
diff changeset
415 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
416
6
bef88ba0b378 Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5
diff changeset
417 if (n == NGX_ERROR || n == 0) {
bef88ba0b378 Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5
diff changeset
418 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
419 "invalid value \"%V\" in \"%V\" directive",
bef88ba0b378 Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5
diff changeset
420 &value[1], &cmd->name);
bef88ba0b378 Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5
diff changeset
421 return NGX_CONF_ERROR;
bef88ba0b378 Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5
diff changeset
422 }
1
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
423
6
bef88ba0b378 Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5
diff changeset
424 kcf->max_cached = n;
bef88ba0b378 Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5
diff changeset
425
bef88ba0b378 Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5
diff changeset
426 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
427
bef88ba0b378 Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5
diff changeset
428 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
429
bef88ba0b378 Keepalive: distinguish between upstream servers by default.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5
diff changeset
430 kcf->single = 1;
1
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
431
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
432 continue;
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
433 }
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
434
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
435 goto invalid;
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
436 }
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
437
0
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
438 return NGX_CONF_OK;
1
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
439
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
440 invalid:
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
441
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
442 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
443 "invalid parameter \"%V\"", &value[i]);
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
444
ca955a7f651b Keepalive: common cache for all backends.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
445 return NGX_CONF_ERROR;
0
725ee11164f3 Keepalive upstream balancer: transparent skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
446 }