annotate src/http/modules/ngx_http_upstream_keepalive_module.c @ 5999:4d8936b1fc32

Upstream keepalive: drop ready flag on EAGAIN from recv(MSG_PEEK). Keeping the ready flag in this case might results in missing notification of broken connection until nginx tried to use it again. While there, stale comment about stale event was removed since this function is also can be called directly.
author Valentin Bartenev <vbart@nginx.com>
date Tue, 03 Mar 2015 17:48:57 +0300
parents 39befd3c0d84
children 87d48f8793b6
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
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
28 ngx_http_upstream_t *upstream;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
29
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
30 void *data;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
31
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
32 ngx_event_get_peer_pt original_get_peer;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
33 ngx_event_free_peer_pt original_free_peer;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
34
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
35 #if (NGX_HTTP_SSL)
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
36 ngx_event_set_peer_session_pt original_set_session;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
37 ngx_event_save_peer_session_pt original_save_session;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
38 #endif
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
39
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
40 } ngx_http_upstream_keepalive_peer_data_t;
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
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
43 typedef struct {
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
44 ngx_http_upstream_keepalive_srv_conf_t *conf;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
45
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
46 ngx_queue_t queue;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
47 ngx_connection_t *connection;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
48
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
49 socklen_t socklen;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
50 u_char sockaddr[NGX_SOCKADDRLEN];
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_cache_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
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
67 #if (NGX_HTTP_SSL)
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
68 static ngx_int_t ngx_http_upstream_keepalive_set_session(
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
69 ngx_peer_connection_t *pc, void *data);
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
70 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
71 void *data);
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
72 #endif
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
73
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
74 static void *ngx_http_upstream_keepalive_create_conf(ngx_conf_t *cf);
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
75 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
76 void *conf);
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
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
79 static ngx_command_t ngx_http_upstream_keepalive_commands[] = {
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
80
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
81 { ngx_string("keepalive"),
5830
3e5b630e0ec9 Upstream keepalive: removed "single" parameter remnants.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5213
diff changeset
82 NGX_HTTP_UPS_CONF|NGX_CONF_TAKE1,
4127
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
83 ngx_http_upstream_keepalive,
5213
822b82191940 Upstream keepalive: slightly simplified code.
Ruslan Ermilov <ru@nginx.com>
parents: 5133
diff changeset
84 NGX_HTTP_SRV_CONF_OFFSET,
4127
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
85 0,
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
86 NULL },
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
87
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
88 ngx_null_command
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
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
92 static ngx_http_module_t ngx_http_upstream_keepalive_module_ctx = {
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
93 NULL, /* preconfiguration */
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
94 NULL, /* postconfiguration */
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
95
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
96 NULL, /* create main configuration */
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
97 NULL, /* init main configuration */
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
98
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
99 ngx_http_upstream_keepalive_create_conf, /* create server configuration */
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
100 NULL, /* merge server configuration */
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
101
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
102 NULL, /* create location configuration */
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
103 NULL /* merge location configuration */
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
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
107 ngx_module_t ngx_http_upstream_keepalive_module = {
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
108 NGX_MODULE_V1,
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
109 &ngx_http_upstream_keepalive_module_ctx, /* module context */
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
110 ngx_http_upstream_keepalive_commands, /* module directives */
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
111 NGX_HTTP_MODULE, /* module type */
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
112 NULL, /* init master */
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
113 NULL, /* init module */
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
114 NULL, /* init process */
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
115 NULL, /* init thread */
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
116 NULL, /* exit thread */
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
117 NULL, /* exit process */
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
118 NULL, /* exit master */
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
119 NGX_MODULE_V1_PADDING
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
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
123 static ngx_int_t
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
124 ngx_http_upstream_init_keepalive(ngx_conf_t *cf,
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
125 ngx_http_upstream_srv_conf_t *us)
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
126 {
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
127 ngx_uint_t i;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
128 ngx_http_upstream_keepalive_srv_conf_t *kcf;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
129 ngx_http_upstream_keepalive_cache_t *cached;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
130
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
131 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, cf->log, 0,
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
132 "init keepalive");
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
133
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
134 kcf = ngx_http_conf_upstream_srv_conf(us,
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
135 ngx_http_upstream_keepalive_module);
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
136
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
137 if (kcf->original_init_upstream(cf, us) != NGX_OK) {
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
138 return NGX_ERROR;
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
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
141 kcf->original_init_peer = us->peer.init;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
142
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
143 us->peer.init = ngx_http_upstream_init_keepalive_peer;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
144
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
145 /* allocate cache items and add to free queue */
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
146
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
147 cached = ngx_pcalloc(cf->pool,
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
148 sizeof(ngx_http_upstream_keepalive_cache_t) * kcf->max_cached);
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
149 if (cached == NULL) {
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
150 return NGX_ERROR;
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
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
153 ngx_queue_init(&kcf->cache);
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
154 ngx_queue_init(&kcf->free);
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
155
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
156 for (i = 0; i < kcf->max_cached; i++) {
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
157 ngx_queue_insert_head(&kcf->free, &cached[i].queue);
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
158 cached[i].conf = kcf;
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
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
161 return NGX_OK;
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
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
165 static ngx_int_t
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
166 ngx_http_upstream_init_keepalive_peer(ngx_http_request_t *r,
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
167 ngx_http_upstream_srv_conf_t *us)
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
168 {
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
169 ngx_http_upstream_keepalive_peer_data_t *kp;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
170 ngx_http_upstream_keepalive_srv_conf_t *kcf;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
171
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
172 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
173 "init keepalive peer");
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
174
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
175 kcf = ngx_http_conf_upstream_srv_conf(us,
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
176 ngx_http_upstream_keepalive_module);
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
177
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
178 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
179 if (kp == NULL) {
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
180 return NGX_ERROR;
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
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
183 if (kcf->original_init_peer(r, us) != NGX_OK) {
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
184 return NGX_ERROR;
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
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
187 kp->conf = kcf;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
188 kp->upstream = r->upstream;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
189 kp->data = r->upstream->peer.data;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
190 kp->original_get_peer = r->upstream->peer.get;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
191 kp->original_free_peer = r->upstream->peer.free;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
192
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
193 r->upstream->peer.data = kp;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
194 r->upstream->peer.get = ngx_http_upstream_get_keepalive_peer;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
195 r->upstream->peer.free = ngx_http_upstream_free_keepalive_peer;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
196
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
197 #if (NGX_HTTP_SSL)
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
198 kp->original_set_session = r->upstream->peer.set_session;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
199 kp->original_save_session = r->upstream->peer.save_session;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
200 r->upstream->peer.set_session = ngx_http_upstream_keepalive_set_session;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
201 r->upstream->peer.save_session = ngx_http_upstream_keepalive_save_session;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
202 #endif
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
203
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
204 return NGX_OK;
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
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
208 static ngx_int_t
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
209 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
210 {
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
211 ngx_http_upstream_keepalive_peer_data_t *kp = data;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
212 ngx_http_upstream_keepalive_cache_t *item;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
213
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
214 ngx_int_t rc;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
215 ngx_queue_t *q, *cache;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
216 ngx_connection_t *c;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
217
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
218 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, pc->log, 0,
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
219 "get keepalive peer");
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
220
4694
5b5c07dee156 Upstream keepalive: "single" parameter deprecated.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4412
diff changeset
221 /* ask balancer */
4127
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
222
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
223 rc = kp->original_get_peer(pc, kp->data);
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
224
4694
5b5c07dee156 Upstream keepalive: "single" parameter deprecated.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4412
diff changeset
225 if (rc != NGX_OK) {
4127
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
226 return rc;
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
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
229 /* search cache for suitable connection */
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
230
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
231 cache = &kp->conf->cache;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
232
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
233 for (q = ngx_queue_head(cache);
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
234 q != ngx_queue_sentinel(cache);
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
235 q = ngx_queue_next(q))
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
236 {
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
237 item = ngx_queue_data(q, ngx_http_upstream_keepalive_cache_t, queue);
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
238 c = item->connection;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
239
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
240 if (ngx_memn2cmp((u_char *) &item->sockaddr, (u_char *) pc->sockaddr,
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
241 item->socklen, pc->socklen)
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
242 == 0)
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
243 {
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
244 ngx_queue_remove(q);
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
245 ngx_queue_insert_head(&kp->conf->free, q);
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
246
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
247 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, pc->log, 0,
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
248 "get keepalive peer: using connection %p", c);
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 c->idle = 0;
5864
39befd3c0d84 Upstream keepalive: reset c->sent on cached connections.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5830
diff changeset
251 c->sent = 0;
4127
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
252 c->log = pc->log;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
253 c->read->log = pc->log;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
254 c->write->log = pc->log;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
255 c->pool->log = pc->log;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
256
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
257 pc->connection = c;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
258 pc->cached = 1;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
259
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
260 return NGX_DONE;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
261 }
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
262 }
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
263
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
264 return NGX_OK;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
265 }
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
266
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
267
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
268 static void
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
269 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
270 ngx_uint_t state)
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
271 {
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
272 ngx_http_upstream_keepalive_peer_data_t *kp = data;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
273 ngx_http_upstream_keepalive_cache_t *item;
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_queue_t *q;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
276 ngx_connection_t *c;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
277 ngx_http_upstream_t *u;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
278
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
279 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, pc->log, 0,
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
280 "free keepalive peer");
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 /* cache valid connections */
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
283
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
284 u = kp->upstream;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
285 c = pc->connection;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
286
5133
089a662c17d1 Upstream: removed double-free workarounds in peer.free() methods.
Ruslan Ermilov <ru@nginx.com>
parents: 4998
diff changeset
287 if (state & NGX_PEER_FAILED
4127
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
288 || c == NULL
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
289 || c->read->eof
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
290 || c->read->error
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
291 || c->read->timedout
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
292 || c->write->error
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
293 || c->write->timedout)
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
294 {
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
295 goto invalid;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
296 }
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 if (!u->keepalive) {
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
299 goto invalid;
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
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
302 if (ngx_handle_read_event(c->read, 0) != NGX_OK) {
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
303 goto invalid;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
304 }
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
305
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
306 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, pc->log, 0,
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
307 "free keepalive peer: saving connection %p", c);
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
308
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
309 if (ngx_queue_empty(&kp->conf->free)) {
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
310
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
311 q = ngx_queue_last(&kp->conf->cache);
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
312 ngx_queue_remove(q);
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
313
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
314 item = ngx_queue_data(q, ngx_http_upstream_keepalive_cache_t, queue);
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 ngx_http_upstream_keepalive_close(item->connection);
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
317
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
318 } else {
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
319 q = ngx_queue_head(&kp->conf->free);
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
320 ngx_queue_remove(q);
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 item = ngx_queue_data(q, ngx_http_upstream_keepalive_cache_t, queue);
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
323 }
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->connection = c;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
326 ngx_queue_insert_head(&kp->conf->cache, q);
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
327
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
328 pc->connection = NULL;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
329
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
330 if (c->read->timer_set) {
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
331 ngx_del_timer(c->read);
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 if (c->write->timer_set) {
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
334 ngx_del_timer(c->write);
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
335 }
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
336
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
337 c->write->handler = ngx_http_upstream_keepalive_dummy_handler;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
338 c->read->handler = ngx_http_upstream_keepalive_close_handler;
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 c->data = item;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
341 c->idle = 1;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
342 c->log = ngx_cycle->log;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
343 c->read->log = ngx_cycle->log;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
344 c->write->log = ngx_cycle->log;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
345 c->pool->log = ngx_cycle->log;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
346
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
347 item->socklen = pc->socklen;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
348 ngx_memcpy(&item->sockaddr, pc->sockaddr, pc->socklen);
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
349
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
350 if (c->read->ready) {
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
351 ngx_http_upstream_keepalive_close_handler(c->read);
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
352 }
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
353
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
354 invalid:
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
355
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
356 kp->original_free_peer(pc, kp->data, state);
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
357 }
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
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
360 static void
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
361 ngx_http_upstream_keepalive_dummy_handler(ngx_event_t *ev)
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
362 {
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
363 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, ev->log, 0,
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
364 "keepalive dummy handler");
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
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 static void
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
369 ngx_http_upstream_keepalive_close_handler(ngx_event_t *ev)
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 ngx_http_upstream_keepalive_srv_conf_t *conf;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
372 ngx_http_upstream_keepalive_cache_t *item;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
373
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
374 int n;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
375 char buf[1];
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
376 ngx_connection_t *c;
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 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, ev->log, 0,
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
379 "keepalive close handler");
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
380
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
381 c = ev->data;
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 if (c->close) {
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
384 goto close;
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
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
387 n = recv(c->fd, buf, 1, MSG_PEEK);
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
388
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
389 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
390 ev->ready = 0;
4127
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
391
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
392 if (ngx_handle_read_event(c->read, 0) != NGX_OK) {
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
393 goto close;
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
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
396 return;
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 close:
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 item = c->data;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
402 conf = item->conf;
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 ngx_http_upstream_keepalive_close(c);
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
405
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
406 ngx_queue_remove(&item->queue);
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
407 ngx_queue_insert_head(&conf->free, &item->queue);
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
408 }
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 static void
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
412 ngx_http_upstream_keepalive_close(ngx_connection_t *c)
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
413 {
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
414
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
415 #if (NGX_HTTP_SSL)
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
416
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
417 if (c->ssl) {
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
418 c->ssl->no_wait_shutdown = 1;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
419 c->ssl->no_send_shutdown = 1;
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 if (ngx_ssl_shutdown(c) == NGX_AGAIN) {
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
422 c->ssl->handler = ngx_http_upstream_keepalive_close;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
423 return;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
424 }
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 #endif
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 ngx_destroy_pool(c->pool);
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
430 ngx_close_connection(c);
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
431 }
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
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
434 #if (NGX_HTTP_SSL)
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
435
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
436 static ngx_int_t
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
437 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
438 {
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
439 ngx_http_upstream_keepalive_peer_data_t *kp = data;
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 return kp->original_set_session(pc, kp->data);
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
442 }
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 static void
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
446 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
447 {
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
448 ngx_http_upstream_keepalive_peer_data_t *kp = data;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
449
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
450 kp->original_save_session(pc, kp->data);
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
451 return;
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
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
454 #endif
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_create_conf(ngx_conf_t *cf)
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_srv_conf_t *conf;
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 conf = ngx_pcalloc(cf->pool,
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
463 sizeof(ngx_http_upstream_keepalive_srv_conf_t));
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
464 if (conf == NULL) {
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
465 return NULL;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
466 }
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 * set by ngx_pcalloc():
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
470 *
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
471 * conf->original_init_upstream = NULL;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
472 * conf->original_init_peer = NULL;
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
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
475 conf->max_cached = 1;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
476
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
477 return conf;
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 static char *
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
482 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
483 {
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
484 ngx_http_upstream_srv_conf_t *uscf;
5213
822b82191940 Upstream keepalive: slightly simplified code.
Ruslan Ermilov <ru@nginx.com>
parents: 5133
diff changeset
485 ngx_http_upstream_keepalive_srv_conf_t *kcf = conf;
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 ngx_int_t n;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
488 ngx_str_t *value;
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 uscf = ngx_http_conf_get_module_srv_conf(cf, ngx_http_upstream_module);
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
491
4998
82336a9ce26d Upstream keepalive: detect duplicate "keepalive" directive.
Ruslan Ermilov <ru@nginx.com>
parents: 4694
diff changeset
492 if (kcf->original_init_upstream) {
82336a9ce26d Upstream keepalive: detect duplicate "keepalive" directive.
Ruslan Ermilov <ru@nginx.com>
parents: 4694
diff changeset
493 return "is duplicate";
82336a9ce26d Upstream keepalive: detect duplicate "keepalive" directive.
Ruslan Ermilov <ru@nginx.com>
parents: 4694
diff changeset
494 }
82336a9ce26d Upstream keepalive: detect duplicate "keepalive" directive.
Ruslan Ermilov <ru@nginx.com>
parents: 4694
diff changeset
495
4127
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
496 kcf->original_init_upstream = uscf->peer.init_upstream
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
497 ? uscf->peer.init_upstream
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
498 : ngx_http_upstream_init_round_robin;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
499
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
500 uscf->peer.init_upstream = ngx_http_upstream_init_keepalive;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
501
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
502 /* read options */
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
503
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
504 value = cf->args->elts;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
505
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
506 n = ngx_atoi(value[1].data, value[1].len);
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
507
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
508 if (n == NGX_ERROR || n == 0) {
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
509 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
510 "invalid value \"%V\" in \"%V\" directive",
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
511 &value[1], &cmd->name);
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
512 return NGX_CONF_ERROR;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
513 }
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
514
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
515 kcf->max_cached = n;
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 return NGX_CONF_OK;
b2e21a39307c Upstream keepalive module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
518 }