Does statement_timeout apply to commit?

Started by qihua wuabout 3 years ago2 messagesgeneral
Jump to latest
#1qihua wu
staywithpin@gmail.com

I have a patroni cluster running in sync mode and at least 2 nodes should
be synced for commit. Now I brought down one node, so only one slave is in
sync, and then write a java program to write the data to primary in
autocommit = false mode, I set statement_timeout to 10, hopping the jave
will throw exception after 10 seconds after I send a commit command to
postgresq, but after 10 seconds, it didn't throw any exception, so looks
like statement_timeout doesn't apply to commit. Is that theory right?.

#2Laurenz Albe
laurenz.albe@cybertec.at
In reply to: qihua wu (#1)
Re: Does statement_timeout apply to commit?

On Mon, 2023-01-30 at 17:10 +0800, qihua wu wrote:

I have a patroni cluster running in sync mode and at least 2 nodes should be
synced for commit. Now I brought down one node, so only one slave is in sync,
and then write a java program to write the data to primary in autocommit = false
mode, I set statement_timeout to 10, hopping the jave will throw exception
after 10 seconds after I send a commit command to postgresq, but after 10 seconds,
it didn't throw any exception, so looks like statement_timeout doesn't apply to
commit. Is that theory right?.

I assume you are talking about synchronous replication.

static void
CommitTransaction(void)
{
[...]

/* Prevent cancel/die interrupt while cleaning up */
HOLD_INTERRUPTS();

[...]

if (!is_parallel_worker)
{
/*
* We need to mark our XIDs as committed in pg_xact. This is where we
* durably commit.
*/
latestXid = RecordTransactionCommit();
}

[...]

RESUME_INTERRUPTS();
}

static TransactionId
RecordTransactionCommit(void)
{

[...]

/*
* Wait for synchronous replication, if required. Similar to the decision
* above about using committing asynchronously we only want to wait if
* this backend assigned an xid and wrote WAL. No need to wait if an xid
* was assigned due to temporary/unlogged tables or due to HOT pruning.
*
* Note that at this stage we have marked clog, but still show as running
* in the procarray and continue to hold locks.
*/
if (wrote_xlog && markXidCommitted)
SyncRepWaitForLSN(XactLastRecEnd, true);

[...]
}

So yes, it looks like you are right.

Yours,
Laurenz Albe