summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarko Kreen2015-08-31 16:58:06 +0000
committerMarko Kreen2015-08-31 16:58:06 +0000
commit9c729257bd59d90dc729d001c55a29a11a4f1e7c (patch)
treed87b65393b97479aa845425c55fa5baa2216375b
parent56ca60ad78e0083053203ac82a4aac90b2fc7b7e (diff)
server_reset_query_always
Do not use server_reset_query for non-session pools. New setting `server_reset_query_always` to restore old behaviour. 1.6 will also have this setting but with different default perhaps.
-rw-r--r--doc/config.rst10
-rw-r--r--etc/pgbouncer.ini5
-rw-r--r--include/bouncer.h1
-rw-r--r--src/main.c2
-rw-r--r--src/objects.c4
5 files changed, 21 insertions, 1 deletions
diff --git a/doc/config.rst b/doc/config.rst
index 07a13f7..5b15f6a 100644
--- a/doc/config.rst
+++ b/doc/config.rst
@@ -403,6 +403,16 @@ that next query will be run on same connection.
Default: DISCARD ALL
+server_reset_query_always
+-------------------------
+
+Whether `server_reset_query`_ should be run in all pooling modes. When this
+setting is off (default), the `server_reset_query`_ will be run only in pools
+that are in sessions-pooling mode. Connections in transaction-pooling mode
+should not have any need for reset query.
+
+Default: 0
+
server_check_delay
------------------
diff --git a/etc/pgbouncer.ini b/etc/pgbouncer.ini
index 8328897..8b43030 100644
--- a/etc/pgbouncer.ini
+++ b/etc/pgbouncer.ini
@@ -93,6 +93,11 @@ pool_mode = session
;
server_reset_query = DISCARD ALL
+
+; Whether server_reset_query should run in all pooling modes.
+; If it is off, server_reset_query is used only for session-pooling.
+;server_reset_query_always = 0
+
;
; Comma-separated list of parameters to ignore when given
; in startup packet. Newer JDBC versions require the
diff --git a/include/bouncer.h b/include/bouncer.h
index 399d7bf..6114c18 100644
--- a/include/bouncer.h
+++ b/include/bouncer.h
@@ -412,6 +412,7 @@ extern usec_t cf_suspend_timeout;
extern usec_t cf_server_lifetime;
extern usec_t cf_server_idle_timeout;
extern char * cf_server_reset_query;
+extern int cf_server_reset_query_always;
extern char * cf_server_check_query;
extern usec_t cf_server_check_delay;
extern usec_t cf_server_connect_timeout;
diff --git a/src/main.c b/src/main.c
index b6c2f28..46b50c4 100644
--- a/src/main.c
+++ b/src/main.c
@@ -100,6 +100,7 @@ int cf_max_db_connections;
int cf_max_user_connections;
char *cf_server_reset_query;
+int cf_server_reset_query_always;
char *cf_server_check_query;
usec_t cf_server_check_delay;
int cf_server_round_robin;
@@ -228,6 +229,7 @@ CF_ABS("user", CF_STR, cf_username, CF_NO_RELOAD, NULL),
CF_ABS("autodb_idle_timeout", CF_TIME_USEC, cf_autodb_idle_timeout, 0, "3600"),
CF_ABS("server_reset_query", CF_STR, cf_server_reset_query, 0, "DISCARD ALL"),
+CF_ABS("server_reset_query_always", CF_INT, cf_server_reset_query_always, 0, "0");
CF_ABS("server_check_query", CF_STR, cf_server_check_query, 0, "select 1"),
CF_ABS("server_check_delay", CF_TIME_USEC, cf_server_check_delay, 0, "30"),
CF_ABS("query_timeout", CF_TIME_USEC, cf_query_timeout, 0, "0"),
diff --git a/src/objects.c b/src/objects.c
index 08f1a84..281c420 100644
--- a/src/objects.c
+++ b/src/objects.c
@@ -697,7 +697,9 @@ bool release_server(PgSocket *server)
server->link->link = NULL;
server->link = NULL;
- if (*cf_server_reset_query) {
+ if (*cf_server_reset_query && (cf_server_reset_query_always ||
+ pool_pool_mode(pool) == POOL_SESSION))
+ {
/* notify reset is required */
newstate = SV_TESTED;
} else if (cf_server_check_delay == 0 && *cf_server_check_query) {