]> granicus.if.org Git - pgbouncer/commitdiff
Proper invalidation for autodbs
authorMarko Kreen <markokr@gmail.com>
Fri, 15 Nov 2013 16:18:44 +0000 (18:18 +0200)
committerMarko Kreen <markokr@gmail.com>
Fri, 15 Nov 2013 16:18:44 +0000 (18:18 +0200)
As autodb database entries are generated on the fly,
old invalidation code skipped them, so new config
was ignored.  This will hopefully fix it.

Reported-by: Moshe Jacobson
src/loader.c
src/objects.c

index 870ddf8b879bfc234c595e1a276ded9fb4c33830..7f0ef21de06265bc88d224e6084489abb65f6db7 100644 (file)
@@ -159,16 +159,19 @@ static void set_connect_query(PgDatabase *db, const char *new)
 static void set_autodb(const char *connstr)
 {
        char *tmp = strdup(connstr);
+       char *old = cf_autodb_connstr;
+
        if (!tmp) {
                log_warning("no mem to change autodb_connstr");
                return;
        }
-       if (cf_autodb_connstr) {
-               if (strcmp(connstr, cf_autodb_connstr) != 0)
+
+       cf_autodb_connstr = tmp;
+       if (old) {
+               if (strcmp(connstr, old) != 0)
                        tag_autodb_dirty();
-               free(cf_autodb_connstr);
+               free(old);
        }
-       cf_autodb_connstr = tmp;
 }
 
 /* fill PgDatabase from connstr */
index b48f7740040981d2e58468550db8740a14a21f82..eca926b3f85ae5153ec81a337fba0db1d56843ce 100644 (file)
@@ -1347,9 +1347,26 @@ void tag_database_dirty(PgDatabase *db)
 
 void tag_autodb_dirty(void)
 {
-       struct List *item;
+       struct List *item, *tmp;
+       PgDatabase *db;
        PgPool *pool;
 
+       /*
+        * reload databases.
+        */
+       statlist_for_each(item, &database_list) {
+               db = container_of(item, PgDatabase, head);
+               if (db->db_auto)
+                       register_auto_database(db->name);
+       }
+       statlist_for_each_safe(item, &autodatabase_idle_list, tmp) {
+               db = container_of(item, PgDatabase, head);
+               if (db->db_auto)
+                       register_auto_database(db->name);
+       }
+       /*
+        * reload pools
+        */
        statlist_for_each(item, &pool_list) {
                pool = container_of(item, PgPool, head);
                if (pool->db->db_auto)