diff --git a/src/nc_conf.c b/src/nc_conf.c index fa720796..055b6989 100644 --- a/src/nc_conf.c +++ b/src/nc_conf.c @@ -1232,7 +1232,9 @@ conf_validate_pool(struct conf *cf, struct conf_pool *cp) cp->backlog = CONF_DEFAULT_LISTEN_BACKLOG; } - cp->client_connections = CONF_DEFAULT_CLIENT_CONNECTIONS; + if (cp->client_connections == CONF_UNSET_NUM) { + cp->client_connections = CONF_DEFAULT_CLIENT_CONNECTIONS; + } if (cp->redis == CONF_UNSET_NUM) { cp->redis = CONF_DEFAULT_REDIS; diff --git a/src/nc_proxy.c b/src/nc_proxy.c index 38cdd9e6..793acf49 100644 --- a/src/nc_proxy.c +++ b/src/nc_proxy.c @@ -336,6 +336,20 @@ proxy_accept(struct context *ctx, struct conn *p) return NC_OK; } + if (pool->client_connections && (pool->nc_conn_q + 1 > pool->client_connections)) { + log_debug(LOG_CRIT, + "pool client connections %"PRIu32" exceed limit %"PRIu32 + " in pool %"PRIu32" '%.*s'", + pool->nc_conn_q, pool->client_connections, + pool->idx, pool->name.len, pool->name.data); + status = close(sd); + if (status < 0) { + log_error("close c %d failed, ignored: %s", sd, strerror(errno)); + } + + return NC_OK; + } + c = conn_get(p->owner, true, p->redis); if (c == NULL) { log_error("get conn for c %d from p %d failed: %s", sd, p->sd,