]> granicus.if.org Git - pgbouncer/commitdiff
fix auth_user with session pooling
authorCody Cutrer <cody@cutrer.us>
Thu, 28 Feb 2013 15:54:04 +0000 (08:54 -0700)
committerCody Cutrer <cody@instructure.com>
Mon, 7 Oct 2013 21:34:51 +0000 (15:34 -0600)
the auth_user pool wasn't releasing the server conn, so the
client would end up connected to the db as the auth_user

include/bouncer.h
src/client.c
src/server.c

index bfeb0b28b20ed62f116f9b498d7021c42968990c..4679cf20d315ae081d16f1b86aedf36738e2c88c 100644 (file)
@@ -311,6 +311,7 @@ struct PgSocket {
        bool close_needed:1;    /* server: this socket must be closed ASAP */
        bool setting_vars:1;    /* server: setting client vars */
        bool exec_on_connect:1; /* server: executing connect_query */
+       bool resetting:1;       /* server: executing reset query from auth login; don't release on flush */
 
        bool wait_for_welcome:1;/* client: no server yet in pool, cannot send welcome msg */
        bool wait_for_user_conn:1;/* client: waiting for auth_conn server connection */
index 4ea6d724b469ab753071549cbd6f609f4eb73ce5..66bb46e5247c35986f2e022231ee2b5b77d32e3b 100644 (file)
@@ -288,6 +288,7 @@ bool handle_auth_response(PgSocket *client, PktHdr *pkt) {
                        disconnect_client(client, true, "No such user");
                } else {
                        slog_noise(client, "auth query complete");
+                       client->link->resetting = true;
                        sbuf_continue(&client->sbuf);
                }
                return true;
index 9a1e3e96bf20a225701e75eeefe78facca3eb770..bbc6982d30b45cc348cd0f604f425d3b7f4fb1fb 100644 (file)
@@ -432,7 +432,8 @@ bool server_proto(SBuf *sbuf, SBufEvent evtype, struct MBuf *data)
                        break;
                }
 
-               if (pool_pool_mode(pool)  != POOL_SESSION || server->state == SV_TESTED) {
+               if (pool_pool_mode(pool)  != POOL_SESSION || server->state == SV_TESTED || server->resetting) {
+                       server->resetting = false;
                        switch (server->state) {
                        case SV_ACTIVE:
                        case SV_TESTED: