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

Cleaned up r->headers_out.headers allocation error handling. If initialization of a header failed for some reason after ngx_list_push(), leaving the header as is can result in uninitialized memory access by the header filter or the log module. The fix is to clear partially initialized headers in case of errors. For the Cache-Control header, the fix is to postpone pushing r->headers_out.cache_control until its value is completed.
author Sergey Kandaurov <pluknet@nginx.com>
date Thu, 20 Apr 2017 18:26:37 +0300
parents adf25b8d0431
children 1cb92a2d672e
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
4127
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2 /*
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3 * Copyright (C) Maxim Dounin
4412
d620f497c50f Copyright updated.
Maxim Konovalov <maxim@nginx.com>
parents: 4127
diff changeset
4 * Copyright (C) Nginx, Inc.
4127
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
5 */
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
6
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
7
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
8 #include <ngx_config.h>
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
9 #include <ngx_core.h>
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
10 #include <ngx_http.h>
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
11
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
12
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
13 typedef struct {
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
14 ngx_uint_t max_cached;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
15
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
16 ngx_queue_t cache;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
17 ngx_queue_t free;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
18
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
19 ngx_http_upstream_init_pt original_init_upstream;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
20 ngx_http_upstream_init_peer_pt original_init_peer;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
21
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
22 } ngx_http_upstream_keepalive_srv_conf_t;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
23
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
24
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
25 typedef struct {
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
26 ngx_http_upstream_keepalive_srv_conf_t *conf;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
27
6167
87d48f8793b6 Upstream keepalive: reduced diffs to the plus version of nginx.
Roman Arutyunyan <arut@nginx.com>
parents: 5999
diff changeset
28 ngx_queue_t queue;
87d48f8793b6 Upstream keepalive: reduced diffs to the plus version of nginx.
Roman Arutyunyan <arut@nginx.com>
parents: 5999
diff changeset
29 ngx_connection_t *connection;
87d48f8793b6 Upstream keepalive: reduced diffs to the plus version of nginx.
Roman Arutyunyan <arut@nginx.com>
parents: 5999
diff changeset
30
87d48f8793b6 Upstream keepalive: reduced diffs to the plus version of nginx.
Roman Arutyunyan <arut@nginx.com>
parents: 5999
diff changeset
31 socklen_t socklen;
6559
adf25b8d0431 Introduced the ngx_sockaddr_t type.
Ruslan Ermilov <ru@nginx.com>
parents: 6332
diff changeset
32 ngx_sockaddr_t sockaddr;
6167
87d48f8793b6 Upstream keepalive: reduced diffs to the plus version of nginx.
Roman Arutyunyan <arut@nginx.com>
parents: 5999
diff changeset
33
87d48f8793b6 Upstream keepalive: reduced diffs to the plus version of nginx.
Roman Arutyunyan <arut@nginx.com>
parents: 5999
diff changeset
34 } ngx_http_upstream_keepalive_cache_t;
87d48f8793b6 Upstream keepalive: reduced diffs to the plus version of nginx.
Roman Arutyunyan <arut@nginx.com>
parents: 5999
diff changeset
35
87d48f8793b6 Upstream keepalive: reduced diffs to the plus version of nginx.
Roman Arutyunyan <arut@nginx.com>
parents: 5999
diff changeset
36
87d48f8793b6 Upstream keepalive: reduced diffs to the plus version of nginx.
Roman Arutyunyan <arut@nginx.com>
parents: 5999
diff changeset
37 typedef struct {
87d48f8793b6 Upstream keepalive: reduced diffs to the plus version of nginx.
Roman Arutyunyan <arut@nginx.com>
parents: 5999
diff changeset
38 ngx_http_upstream_keepalive_srv_conf_t *conf;
87d48f8793b6 Upstream keepalive: reduced diffs to the plus version of nginx.
Roman Arutyunyan <arut@nginx.com>
parents: 5999
diff changeset
39
4127
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
40 ngx_http_upstream_t *upstream;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
41
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
42 void *data;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
43
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
44 ngx_event_get_peer_pt original_get_peer;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
45 ngx_event_free_peer_pt original_free_peer;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
46
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
47 #if (NGX_HTTP_SSL)
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
48 ngx_event_set_peer_session_pt original_set_session;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
49 ngx_event_save_peer_session_pt original_save_session;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
50 #endif
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
51
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
52 } ngx_http_upstream_keepalive_peer_data_t;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
53
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
54
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
55 static ngx_int_t ngx_http_upstream_init_keepalive_peer(ngx_http_request_t *r,
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
56 ngx_http_upstream_srv_conf_t *us);
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
57 static ngx_int_t ngx_http_upstream_get_keepalive_peer(ngx_peer_connection_t *pc,
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
58 void *data);
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
59 static void ngx_http_upstream_free_keepalive_peer(ngx_peer_connection_t *pc,
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
60 void *data, ngx_uint_t state);
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
61
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
62 static void ngx_http_upstream_keepalive_dummy_handler(ngx_event_t *ev);
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
63 static void ngx_http_upstream_keepalive_close_handler(ngx_event_t *ev);
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
64 static void ngx_http_upstream_keepalive_close(ngx_connection_t *c);
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
65
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
66 #if (NGX_HTTP_SSL)
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
67 static ngx_int_t ngx_http_upstream_keepalive_set_session(
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
68 ngx_peer_connection_t *pc, void *data);
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
69 static void ngx_http_upstream_keepalive_save_session(ngx_peer_connection_t *pc,
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
70 void *data);
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
71 #endif
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
72
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
73 static void *ngx_http_upstream_keepalive_create_conf(ngx_conf_t *cf);
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
74 static char *ngx_http_upstream_keepalive(ngx_conf_t *cf, ngx_command_t *cmd,
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
75 void *conf);
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
76
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
77
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
78 static ngx_command_t ngx_http_upstream_keepalive_commands[] = {
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
79
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
80 { ngx_string("keepalive"),
5830
3e5b630e0ec9 Upstream keepalive: removed "single" parameter remnants.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5213
diff changeset
81 NGX_HTTP_UPS_CONF|NGX_CONF_TAKE1,
4127
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
82 ngx_http_upstream_keepalive,
5213
822b82191940 Upstream keepalive: slightly simplified code.
Ruslan Ermilov <ru@nginx.com>
parents: 5133
diff changeset
83 NGX_HTTP_SRV_CONF_OFFSET,
4127
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
84 0,
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
85 NULL },
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
86
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
87 ngx_null_command
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
88 };
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
89
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
90
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
91 static ngx_http_module_t ngx_http_upstream_keepalive_module_ctx = {
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
92 NULL, /* preconfiguration */
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
93 NULL, /* postconfiguration */
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
94
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
95 NULL, /* create main configuration */
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
96 NULL, /* init main configuration */
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
97
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
98 ngx_http_upstream_keepalive_create_conf, /* create server configuration */
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
99 NULL, /* merge server configuration */
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
100
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
101 NULL, /* create location configuration */
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
102 NULL /* merge location configuration */
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
103 };
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
104
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
105
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
106 ngx_module_t ngx_http_upstream_keepalive_module = {
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
107 NGX_MODULE_V1,
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
108 &ngx_http_upstream_keepalive_module_ctx, /* module context */
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
109 ngx_http_upstream_keepalive_commands, /* module directives */
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
110 NGX_HTTP_MODULE, /* module type */
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
111 NULL, /* init master */
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
112 NULL, /* init module */
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
113 NULL, /* init process */
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
114 NULL, /* init thread */
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
115 NULL, /* exit thread */
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
116 NULL, /* exit process */
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
117 NULL, /* exit master */
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
118 NGX_MODULE_V1_PADDING
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
119 };
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
120
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
121
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
122 static ngx_int_t
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
123 ngx_http_upstream_init_keepalive(ngx_conf_t *cf,
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
124 ngx_http_upstream_srv_conf_t *us)
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
125 {
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
126 ngx_uint_t i;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
127 ngx_http_upstream_keepalive_srv_conf_t *kcf;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
128 ngx_http_upstream_keepalive_cache_t *cached;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
129
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
130 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, cf->log, 0,
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
131 "init keepalive");
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
132
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
133 kcf = ngx_http_conf_upstream_srv_conf(us,
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
134 ngx_http_upstream_keepalive_module);
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
135
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
136 if (kcf->original_init_upstream(cf, us) != NGX_OK) {
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
137 return NGX_ERROR;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
138 }
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
139
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
140 kcf->original_init_peer = us->peer.init;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
141
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
142 us->peer.init = ngx_http_upstream_init_keepalive_peer;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
143
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
144 /* allocate cache items and add to free queue */
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
145
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
146 cached = ngx_pcalloc(cf->pool,
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
147 sizeof(ngx_http_upstream_keepalive_cache_t) * kcf->max_cached);
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
148 if (cached == NULL) {
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
149 return NGX_ERROR;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
150 }
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
151
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
152 ngx_queue_init(&kcf->cache);
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
153 ngx_queue_init(&kcf->free);
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
154
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
155 for (i = 0; i < kcf->max_cached; i++) {
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
156 ngx_queue_insert_head(&kcf->free, &cached[i].queue);
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
157 cached[i].conf = kcf;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
158 }
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
159
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
160 return NGX_OK;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
161 }
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
162
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
163
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
164 static ngx_int_t
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
165 ngx_http_upstream_init_keepalive_peer(ngx_http_request_t *r,
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
166 ngx_http_upstream_srv_conf_t *us)
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
167 {
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
168 ngx_http_upstream_keepalive_peer_data_t *kp;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
169 ngx_http_upstream_keepalive_srv_conf_t *kcf;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
170
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
171 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
172 "init keepalive peer");
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
173
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
174 kcf = ngx_http_conf_upstream_srv_conf(us,
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
175 ngx_http_upstream_keepalive_module);
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
176
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
177 kp = ngx_palloc(r->pool, sizeof(ngx_http_upstream_keepalive_peer_data_t));
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
178 if (kp == NULL) {
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
179 return NGX_ERROR;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
180 }
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
181
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
182 if (kcf->original_init_peer(r, us) != NGX_OK) {
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
183 return NGX_ERROR;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
184 }
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
185
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
186 kp->conf = kcf;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
187 kp->upstream = r->upstream;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
188 kp->data = r->upstream->peer.data;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
189 kp->original_get_peer = r->upstream->peer.get;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
190 kp->original_free_peer = r->upstream->peer.free;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
191
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
192 r->upstream->peer.data = kp;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
193 r->upstream->peer.get = ngx_http_upstream_get_keepalive_peer;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
194 r->upstream->peer.free = ngx_http_upstream_free_keepalive_peer;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
195
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
196 #if (NGX_HTTP_SSL)
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
197 kp->original_set_session = r->upstream->peer.set_session;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
198 kp->original_save_session = r->upstream->peer.save_session;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
199 r->upstream->peer.set_session = ngx_http_upstream_keepalive_set_session;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
200 r->upstream->peer.save_session = ngx_http_upstream_keepalive_save_session;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
201 #endif
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
202
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
203 return NGX_OK;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
204 }
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
205
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
206
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
207 static ngx_int_t
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
208 ngx_http_upstream_get_keepalive_peer(ngx_peer_connection_t *pc, void *data)
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
209 {
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
210 ngx_http_upstream_keepalive_peer_data_t *kp = data;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
211 ngx_http_upstream_keepalive_cache_t *item;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
212
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
213 ngx_int_t rc;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
214 ngx_queue_t *q, *cache;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
215 ngx_connection_t *c;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
216
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
217 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, pc->log, 0,
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
218 "get keepalive peer");
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
219
4694
5b5c07dee156 Upstream keepalive: "single" parameter deprecated.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4412
diff changeset
220 /* ask balancer */
4127
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
221
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
222 rc = kp->original_get_peer(pc, kp->data);
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
223
4694
5b5c07dee156 Upstream keepalive: "single" parameter deprecated.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4412
diff changeset
224 if (rc != NGX_OK) {
4127
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
225 return rc;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
226 }
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
227
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
228 /* search cache for suitable connection */
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
229
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
230 cache = &kp->conf->cache;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
231
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
232 for (q = ngx_queue_head(cache);
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
233 q != ngx_queue_sentinel(cache);
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
234 q = ngx_queue_next(q))
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
235 {
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
236 item = ngx_queue_data(q, ngx_http_upstream_keepalive_cache_t, queue);
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
237 c = item->connection;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
238
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
239 if (ngx_memn2cmp((u_char *) &item->sockaddr, (u_char *) pc->sockaddr,
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
240 item->socklen, pc->socklen)
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
241 == 0)
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
242 {
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
243 ngx_queue_remove(q);
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
244 ngx_queue_insert_head(&kp->conf->free, q);
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
245
6167
87d48f8793b6 Upstream keepalive: reduced diffs to the plus version of nginx.
Roman Arutyunyan <arut@nginx.com>
parents: 5999
diff changeset
246 goto found;
4127
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
247 }
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
248 }
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
249
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
250 return NGX_OK;
6167
87d48f8793b6 Upstream keepalive: reduced diffs to the plus version of nginx.
Roman Arutyunyan <arut@nginx.com>
parents: 5999
diff changeset
251
87d48f8793b6 Upstream keepalive: reduced diffs to the plus version of nginx.
Roman Arutyunyan <arut@nginx.com>
parents: 5999
diff changeset
252 found:
87d48f8793b6 Upstream keepalive: reduced diffs to the plus version of nginx.
Roman Arutyunyan <arut@nginx.com>
parents: 5999
diff changeset
253
87d48f8793b6 Upstream keepalive: reduced diffs to the plus version of nginx.
Roman Arutyunyan <arut@nginx.com>
parents: 5999
diff changeset
254 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, pc->log, 0,
87d48f8793b6 Upstream keepalive: reduced diffs to the plus version of nginx.
Roman Arutyunyan <arut@nginx.com>
parents: 5999
diff changeset
255 "get keepalive peer: using connection %p", c);
87d48f8793b6 Upstream keepalive: reduced diffs to the plus version of nginx.
Roman Arutyunyan <arut@nginx.com>
parents: 5999
diff changeset
256
87d48f8793b6 Upstream keepalive: reduced diffs to the plus version of nginx.
Roman Arutyunyan <arut@nginx.com>
parents: 5999
diff changeset
257 c->idle = 0;
87d48f8793b6 Upstream keepalive: reduced diffs to the plus version of nginx.
Roman Arutyunyan <arut@nginx.com>
parents: 5999
diff changeset
258 c->sent = 0;
87d48f8793b6 Upstream keepalive: reduced diffs to the plus version of nginx.
Roman Arutyunyan <arut@nginx.com>
parents: 5999
diff changeset
259 c->log = pc->log;
87d48f8793b6 Upstream keepalive: reduced diffs to the plus version of nginx.
Roman Arutyunyan <arut@nginx.com>
parents: 5999
diff changeset
260 c->read->log = pc->log;
87d48f8793b6 Upstream keepalive: reduced diffs to the plus version of nginx.
Roman Arutyunyan <arut@nginx.com>
parents: 5999
diff changeset
261 c->write->log = pc->log;
87d48f8793b6 Upstream keepalive: reduced diffs to the plus version of nginx.
Roman Arutyunyan <arut@nginx.com>
parents: 5999
diff changeset
262 c->pool->log = pc->log;
87d48f8793b6 Upstream keepalive: reduced diffs to the plus version of nginx.
Roman Arutyunyan <arut@nginx.com>
parents: 5999
diff changeset
263
87d48f8793b6 Upstream keepalive: reduced diffs to the plus version of nginx.
Roman Arutyunyan <arut@nginx.com>
parents: 5999
diff changeset
264 pc->connection = c;
87d48f8793b6 Upstream keepalive: reduced diffs to the plus version of nginx.
Roman Arutyunyan <arut@nginx.com>
parents: 5999
diff changeset
265 pc->cached = 1;
87d48f8793b6 Upstream keepalive: reduced diffs to the plus version of nginx.
Roman Arutyunyan <arut@nginx.com>
parents: 5999
diff changeset
266
87d48f8793b6 Upstream keepalive: reduced diffs to the plus version of nginx.
Roman Arutyunyan <arut@nginx.com>
parents: 5999
diff changeset
267 return NGX_DONE;
4127
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
268 }
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
269
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
270
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
271 static void
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
272 ngx_http_upstream_free_keepalive_peer(ngx_peer_connection_t *pc, void *data,
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
273 ngx_uint_t state)
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
274 {
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
275 ngx_http_upstream_keepalive_peer_data_t *kp = data;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
276 ngx_http_upstream_keepalive_cache_t *item;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
277
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
278 ngx_queue_t *q;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
279 ngx_connection_t *c;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
280 ngx_http_upstream_t *u;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
281
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
282 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, pc->log, 0,
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
283 "free keepalive peer");
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
284
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
285 /* cache valid connections */
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
286
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
287 u = kp->upstream;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
288 c = pc->connection;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
289
5133
089a662c17d1 Upstream: removed double-free workarounds in peer.free() methods.
Ruslan Ermilov <ru@nginx.com>
parents: 4998
diff changeset
290 if (state & NGX_PEER_FAILED
4127
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
291 || c == NULL
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
292 || c->read->eof
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
293 || c->read->error
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
294 || c->read->timedout
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
295 || c->write->error
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
296 || c->write->timedout)
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
297 {
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
298 goto invalid;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
299 }
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
300
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
301 if (!u->keepalive) {
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
302 goto invalid;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
303 }
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
304
6332
78b4e10b4367 Upstream: don't keep connections on early responses (ticket #669).
Maxim Dounin <mdounin@mdounin.ru>
parents: 6220
diff changeset
305 if (!u->request_body_sent) {
78b4e10b4367 Upstream: don't keep connections on early responses (ticket #669).
Maxim Dounin <mdounin@mdounin.ru>
parents: 6220
diff changeset
306 goto invalid;
78b4e10b4367 Upstream: don't keep connections on early responses (ticket #669).
Maxim Dounin <mdounin@mdounin.ru>
parents: 6220
diff changeset
307 }
78b4e10b4367 Upstream: don't keep connections on early responses (ticket #669).
Maxim Dounin <mdounin@mdounin.ru>
parents: 6220
diff changeset
308
6220
5e6142609e48 Core: idle connections now closed only once on exiting.
Valentin Bartenev <vbart@nginx.com>
parents: 6167
diff changeset
309 if (ngx_terminate || ngx_exiting) {
5e6142609e48 Core: idle connections now closed only once on exiting.
Valentin Bartenev <vbart@nginx.com>
parents: 6167
diff changeset
310 goto invalid;
5e6142609e48 Core: idle connections now closed only once on exiting.
Valentin Bartenev <vbart@nginx.com>
parents: 6167
diff changeset
311 }
5e6142609e48 Core: idle connections now closed only once on exiting.
Valentin Bartenev <vbart@nginx.com>
parents: 6167
diff changeset
312
4127
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
313 if (ngx_handle_read_event(c->read, 0) != NGX_OK) {
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
314 goto invalid;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
315 }
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
316
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
317 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, pc->log, 0,
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
318 "free keepalive peer: saving connection %p", c);
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
319
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
320 if (ngx_queue_empty(&kp->conf->free)) {
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
321
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
322 q = ngx_queue_last(&kp->conf->cache);
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
323 ngx_queue_remove(q);
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
324
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
325 item = ngx_queue_data(q, ngx_http_upstream_keepalive_cache_t, queue);
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
326
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
327 ngx_http_upstream_keepalive_close(item->connection);
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
328
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
329 } else {
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
330 q = ngx_queue_head(&kp->conf->free);
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
331 ngx_queue_remove(q);
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
332
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
333 item = ngx_queue_data(q, ngx_http_upstream_keepalive_cache_t, queue);
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
334 }
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
335
6167
87d48f8793b6 Upstream keepalive: reduced diffs to the plus version of nginx.
Roman Arutyunyan <arut@nginx.com>
parents: 5999
diff changeset
336 ngx_queue_insert_head(&kp->conf->cache, q);
87d48f8793b6 Upstream keepalive: reduced diffs to the plus version of nginx.
Roman Arutyunyan <arut@nginx.com>
parents: 5999
diff changeset
337
4127
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
338 item->connection = c;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
339
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
340 pc->connection = NULL;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
341
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
342 if (c->read->timer_set) {
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
343 ngx_del_timer(c->read);
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
344 }
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
345 if (c->write->timer_set) {
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
346 ngx_del_timer(c->write);
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
347 }
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
348
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
349 c->write->handler = ngx_http_upstream_keepalive_dummy_handler;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
350 c->read->handler = ngx_http_upstream_keepalive_close_handler;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
351
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
352 c->data = item;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
353 c->idle = 1;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
354 c->log = ngx_cycle->log;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
355 c->read->log = ngx_cycle->log;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
356 c->write->log = ngx_cycle->log;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
357 c->pool->log = ngx_cycle->log;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
358
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
359 item->socklen = pc->socklen;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
360 ngx_memcpy(&item->sockaddr, pc->sockaddr, pc->socklen);
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
361
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
362 if (c->read->ready) {
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
363 ngx_http_upstream_keepalive_close_handler(c->read);
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
364 }
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
365
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
366 invalid:
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
367
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
368 kp->original_free_peer(pc, kp->data, state);
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
369 }
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
370
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
371
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
372 static void
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
373 ngx_http_upstream_keepalive_dummy_handler(ngx_event_t *ev)
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
374 {
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
375 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, ev->log, 0,
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
376 "keepalive dummy handler");
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
377 }
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
378
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
379
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
380 static void
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
381 ngx_http_upstream_keepalive_close_handler(ngx_event_t *ev)
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
382 {
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
383 ngx_http_upstream_keepalive_srv_conf_t *conf;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
384 ngx_http_upstream_keepalive_cache_t *item;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
385
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
386 int n;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
387 char buf[1];
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
388 ngx_connection_t *c;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
389
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
390 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, ev->log, 0,
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
391 "keepalive close handler");
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
392
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
393 c = ev->data;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
394
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
395 if (c->close) {
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
396 goto close;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
397 }
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
398
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
399 n = recv(c->fd, buf, 1, MSG_PEEK);
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
400
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
401 if (n == -1 && ngx_socket_errno == NGX_EAGAIN) {
5999
4d8936b1fc32 Upstream keepalive: drop ready flag on EAGAIN from recv(MSG_PEEK).
Valentin Bartenev <vbart@nginx.com>
parents: 5864
diff changeset
402 ev->ready = 0;
4127
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
403
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
404 if (ngx_handle_read_event(c->read, 0) != NGX_OK) {
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
405 goto close;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
406 }
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
407
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
408 return;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
409 }
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
410
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
411 close:
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
412
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
413 item = c->data;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
414 conf = item->conf;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
415
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
416 ngx_http_upstream_keepalive_close(c);
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
417
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
418 ngx_queue_remove(&item->queue);
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
419 ngx_queue_insert_head(&conf->free, &item->queue);
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
420 }
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
421
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
422
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
423 static void
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
424 ngx_http_upstream_keepalive_close(ngx_connection_t *c)
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
425 {
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
426
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
427 #if (NGX_HTTP_SSL)
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
428
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
429 if (c->ssl) {
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
430 c->ssl->no_wait_shutdown = 1;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
431 c->ssl->no_send_shutdown = 1;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
432
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
433 if (ngx_ssl_shutdown(c) == NGX_AGAIN) {
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
434 c->ssl->handler = ngx_http_upstream_keepalive_close;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
435 return;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
436 }
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
437 }
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
438
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
439 #endif
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
440
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
441 ngx_destroy_pool(c->pool);
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
442 ngx_close_connection(c);
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
443 }
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
444
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
445
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
446 #if (NGX_HTTP_SSL)
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
447
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
448 static ngx_int_t
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
449 ngx_http_upstream_keepalive_set_session(ngx_peer_connection_t *pc, void *data)
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
450 {
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
451 ngx_http_upstream_keepalive_peer_data_t *kp = data;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
452
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
453 return kp->original_set_session(pc, kp->data);
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
454 }
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
455
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
456
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
457 static void
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
458 ngx_http_upstream_keepalive_save_session(ngx_peer_connection_t *pc, void *data)
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
459 {
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
460 ngx_http_upstream_keepalive_peer_data_t *kp = data;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
461
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
462 kp->original_save_session(pc, kp->data);
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
463 return;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
464 }
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
465
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
466 #endif
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
467
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
468
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
469 static void *
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
470 ngx_http_upstream_keepalive_create_conf(ngx_conf_t *cf)
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
471 {
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
472 ngx_http_upstream_keepalive_srv_conf_t *conf;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
473
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
474 conf = ngx_pcalloc(cf->pool,
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
475 sizeof(ngx_http_upstream_keepalive_srv_conf_t));
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
476 if (conf == NULL) {
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
477 return NULL;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
478 }
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
479
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
480 /*
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
481 * set by ngx_pcalloc():
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
482 *
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
483 * conf->original_init_upstream = NULL;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
484 * conf->original_init_peer = NULL;
6167
87d48f8793b6 Upstream keepalive: reduced diffs to the plus version of nginx.
Roman Arutyunyan <arut@nginx.com>
parents: 5999
diff changeset
485 * conf->max_cached = 0;
4127
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
486 */
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
487
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
488 return conf;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
489 }
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
490
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
491
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
492 static char *
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
493 ngx_http_upstream_keepalive(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
494 {
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
495 ngx_http_upstream_srv_conf_t *uscf;
5213
822b82191940 Upstream keepalive: slightly simplified code.
Ruslan Ermilov <ru@nginx.com>
parents: 5133
diff changeset
496 ngx_http_upstream_keepalive_srv_conf_t *kcf = conf;
4127
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
497
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
498 ngx_int_t n;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
499 ngx_str_t *value;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
500
6167
87d48f8793b6 Upstream keepalive: reduced diffs to the plus version of nginx.
Roman Arutyunyan <arut@nginx.com>
parents: 5999
diff changeset
501 if (kcf->max_cached) {
4998
82336a9ce26d Upstream keepalive: detect duplicate "keepalive" directive.
Ruslan Ermilov <ru@nginx.com>
parents: 4694
diff changeset
502 return "is duplicate";
82336a9ce26d Upstream keepalive: detect duplicate "keepalive" directive.
Ruslan Ermilov <ru@nginx.com>
parents: 4694
diff changeset
503 }
82336a9ce26d Upstream keepalive: detect duplicate "keepalive" directive.
Ruslan Ermilov <ru@nginx.com>
parents: 4694
diff changeset
504
4127
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
505 /* read options */
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
506
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
507 value = cf->args->elts;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
508
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
509 n = ngx_atoi(value[1].data, value[1].len);
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
510
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
511 if (n == NGX_ERROR || n == 0) {
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
512 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
513 "invalid value \"%V\" in \"%V\" directive",
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
514 &value[1], &cmd->name);
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
515 return NGX_CONF_ERROR;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
516 }
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
517
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
518 kcf->max_cached = n;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
519
6167
87d48f8793b6 Upstream keepalive: reduced diffs to the plus version of nginx.
Roman Arutyunyan <arut@nginx.com>
parents: 5999
diff changeset
520 uscf = ngx_http_conf_get_module_srv_conf(cf, ngx_http_upstream_module);
87d48f8793b6 Upstream keepalive: reduced diffs to the plus version of nginx.
Roman Arutyunyan <arut@nginx.com>
parents: 5999
diff changeset
521
87d48f8793b6 Upstream keepalive: reduced diffs to the plus version of nginx.
Roman Arutyunyan <arut@nginx.com>
parents: 5999
diff changeset
522 kcf->original_init_upstream = uscf->peer.init_upstream
87d48f8793b6 Upstream keepalive: reduced diffs to the plus version of nginx.
Roman Arutyunyan <arut@nginx.com>
parents: 5999
diff changeset
523 ? uscf->peer.init_upstream
87d48f8793b6 Upstream keepalive: reduced diffs to the plus version of nginx.
Roman Arutyunyan <arut@nginx.com>
parents: 5999
diff changeset
524 : ngx_http_upstream_init_round_robin;
87d48f8793b6 Upstream keepalive: reduced diffs to the plus version of nginx.
Roman Arutyunyan <arut@nginx.com>
parents: 5999
diff changeset
525
87d48f8793b6 Upstream keepalive: reduced diffs to the plus version of nginx.
Roman Arutyunyan <arut@nginx.com>
parents: 5999
diff changeset
526 uscf->peer.init_upstream = ngx_http_upstream_init_keepalive;
87d48f8793b6 Upstream keepalive: reduced diffs to the plus version of nginx.
Roman Arutyunyan <arut@nginx.com>
parents: 5999
diff changeset
527
4127
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
528 return NGX_CONF_OK;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
529 }