]> granicus.if.org Git - pgbouncer/commitdiff
Version 1.0.4 pgbouncer_1_0_4
authorMarko Kreen <markokr@gmail.com>
Wed, 11 Apr 2007 09:24:48 +0000 (09:24 +0000)
committerMarko Kreen <markokr@gmail.com>
Wed, 11 Apr 2007 09:24:48 +0000 (09:24 +0000)
  * Notice from idle server tagged server dirty.
    release_server() did not expect it.  Fix it
    by dropping them.

NEWS
configure.ac
debian/changelog
src/janitor.c
src/objects.c
src/server.c

diff --git a/NEWS b/NEWS
index d908aca31f177c724f64e10d7bd5dbcd72648933..af20ea5fd98318a4c00324a976469d72b0336391 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -1,4 +1,10 @@
 
+2007-04-11  -  PgBouncer 1.0.4  -  "Last 'last' bug"
+
+  * Notice from idle server tagged server dirty.
+    release_server() did not expect it.  Fix it
+    by dropping them.
+
 2007-04-11  -  PgBouncer 1.0.3  -  "Fearless Fork"
 
   = Fixes =
index a4a41465412b1cefb0c801d0fcd662280cc9369b..aab76a71ae14f11a5dcb5bbfd64b36bb7ef6a7a9 100644 (file)
@@ -1,6 +1,6 @@
 dnl Process this file with autoconf to produce a configure script.
 
-AC_INIT(pgbouncer, 1.0.3)
+AC_INIT(pgbouncer, 1.0.4)
 AC_CONFIG_SRCDIR(src/bouncer.h)
 AC_CONFIG_HEADER(config.h)
 
index b7e94a18b02f584c4536c3f9da504b1db5334280..e26397a8b65cad93ec26fd6e88326038f1e79df6 100644 (file)
@@ -1,3 +1,9 @@
+pgbouncer (1.0.4-1) unstable; urgency=low
+
+  * last bug, honestly.
+
+ -- Marko Kreen <marko.kreen@skype.net>  Wed, 11 Apr 2007 12:03:52 +0300
+
 pgbouncer (1.0.3-1) unstable; urgency=low
 
   * more error handling fixes.
index a7c392cf8e18a6d887cd5e3308c728d66fc7d57e..8caf30b7a17957487ffb4dd9e5b75a5300fadc0a 100644 (file)
@@ -113,7 +113,15 @@ static void launch_recheck(PgPool *pool)
        PgSocket *server;
        bool res = true;
 
-       server = first_socket(&pool->used_server_list);
+       /* find clean server */
+       while (1) {
+               server = first_socket(&pool->used_server_list);
+               if (!server)
+                       return;
+               if (server->ready)
+                       break;
+               disconnect_server(server, true, "idle server got dirty");
+       }
 
        /* is the check needed? */
        if (q == NULL || q[0] == 0)
@@ -308,6 +316,10 @@ static void check_unused_servers(StatList *slist, usec_t now, bool idle_test)
 
                if (server->close_needed)
                        disconnect_server(server, true, "db conf changed");
+               else if (server->state == SV_IDLE && !server->ready)
+                       disconnect_server(server, true, "SV_IDLE server got dirty");
+               else if (server->state == SV_USED && !server->ready)
+                       disconnect_server(server, true, "SV_USED server got dirty");
                else if (cf_server_idle_timeout > 0 && idle > cf_server_idle_timeout)
                        disconnect_server(server, true, "server idle timeout");
                else if (cf_server_lifetime > 0 && age > cf_server_lifetime)
index ea4cf884262fa5c3709adde8dc29fea3a38be8f7..666e00c4b190cb0cb67a31f115617fd8c740fe10 100644 (file)
@@ -523,8 +523,14 @@ bool find_server(PgSocket *client)
        /* try to get idle server, if allowed */
        if (cf_pause_mode == P_PAUSE)
                server = NULL;
-       else
-               server = first_socket(&pool->idle_server_list);
+       else {
+               while (1) {
+                       server = first_socket(&pool->idle_server_list);
+                       if (!server || server->ready)
+                               break;
+                       disconnect_server(server, true, "idle server got dirty");
+               }
+       }
 
        /* link or send to waiters list */
        if (server) {
index 8bae665ff99aabbdd14d5954ae43b9ad960c04e8..b9093f9654c08f403f178a10390cb8b62c24ab02 100644 (file)
@@ -70,7 +70,6 @@ static bool handle_server_startup(PgSocket *server, MBuf *pkt)
                /* got all params */
                finish_welcome_msg(server);
 
-               // FIXME: res check
                res = release_server(server);
 
                /* let the takeover process handle it */
@@ -138,6 +137,16 @@ static bool handle_server_work(PgSocket *server, MBuf *pkt)
                        return false;
                }
 
+       /*
+        * 'E' and 'N' packets currently set ->ready to 0.  Correct would
+        * be to leave ->ready as-is, because overal TX state stays same.
+        * It matters for connections in IDLE or USED state which get dirty
+        * suddenly but should not as they are still usable.
+        *
+        * But the 'E' or 'N' packet between transactions signifies probably
+        * dying backend.  This its better to tag server as dirty and drop
+        * it later.
+        */
        case 'E':               /* ErrorResponse */
        case 'N':               /* NoticeResponse */