Disable server_idle_timeout when server count gets below min_pool (#60)
authorMarko Kreen <markokr@gmail.com>
Fri, 31 Jul 2015 13:08:29 +0000 (16:08 +0300)
committerMarko Kreen <markokr@gmail.com>
Fri, 31 Jul 2015 13:08:29 +0000 (16:08 +0300)
include/bouncer.h
src/janitor.c

index dfd792ae4156cc85bda8a11235f053206264292c..e2dedaa88c1d11ef379cc60bfed252cf3e502c80 100644 (file)
@@ -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))
index b29b4bedce2844e7eed5650cb095f91c66c57f45..7883f233da6988b0266e944ef17e7a4846037ccc 100644 (file)
@@ -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);