From: Marko Kreen Date: Wed, 14 Mar 2012 10:11:15 +0000 (+0200) Subject: If connect string changes, refresh welcome parameters. X-Git-Tag: pgbouncer_1_5_1_rc1~4 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=13e2d0df69e507e0e25d207e104f17763c284d4d;p=pgbouncer If connect string changes, refresh welcome parameters. 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. --- diff --git a/src/objects.c b/src/objects.c index 098e5d8..3aeb36e 100644 --- a/src/objects.c +++ b/src/objects.c @@ -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); } }