]> granicus.if.org Git - pgbouncer/commitdiff
new drop_on_error param
authorMarko Kreen <markokr@gmail.com>
Fri, 1 Aug 2008 10:10:11 +0000 (10:10 +0000)
committerMarko Kreen <markokr@gmail.com>
Fri, 1 Aug 2008 10:10:11 +0000 (10:10 +0000)
doc/config.txt
doc/todo.txt
include/bouncer.h
src/main.c
src/objects.c
src/server.c

index a91fab7a5a038bb5b7319a6de80e82af523e9037..f8fdb8db1e98f050aa26c6e30224a63d286fae98 100644 (file)
@@ -273,6 +273,13 @@ online restart.
 
 Default: 60
 
+==== drop_on_error ====
+
+If error appears from server, the connection will not be reused but dropped
+immediately.  Set to 0 if errors from server are normal for your workflow.
+
+Default: 1
+
 === Dangerous timeouts ===
 
 Setting following timeouts cause unexcpected errors.
index 9296d6279f1e8b1bc85bd93cf476fc1dee7150d1..f5d418a19484037decfb1dcb3a72edab5476a29c 100644 (file)
@@ -24,8 +24,6 @@
  * Move all "look-at-full-packet" situtations to SBUF_EV_PKT_CALLBACK
  * auth_conn - access to pg_shadow, so auth_file is not needed
  * maybe libevent calls should look at errno? (esp. event_del())
- * drop_on_error/keep_on_error - if released conn is in error state,
-   then issue rollback and keep it
 
 === prepared plans ===
 
index e398a2649959d789bcd5148d017569ba8d5a118a..e0d4be15259688b65a695e68d501b4601dcfc0b8 100644 (file)
@@ -327,6 +327,7 @@ extern char *cf_logfile;
 extern char *cf_pidfile;
 
 extern char *cf_ignore_startup_params;
+extern int cf_drop_on_error;
 
 extern char *cf_admin_users;
 extern char *cf_stats_users;
index f19d147979f090db156cfce1bdafe99f8134b747..3ba41e04ccfa179472f445cb2b23078688f9e6ef 100644 (file)
@@ -95,6 +95,7 @@ usec_t cf_server_check_delay = 30 * USEC;
 int cf_server_round_robin = 0;
 
 char *cf_ignore_startup_params = "";
+int cf_drop_on_error = 1;
 
 usec_t cf_server_lifetime = 60*60*USEC;
 usec_t cf_server_idle_timeout = 10*60*USEC;
@@ -152,6 +153,7 @@ ConfElem bouncer_params[] = {
 {"server_round_robin", true, CF_INT, &cf_server_round_robin},
 {"suspend_timeout",    true, CF_TIME, &cf_suspend_timeout},
 {"ignore_startup_parameters", true, CF_STR, &cf_ignore_startup_params},
+{"drop_on_error",      true, CF_INT, &cf_drop_on_error},
 
 {"pkt_buf",            false, CF_INT, &cf_sbuf_len},
 {"tcp_defer_accept",   true, {cf_get_int, set_defer_accept}, &cf_tcp_defer_accept},
index 1b8c20152c768614d4ca1a830235ae257a96a83e..36f51ac45e67161659e30c334f9f89f76c6a1770 100644 (file)
@@ -586,6 +586,12 @@ bool release_server(PgSocket *server)
                return false;
        }
 
+       /* enforce close request */
+       if (server->close_needed) {
+               disconnect_server(server, true, "close_needed");
+               return false;
+       }
+
        Assert(server->link == NULL);
        slog_noise(server, "release_server: new state=%d", newstate);
        change_server_state(server, newstate);
index 3efc0549138fc24d4aee74fb413e53e53927d620..f01f772244bacb863ec6b229b25e0734bc166d2b 100644 (file)
@@ -242,6 +242,9 @@ static bool handle_server_work(PgSocket *server, PktHdr *pkt)
                        disconnect_server(server, true, "invalid server parameter");
                        return false;
                }
+               if (cf_drop_on_error)
+                       server->close_needed = 1;
+
        case 'N':               /* NoticeResponse */
                break;