From bb22310e7cca37d09157d407e4a8c1bbae23e681 Mon Sep 17 00:00:00 2001 From: Marko Kreen Date: Fri, 31 Jul 2015 16:08:29 +0300 Subject: [PATCH] Disable server_idle_timeout when server count gets below min_pool (#60) --- include/bouncer.h | 7 +++++-- src/janitor.c | 15 +++------------ 2 files changed, 8 insertions(+), 14 deletions(-) diff --git a/include/bouncer.h b/include/bouncer.h index dfd792a..e2dedaa 100644 --- a/include/bouncer.h +++ b/include/bouncer.h @@ -220,13 +220,16 @@ struct PgPool { unsigned welcome_msg_ready:1; }; -#define pool_server_count(pool) ( \ +#define pool_connected_server_count(pool) ( \ statlist_count(&(pool)->active_server_list) + \ statlist_count(&(pool)->idle_server_list) + \ - statlist_count(&(pool)->new_server_list) + \ statlist_count(&(pool)->tested_server_list) + \ statlist_count(&(pool)->used_server_list)) +#define pool_server_count(pool) ( \ + pool_connected_server_count(pool) + \ + statlist_count(&(pool)->new_server_list)) + #define pool_client_count(pool) ( \ statlist_count(&(pool)->active_client_list) + \ statlist_count(&(pool)->waiting_client_list)) diff --git a/src/janitor.c b/src/janitor.c index b29b4be..7883f23 100644 --- a/src/janitor.c +++ b/src/janitor.c @@ -392,7 +392,8 @@ static void check_unused_servers(PgPool *pool, struct StatList *slist, bool idle disconnect_server(server, true, "SV_IDLE server got dirty"); } else if (server->state == SV_USED && !server->ready) { disconnect_server(server, true, "SV_USED server got dirty"); - } else if (cf_server_idle_timeout > 0 && idle > cf_server_idle_timeout) { + } else if (cf_server_idle_timeout > 0 && idle > cf_server_idle_timeout + && (cf_min_pool_size == 0 || pool_connected_server_count(pool) > cf_min_pool_size)) { disconnect_server(server, true, "server idle timeout"); } else if (age >= cf_server_lifetime) { if (pool->last_lifetime_disconnect + lifetime_kill_gap <= now) { @@ -415,17 +416,7 @@ static void check_unused_servers(PgPool *pool, struct StatList *slist, bool idle static void check_pool_size(PgPool *pool) { PgSocket *server; - int cur = statlist_count(&pool->active_server_list) - + statlist_count(&pool->idle_server_list) - + statlist_count(&pool->used_server_list) - + statlist_count(&pool->tested_server_list); - - /* cancel pkt may create new srv conn without - * taking pool_size into account - * - * statlist_count(&pool->new_server_list) - */ - + int cur = pool_connected_server_count(pool); int many = cur - (pool->db->pool_size + pool->db->res_pool_size); Assert(pool->db->pool_size >= 0); -- 2.39.5