]> git.ipfire.org Git - thirdparty/postgresql.git/commitdiff
Further second thoughts about idle_session_timeout patch.
authorTom Lane <tgl@sss.pgh.pa.us>
Thu, 7 Jan 2021 16:45:09 +0000 (11:45 -0500)
committerTom Lane <tgl@sss.pgh.pa.us>
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.