]> granicus.if.org Git - pgbouncer/commitdiff
autodb: drop old connections on config change
authorMarko Kreen <markokr@gmail.com>
Tue, 13 Mar 2012 10:04:15 +0000 (12:04 +0200)
committerMarko Kreen <markokr@gmail.com>
Tue, 13 Mar 2012 10:04:15 +0000 (12:04 +0200)
We already do it for regular databases, but autodb
needs different approach.

Reported-by: Maxim Boguk
include/objects.h
src/loader.c
src/objects.c

index 92e46f248cd255a77279e74b89fcf5934d701f81..218244b5c297a6c0a3180dbab575e3e21f210934 100644 (file)
@@ -67,6 +67,7 @@ int get_active_client_count(void);
 int get_active_server_count(void);
 
 void tag_database_dirty(PgDatabase *db);
+void tag_autodb_dirty(void);
 void tag_host_addr_dirty(const char *host, const struct sockaddr *sa);
 void for_each_server(PgPool *pool, void (*func)(PgSocket *sk));
 
index 6b19d1e4d1e8b38d27dd92bc401c1486e4bfde3b..9b914a6ea73209ca9552ab6d368509f0f65d32c4 100644 (file)
@@ -163,8 +163,11 @@ static void set_autodb(const char *connstr)
                log_warning("no mem to change autodb_connstr");
                return;
        }
-       if (cf_autodb_connstr)
+       if (cf_autodb_connstr) {
+               if (strcmp(connstr, cf_autodb_connstr) != 0)
+                       tag_autodb_dirty();
                free(cf_autodb_connstr);
+       }
        cf_autodb_connstr = tmp;
 }
 
index 04ca32a8fe762ea42d2ec03ff2d18b3a1dba77db..098e5d86f1be19dc77f296eae579196731fe62fd 100644 (file)
@@ -1297,7 +1297,6 @@ static void tag_dirty(PgSocket *sk)
        sk->close_needed = 1;
 }
 
-
 void tag_database_dirty(PgDatabase *db)
 {
        struct List *item;
@@ -1310,6 +1309,18 @@ void tag_database_dirty(PgDatabase *db)
        }
 }
 
+void tag_autodb_dirty(void)
+{
+       struct List *item;
+       PgPool *pool;
+
+       statlist_for_each(item, &pool_list) {
+               pool = container_of(item, PgPool, head);
+               if (pool->db->db_auto)
+                       for_each_server(pool, tag_dirty);
+       }
+}
+
 static bool server_remote_addr_filter(PgSocket *sk, void *arg) {
        PgAddr *addr = arg;