summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Lane2011-08-13 21:52:24 +0000
committerTom Lane2011-08-13 21:52:24 +0000
commit592b615d71caac8a3504276a805a6fd024c40041 (patch)
tree3a0afcb3c7f052034ae18eb72a43708f0a8fe705
parent6d7bd5dec9e073018d9c2bea51d8e271cf5a5af6 (diff)
Fix incorrect timeout handling during initial authentication transaction.
The statement start timestamp was not set before initiating the transaction that is used to look up client authentication information in pg_authid. In consequence, enable_sig_alarm computed a wrong value (far in the past) for statement_fin_time. That didn't have any immediate effect, because the timeout alarm was set without reference to statement_fin_time; but if we subsequently blocked on a lock for a short time, CheckStatementTimeout would consult the bogus value when we cancelled the lock timeout wait, and then conclude we'd timed out, leading to immediate failure of the connection attempt. Thus an innocent "vacuum full pg_authid" would cause failures of concurrent connection attempts. Noted while testing other, more serious consequences of vacuum full on system catalogs. We should set the statement timestamp before StartTransactionCommand(), so that the transaction start timestamp is also valid. I'm not sure if there are any non-cosmetic effects of it not being valid, but the xact timestamp is at least sent to the statistics machinery. Back-patch to 9.0. Before that, the client authentication timeout was done outside any transaction and did not depend on this state to be valid.
-rw-r--r--src/backend/utils/init/postinit.c2
1 files changed, 2 insertions, 0 deletions
diff --git a/src/backend/utils/init/postinit.c b/src/backend/utils/init/postinit.c
index 1476df4db2..94f92dd734 100644
--- a/src/backend/utils/init/postinit.c
+++ b/src/backend/utils/init/postinit.c
@@ -571,6 +571,8 @@ InitPostgres(const char *in_dbname, Oid dboid, const char *username,
*/
if (!bootstrap)
{
+ /* statement_timestamp must be set for timeouts to work correctly */
+ SetCurrentStatementStartTimestamp();
StartTransactionCommand();
(void) GetTransactionSnapshot();
}