Upstream keepalive: "single" parameter deprecated.

The original idea was to optimize edge cases in case of interchangeable
backends, i.e. don't establish a new connection if we have any one
cached.  This causes more harm than good though, as it screws up
underlying balancer's idea about backends used and may result in
various unexpected problems.
This commit is contained in:
Maxim Dounin 2012-06-18 14:23:42 +00:00
parent 91c654debc
commit 29844cd55c

View File

@ -12,7 +12,6 @@
typedef struct { typedef struct {
ngx_uint_t max_cached; ngx_uint_t max_cached;
ngx_uint_t single; /* unsigned:1 */
ngx_queue_t cache; ngx_queue_t cache;
ngx_queue_t free; ngx_queue_t free;
@ -223,36 +222,11 @@ ngx_http_upstream_get_keepalive_peer(ngx_peer_connection_t *pc, void *data)
kp->failed = 0; kp->failed = 0;
/* single pool of cached connections */ /* ask balancer */
if (kp->conf->single && !ngx_queue_empty(&kp->conf->cache)) {
q = ngx_queue_head(&kp->conf->cache);
item = ngx_queue_data(q, ngx_http_upstream_keepalive_cache_t, queue);
c = item->connection;
ngx_queue_remove(q);
ngx_queue_insert_head(&kp->conf->free, q);
ngx_log_debug1(NGX_LOG_DEBUG_HTTP, pc->log, 0,
"get keepalive peer: using connection %p", c);
c->idle = 0;
c->log = pc->log;
c->read->log = pc->log;
c->write->log = pc->log;
c->pool->log = pc->log;
pc->connection = c;
pc->cached = 1;
return NGX_DONE;
}
rc = kp->original_get_peer(pc, kp->data); rc = kp->original_get_peer(pc, kp->data);
if (kp->conf->single || rc != NGX_OK) { if (rc != NGX_OK) {
return rc; return rc;
} }
@ -552,7 +526,8 @@ ngx_http_upstream_keepalive(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
for (i = 2; i < cf->args->nelts; i++) { for (i = 2; i < cf->args->nelts; i++) {
if (ngx_strcmp(value[i].data, "single") == 0) { if (ngx_strcmp(value[i].data, "single") == 0) {
kcf->single = 1; ngx_conf_log_error(NGX_LOG_WARN, cf, 0,
"the \"single\" parameter is deprecated");
continue; continue;
} }