Upstream keepalive: reduced diffs to the plus version of nginx.

This commit is contained in:
Roman Arutyunyan 2015-06-04 23:46:44 +03:00
parent e041efc306
commit f5d79ffb82

View File

@ -22,6 +22,18 @@ typedef struct {
} ngx_http_upstream_keepalive_srv_conf_t; } ngx_http_upstream_keepalive_srv_conf_t;
typedef struct {
ngx_http_upstream_keepalive_srv_conf_t *conf;
ngx_queue_t queue;
ngx_connection_t *connection;
socklen_t socklen;
u_char sockaddr[NGX_SOCKADDRLEN];
} ngx_http_upstream_keepalive_cache_t;
typedef struct { typedef struct {
ngx_http_upstream_keepalive_srv_conf_t *conf; ngx_http_upstream_keepalive_srv_conf_t *conf;
@ -40,18 +52,6 @@ typedef struct {
} ngx_http_upstream_keepalive_peer_data_t; } ngx_http_upstream_keepalive_peer_data_t;
typedef struct {
ngx_http_upstream_keepalive_srv_conf_t *conf;
ngx_queue_t queue;
ngx_connection_t *connection;
socklen_t socklen;
u_char sockaddr[NGX_SOCKADDRLEN];
} ngx_http_upstream_keepalive_cache_t;
static ngx_int_t ngx_http_upstream_init_keepalive_peer(ngx_http_request_t *r, static ngx_int_t ngx_http_upstream_init_keepalive_peer(ngx_http_request_t *r,
ngx_http_upstream_srv_conf_t *us); ngx_http_upstream_srv_conf_t *us);
static ngx_int_t ngx_http_upstream_get_keepalive_peer(ngx_peer_connection_t *pc, static ngx_int_t ngx_http_upstream_get_keepalive_peer(ngx_peer_connection_t *pc,
@ -63,7 +63,6 @@ static void ngx_http_upstream_keepalive_dummy_handler(ngx_event_t *ev);
static void ngx_http_upstream_keepalive_close_handler(ngx_event_t *ev); static void ngx_http_upstream_keepalive_close_handler(ngx_event_t *ev);
static void ngx_http_upstream_keepalive_close(ngx_connection_t *c); static void ngx_http_upstream_keepalive_close(ngx_connection_t *c);
#if (NGX_HTTP_SSL) #if (NGX_HTTP_SSL)
static ngx_int_t ngx_http_upstream_keepalive_set_session( static ngx_int_t ngx_http_upstream_keepalive_set_session(
ngx_peer_connection_t *pc, void *data); ngx_peer_connection_t *pc, void *data);
@ -244,6 +243,14 @@ ngx_http_upstream_get_keepalive_peer(ngx_peer_connection_t *pc, void *data)
ngx_queue_remove(q); ngx_queue_remove(q);
ngx_queue_insert_head(&kp->conf->free, q); ngx_queue_insert_head(&kp->conf->free, q);
goto found;
}
}
return NGX_OK;
found:
ngx_log_debug1(NGX_LOG_DEBUG_HTTP, pc->log, 0, ngx_log_debug1(NGX_LOG_DEBUG_HTTP, pc->log, 0,
"get keepalive peer: using connection %p", c); "get keepalive peer: using connection %p", c);
@ -259,10 +266,6 @@ ngx_http_upstream_get_keepalive_peer(ngx_peer_connection_t *pc, void *data)
return NGX_DONE; return NGX_DONE;
} }
}
return NGX_OK;
}
static void static void
@ -322,9 +325,10 @@ ngx_http_upstream_free_keepalive_peer(ngx_peer_connection_t *pc, void *data,
item = ngx_queue_data(q, ngx_http_upstream_keepalive_cache_t, queue); item = ngx_queue_data(q, ngx_http_upstream_keepalive_cache_t, queue);
} }
item->connection = c;
ngx_queue_insert_head(&kp->conf->cache, q); ngx_queue_insert_head(&kp->conf->cache, q);
item->connection = c;
pc->connection = NULL; pc->connection = NULL;
if (c->read->timer_set) { if (c->read->timer_set) {
@ -470,10 +474,9 @@ ngx_http_upstream_keepalive_create_conf(ngx_conf_t *cf)
* *
* conf->original_init_upstream = NULL; * conf->original_init_upstream = NULL;
* conf->original_init_peer = NULL; * conf->original_init_peer = NULL;
* conf->max_cached = 0;
*/ */
conf->max_cached = 1;
return conf; return conf;
} }
@ -487,18 +490,10 @@ ngx_http_upstream_keepalive(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
ngx_int_t n; ngx_int_t n;
ngx_str_t *value; ngx_str_t *value;
uscf = ngx_http_conf_get_module_srv_conf(cf, ngx_http_upstream_module); if (kcf->max_cached) {
if (kcf->original_init_upstream) {
return "is duplicate"; return "is duplicate";
} }
kcf->original_init_upstream = uscf->peer.init_upstream
? uscf->peer.init_upstream
: ngx_http_upstream_init_round_robin;
uscf->peer.init_upstream = ngx_http_upstream_init_keepalive;
/* read options */ /* read options */
value = cf->args->elts; value = cf->args->elts;
@ -514,5 +509,13 @@ ngx_http_upstream_keepalive(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
kcf->max_cached = n; kcf->max_cached = n;
uscf = ngx_http_conf_get_module_srv_conf(cf, ngx_http_upstream_module);
kcf->original_init_upstream = uscf->peer.init_upstream
? uscf->peer.init_upstream
: ngx_http_upstream_init_round_robin;
uscf->peer.init_upstream = ngx_http_upstream_init_keepalive;
return NGX_CONF_OK; return NGX_CONF_OK;
} }