Re: Transaction timeout - Mailing list pgsql-hackers

From bt23nguyent
Subject Re: Transaction timeout
Date
Msg-id f508267d1ba8f0bfd7b93181d10511dc@oss.nttdata.com
Whole thread Raw
In response to Re: Transaction timeout  ("Andrey M. Borodin" <x4mmm@yandex-team.ru>)
List pgsql-hackers
On 2023-09-06 20:32, Andrey M. Borodin wrote:
> Thanks for looking into this!
> 
>> On 6 Sep 2023, at 13:16, Fujii Masao <masao.fujii@oss.nttdata.com> 
>> wrote:
>> 
>> While testing v4 patch, I noticed it doesn't handle the COMMIT AND 
>> CHAIN case correctly.
>> When COMMIT AND CHAIN is executed, I believe the transaction timeout 
>> counter should reset
>> and start from zero with the next transaction. However, it appears 
>> that the current
>> v4 patch doesn't reset the counter in this scenario. Can you confirm 
>> this?
> Yes, I was not aware of this feature. I'll test and fix this.
> 
>> With the v4 patch, I found that timeout errors no longer occur during 
>> the idle in
>> transaction phase. Instead, they occur when the next statement is 
>> executed. Is this
>> the intended behavior?
> AFAIR I had been testing that behaviour of "idle in transaction" was
> intact. I'll check that again.
> 
>> I thought some users might want to use the transaction timeout
>> feature to prevent prolonged transactions and promptly release 
>> resources (e.g., locks)
>> in case of a timeout, similar to idle_in_transaction_session_timeout.
> Yes, this is exactly how I was expecting the feature to behave: empty
> up max_connections slots for long-hanging transactions.
> 
> Thanks for your findings, I'll check and post new version!
> 
> 
> Best regards, Andrey Borodin.
Hi,

Thank you for implementing this nice feature!
I tested the v4 patch in the interactive transaction mode with 3 
following cases:

1. Start a transaction with transaction_timeout=0 (i.e., timeout 
disabled), and then change the timeout value to more than 0 during the 
transaction.

=# SET transaction_timeout TO 0;
=# BEGIN;    //timeout is not enabled
=# SELECT pg_sleep(5);
=# SET transaction_timeout TO '1s';
=# SELECT pg_sleep(10);    //timeout is enabled with 1s
In this case, the transaction timeout happens during pg_sleep(10).

2. Start a transaction with transaction_timeout>0 (i.e., timeout 
enabled), and then change the timeout value to more than 0 during the 
transaction.

=# SET transaction_timeout TO '1000s';
=# BEGIN;    //timeout is enabled with 1000s
=# SELECT pg_sleep(5);
=# SET transaction_timeout TO '1s';
=# SELECT pg_sleep(10);    //timeout is not restarted and still running 
with 1000s
In this case, the transaction timeout does NOT happen during 
pg_sleep(10).

3. Start a transaction with transaction_timeout>0 (i.e., timeout 
enabled), and then change the timeout value to 0 during the transaction.

=# SET transaction_timeout TO '10s';
=# BEGIN;    //timeout is enabled with 10s
=# SELECT pg_sleep(5);
=# SET transaction_timeout TO 0;
=# SELECT pg_sleep(10);    //timeout is NOT disabled and still running 
with 10s
In this case, the transaction timeout happens during pg_sleep(10).

The first case where transaction_timeout is disabled before the 
transaction begins is totally fine. However, in the second and third 
cases, where transaction_timeout is enabled before the transaction 
begins, since the timeout has already enabled with a certain value, it 
will not be enabled again with a new setting value.

Furthermore, let's say I want to set a transaction_timeout value for all 
transactions in postgresql.conf file so it would affect all sessions. 
The same behavior happened but for all 3 cases, here is one example with 
the second case:

=# BEGIN; SHOW transaction_timeout; select pg_sleep(10); SHOW 
transaction_timeout; COMMIT;
BEGIN
  transaction_timeout
---------------------
  15s
(1 row)

2023-09-07 11:52:50.510 JST [23889] LOG:  received SIGHUP, reloading 
configuration files
2023-09-07 11:52:50.510 JST [23889] LOG:  parameter 
"transaction_timeout" changed to "5000"
  pg_sleep
----------

(1 row)

  transaction_timeout
---------------------
  5s
(1 row)

COMMIT

I am of the opinion that these behaviors might lead to confusion among 
users. Could you confirm if these are the intended behaviors?

Additionally, I think the short description should be "Sets the maximum 
allowed time to commit a transaction." or "Sets the maximum allowed time 
to wait before aborting a transaction." so that it could be more clear 
and consistent with other %_timeout descriptions.

Also, there is a small whitespace error here:
src/backend/tcop/postgres.c:3373: space before tab in indent.
+                                                               
stmt_reason, comma2, tx_reason)));

On a side note, while testing the patch with pgbench, it came to my 
attention that in scenarios involving the execution of multiple 
concurrent transactions within a high contention environment and with 
relatively short timeout durations, there is a potential for cascading 
blocking. This phenomenon can lead to multiple transactions exceeding 
their designated timeouts, consequently resulting in a degradation of 
transaction processing performance. No?
Do you think this feature should be co-implemented with the existing 
concurrency control protocol to maintain the transaction performance 
(e.g. a transaction scheduling mechanism based on transaction timeout)?

Regards,
Tung Nguyen



pgsql-hackers by date:

Previous
From: Ashutosh Bapat
Date:
Subject: Re: [PoC] Reducing planning time when tables have many partitions
Next
From: "Hayato Kuroda (Fujitsu)"
Date:
Subject: pg_ctl start may return 0 even if the postmaster has been already started on Windows