Re: Transaction timeout
x4mmm@yandex-team.ru
From: "Andrey M. Borodin" <x4mmm@yandex-team.ru>
To: Japin Li <japinli@hotmail.com>
Cc: Peter Smith <smithpb2250@gmail.com>, Junwang Zhao <zhjwpku@gmail.com>, 邱宇航 <iamqyh@gmail.com>, Fujii Masao <masao.fujii@oss.nttdata.com>, Andrey Borodin <amborodin86@gmail.com>, Andres Freund <andres@anarazel.de>, Michael Paquier <michael.paquier@gmail.com>, Nikolay Samokhvalov <samokhvalov@gmail.com>, pgsql-hackers <pgsql-hackers@postgresql.org>, "pgsql-hackers@lists.postgresql.org" <pgsql-hackers@lists.postgresql.org>
Date: 2024-01-30T06:22:51Z
Lists: pgsql-hackers
Attachments
- v25-0001-Introduce-transaction_timeout.patch (application/octet-stream) patch v25-0001
> On 26 Jan 2024, at 19:58, Japin Li <japinli@hotmail.com> wrote: > > Thanks for updating the patch. Here are some comments for v24. > > + <para> > + Terminate any session that spans longer than the specified amount of > + time in transaction. The limit applies both to explicit transactions > + (started with <command>BEGIN</command>) and to implicitly started > + transaction corresponding to single statement. But this limit is not > + applied to prepared transactions. > + If this value is specified without units, it is taken as milliseconds. > + A value of zero (the default) disables the timeout. > + </para> > The sentence "But this limit is not applied to prepared transactions" is redundant, > since we have a paragraph to describe this later. Fixed. > > + > + <para> > + If <varname>transaction_timeout</varname> is shorter than > + <varname>idle_in_transaction_session_timeout</varname> or <varname>statement_timeout</varname> > + <varname>transaction_timeout</varname> will invalidate longer timeout. > + </para> > + > > Since we are already try to disable the timeouts, should we try to disable > them even if they are equal. Well, we disable timeouts on equality. Fixed docs. > > + > + <para> > + Prepared transactions are not subject for this timeout. > + </para> > > Maybe wrap this with <note> is a good idea. Done. > >> I’ve inspected CI fails and they were caused by two different problems: >> 1. It’s unsafe for isaoltion tester to await transaction_timeout within a query. Usually it gets >> FATAL: terminating connection due to transaction timeout >> But if VM is a bit slow it can get occasional >> PQconsumeInput failed: server closed the connection unexpectedly >> So, currently all tests use “passive waiting”, in a session that will not timeout. >> >> 2. In some cases pg_sleep(0.1) were sleeping up to 200 ms. That was making s7 and s8 fail, because they rely on this margin. > > I'm curious why this happened. I think pg_sleep() cannot provide guarantees on when next query will be executed. In our case we need that isolation tester see that sleep is over and continue in other session... >> I’ve separated these tests into different test timeouts-long and increased margin to 300ms. Now tests run horrible 2431 ms. Moreover I’m afraid that on buildfarm we can have much randomly-slower machines so this test might be excluded. >> This test checks COMMIT AND CHAIN and flow of small queries (Nik’s case). >> >> Also I’ve verified that every "enable_timeout_after(TRANSACTION_TIMEOUT)” and “disable_timeout(TRANSACTION_TIMEOUT)” is necessary and found that case of aborting "idle in transaction (aborted)” is not covered by tests. I’m not sure we need a test for this. > > I see there is a test about idle_in_transaction_timeout and transaction_timeout. > > Both of them only check the session, but don't check the reason, so we cannot > distinguish the reason they are terminated. Right? Yes. > >> Japin, Junwang, what do you think? > > However, checking the reason on the timeout session may cause regression test > failed (as you point in 1), I don't strongly insist on it. Indeed, if we check a reason of FATAL timeouts - we get flaky tests. Best regards, Andrey Borodin.
Commits
-
Add TAP tests for timeouts
- eeefd4280f6e 17.0 landed
-
Remove flaky isolation tests for timeouts
- a661bf7b0f56 17.0 landed
-
Followup fixes for transaction_timeout
- bf82f43790a6 17.0 landed
-
Introduce transaction_timeout
- 51efe38cb92f 17.0 landed
-
On systems that have setsid(2) (which should be just about everything except
- 3ad0728c817b 8.2.0 cited