From 13e2d0df69e507e0e25d207e104f17763c284d4d Mon Sep 17 00:00:00 2001 From: Marko Kreen Date: Wed, 14 Mar 2012 12:11:15 +0200 Subject: [PATCH] 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. --- src/objects.c | 26 ++++++++++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) 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); } } -- 2.40.0