Further second thoughts about idle_session_timeout patch.
authorTom Lane <[email protected]>
Thu, 7 Jan 2021 16:45:09 +0000 (11:45 -0500)
committerTom Lane <[email protected]>
Thu, 7 Jan 2021 16:45:09 +0000 (11:45 -0500)
On reflection, the order of operations in PostgresMain() is wrong.
These timeouts ought to be shut down before, not after, we do the
post-command-read CHECK_FOR_INTERRUPTS, to guarantee that any
timeout error will be detected there rather than at some ill-defined
later point (possibly after having wasted a lot of work).

This is really an error in the original idle_in_transaction_timeout
patch, so back-patch to 9.6 where that was introduced.

src/backend/tcop/postgres.c

index 194d27e12a3c39f43136891388e326aaa5baa67c..8df8bea0d6f8454b50ccb7f522fdcae4608cd7c7 100644 (file)
@@ -4082,7 +4082,18 @@ PostgresMain(int argc, char *argv[],
        firstchar = ReadCommand(&input_message);
 
        /*
-        * (4) disable async signal conditions again.
+        * (4) turn off the idle-in-transaction timeout, if active.  We do
+        * this before step (5) so that any last-moment timeout is certain to
+        * be detected in step (5).
+        */
+       if (disable_idle_in_transaction_timeout)
+       {
+           disable_timeout(IDLE_IN_TRANSACTION_SESSION_TIMEOUT, false);
+           disable_idle_in_transaction_timeout = false;
+       }
+
+       /*
+        * (5) disable async signal conditions again.
         *
         * Query cancel is supposed to be a no-op when there is no query in
         * progress, so if a query cancel arrived while we were idle, just
@@ -4093,15 +4104,6 @@ PostgresMain(int argc, char *argv[],
        CHECK_FOR_INTERRUPTS();
        DoingCommandRead = false;
 
-       /*
-        * (5) turn off the idle-in-transaction timeout
-        */
-       if (disable_idle_in_transaction_timeout)
-       {
-           disable_timeout(IDLE_IN_TRANSACTION_SESSION_TIMEOUT, false);
-           disable_idle_in_transaction_timeout = false;
-       }
-
        /*
         * (6) check for any other interesting events that happened while we
         * slept.