- Accept hostname in host=
- Accept custom unix socket location in host=
- Accept quoted values: password=' asd''foo'
+ * server_reset_query, to be sent immidiately after release
* Cancel pkt sent for idle connection does not drop it anymore,
just ReadyForQuery is re-sent.
* Print FD limits on startup.
== Small stuff ==
* cancel of SUSPEND/PAUSE
- * reset_command to be issued immidiately after release
* suspend_timeout - drop stalled conns
== Low-prio ==
; statement - after statement finishes
pool_mode = session
-; When taking idle server into use, this query is ran first.
;
-; Query for session pooling:
-; ABORT; RESET ALL; SET SESSION AUTHORIZATION DEFAULT
-; Query for statement/transaction pooling:
+; Query for cleaning connection immidiately after releasing from client.
+;
+; Query for 8.3+:
+; DISCARD ALL;
+;
+; Older versions:
+; RESET ALL; SET SESSION AUTHORIZATION DEFAULT
+;
+server_reset_query =
+
+;
+; When taking idle server into use, this query is ran first.
; SELECT 1
-; Empty query disables the functionality
+;
server_check_query = select 1
; If server was used more recently that this many seconds ago,
-; skip the check query. If 0, the check query is always ran.
+; skip the check query. Value 0 may or may not run in immidiately.
server_check_delay = 10
;;;
extern usec_t cf_server_lifetime;
extern usec_t cf_server_idle_timeout;
+extern char * cf_server_reset_query;
extern char * cf_server_check_query;
extern usec_t cf_server_check_delay;
extern usec_t cf_server_connect_timeout;
int cf_max_client_conn = 20;
int cf_default_pool_size = 10;
+char *cf_server_reset_query = "";
char *cf_server_check_query = "select 1";
usec_t cf_server_check_delay = 30 * USEC;
{"max_client_conn", true, CF_INT, &cf_max_client_conn},
{"default_pool_size", true, CF_INT, &cf_default_pool_size},
+{"server_reset_query", true, CF_STR, &cf_server_reset_query},
{"server_check_query", true, CF_STR, &cf_server_check_query},
{"server_check_delay", true, CF_TIME, &cf_server_check_delay},
{"query_timeout", true, CF_TIME, &cf_query_timeout},
return res;
}
+/* pick waiting client */
+static bool reuse_on_release(PgSocket *server)
+{
+ bool res = true;
+ PgPool *pool = server->pool;
+ PgSocket *client = first_socket(&pool->waiting_client_list);
+ if (client) {
+ activate_client(client);
+
+ /*
+ * As the activate_client() does full read loop,
+ * then it may happen that linked client close
+ * couses server close. Report it.
+ */
+ if (server->state == SV_FREE || server->state == SV_JUSTFREE)
+ res = false;
+ }
+ return res;
+}
+
+/* send reset query */
+static bool reset_on_release(PgSocket *server)
+{
+ bool res;
+ slog_debug(server, "Resetting: %s", cf_server_reset_query);
+ SEND_generic(res, server, 'Q', "s", cf_server_reset_query);
+ if (!res)
+ disconnect_server(server, false, "reset query failed");
+ return res;
+}
+
/* connecting/active -> idle, unlink if needed */
bool release_server(PgSocket *server)
{
server->link->link = NULL;
server->link = NULL;
- if (cf_server_check_delay == 0 && *cf_server_check_query)
+ if (*cf_server_reset_query)
+ /* notify reset is required */
+ newstate = SV_TESTED;
+ else if (cf_server_check_delay == 0 && *cf_server_check_query)
+ /*
+ * depreceted: before reset_query, the check_delay = 0
+ * was used to get same effect. This if() can be removed
+ * after couple of releases.
+ */
newstate = SV_USED;
case SV_USED:
case SV_TESTED:
}
Assert(server->link == NULL);
-
log_debug("release_server: new state=%d", newstate);
-
change_server_state(server, newstate);
- /* immediately process waiters, to give fair chance */
- if (newstate == SV_IDLE) {
- PgSocket *client = first_socket(&pool->waiting_client_list);
- if (client) {
- activate_client(client);
+ if (newstate == SV_IDLE)
+ /* immediately process waiters, to give fair chance */
+ return reuse_on_release(server);
+ else if (newstate == SV_TESTED)
+ return reset_on_release(server);
- /*
- * As the activate_client() does full read loop,
- * then it may happen that linked client close
- * couses server close. Report it.
- */
- switch (server->state) {
- case SV_FREE:
- case SV_JUSTFREE:
- return false;
- default:
- break;
- }
- }
- }
return true;
}