]> granicus.if.org Git - pgbouncer/commitdiff
If connect string changes, refresh welcome parameters.
authorMarko Kreen <markokr@gmail.com>
Wed, 14 Mar 2012 10:11:15 +0000 (12:11 +0200)
committerMarko Kreen <markokr@gmail.com>
Wed, 14 Mar 2012 10:11:15 +0000 (12:11 +0200)
This is mainly needed when new server is differenct version
of Postgres.  Previously PgBouncer kept reporting old
version which confuses clients.

It would be even better to detect version change without
the connect string change and without reload, but that
will require quite complex logic.  Lets use simple fix first.

src/objects.c

index 098e5d86f1be19dc77f296eae579196731fe62fd..3aeb36e8220ddc1a58109ea7301ba629c62d7df6 100644 (file)
@@ -1297,6 +1297,28 @@ static void tag_dirty(PgSocket *sk)
        sk->close_needed = 1;
 }
 
+static void tag_pool_dirty(PgPool *pool)
+{
+       struct List *item, *tmp;
+       struct PgSocket *server;
+
+       /* reset welcome msg */
+       if (pool->welcome_msg) {
+               pktbuf_free(pool->welcome_msg);
+               pool->welcome_msg = NULL;
+       }
+       pool->welcome_msg_ready = 0;
+
+       /* drop all existing servers ASAP */
+       for_each_server(pool, tag_dirty);
+
+       /* drop servers login phase immediately */
+       statlist_for_each_safe(item, &pool->new_server_list, tmp) {
+               server = container_of(item, PgSocket, head);
+               disconnect_server(server, true, "connect string changed");
+       }
+}
+
 void tag_database_dirty(PgDatabase *db)
 {
        struct List *item;
@@ -1305,7 +1327,7 @@ void tag_database_dirty(PgDatabase *db)
        statlist_for_each(item, &pool_list) {
                pool = container_of(item, PgPool, head);
                if (pool->db == db)
-                       for_each_server(pool, tag_dirty);
+                       tag_pool_dirty(pool);
        }
 }
 
@@ -1317,7 +1339,7 @@ void tag_autodb_dirty(void)
        statlist_for_each(item, &pool_list) {
                pool = container_of(item, PgPool, head);
                if (pool->db->db_auto)
-                       for_each_server(pool, tag_dirty);
+                       tag_pool_dirty(pool);
        }
 }