aboutsummaryrefslogtreecommitdiff
path: root/src/backend
diff options
context:
space:
mode:
Diffstat (limited to 'src/backend')
-rw-r--r--src/backend/access/transam/xact.c12
-rw-r--r--src/backend/tcop/postgres.c31
2 files changed, 23 insertions, 20 deletions
diff --git a/src/backend/access/transam/xact.c b/src/backend/access/transam/xact.c
index a124ba59330..70ab6e27a13 100644
--- a/src/backend/access/transam/xact.c
+++ b/src/backend/access/transam/xact.c
@@ -2262,6 +2262,10 @@ CommitTransaction(void)
s->state = TRANS_COMMIT;
s->parallelModeLevel = 0;
+ /* Disable transaction timeout */
+ if (TransactionTimeout > 0)
+ disable_timeout(TRANSACTION_TIMEOUT, false);
+
if (!is_parallel_worker)
{
/*
@@ -2535,6 +2539,10 @@ PrepareTransaction(void)
*/
s->state = TRANS_PREPARE;
+ /* Disable transaction timeout */
+ if (TransactionTimeout > 0)
+ disable_timeout(TRANSACTION_TIMEOUT, false);
+
prepared_at = GetCurrentTimestamp();
/*
@@ -2707,6 +2715,10 @@ AbortTransaction(void)
/* Prevent cancel/die interrupt while cleaning up */
HOLD_INTERRUPTS();
+ /* Disable transaction timeout */
+ if (TransactionTimeout > 0)
+ disable_timeout(TRANSACTION_TIMEOUT, false);
+
/* Make sure we have a valid memory context and resource owner */
AtAbort_Memory();
AtAbort_ResourceOwner();
diff --git a/src/backend/tcop/postgres.c b/src/backend/tcop/postgres.c
index de9f5d1a6c4..2c63b7875a3 100644
--- a/src/backend/tcop/postgres.c
+++ b/src/backend/tcop/postgres.c
@@ -3647,9 +3647,17 @@ check_log_stats(bool *newval, void **extra, GucSource source)
void
assign_transaction_timeout(int newval, void *extra)
{
- if (TransactionTimeout <= 0 &&
- get_timeout_active(TRANSACTION_TIMEOUT))
- disable_timeout(TRANSACTION_TIMEOUT, false);
+ if (IsTransactionState())
+ {
+ /*
+ * If transaction_timeout GUC has changes within the transaction block
+ * enable or disable the timer correspondingly.
+ */
+ if (newval > 0 && !get_timeout_active(TRANSACTION_TIMEOUT))
+ enable_timeout_after(TRANSACTION_TIMEOUT, newval);
+ else if (newval <= 0 && get_timeout_active(TRANSACTION_TIMEOUT))
+ disable_timeout(TRANSACTION_TIMEOUT, false);
+ }
}
@@ -4510,11 +4518,6 @@ PostgresMain(const char *dbname, const char *username)
enable_timeout_after(IDLE_IN_TRANSACTION_SESSION_TIMEOUT,
IdleInTransactionSessionTimeout);
}
-
- /* Schedule or reschedule transaction timeout */
- if (TransactionTimeout > 0 && !get_timeout_active(TRANSACTION_TIMEOUT))
- enable_timeout_after(TRANSACTION_TIMEOUT,
- TransactionTimeout);
}
else if (IsTransactionOrTransactionBlock())
{
@@ -4529,11 +4532,6 @@ PostgresMain(const char *dbname, const char *username)
enable_timeout_after(IDLE_IN_TRANSACTION_SESSION_TIMEOUT,
IdleInTransactionSessionTimeout);
}
-
- /* Schedule or reschedule transaction timeout */
- if (TransactionTimeout > 0 && !get_timeout_active(TRANSACTION_TIMEOUT))
- enable_timeout_after(TRANSACTION_TIMEOUT,
- TransactionTimeout);
}
else
{
@@ -4586,13 +4584,6 @@ PostgresMain(const char *dbname, const char *username)
enable_timeout_after(IDLE_SESSION_TIMEOUT,
IdleSessionTimeout);
}
-
- /*
- * If GUC is changed then it's handled in
- * assign_transaction_timeout().
- */
- if (TransactionTimeout > 0 && get_timeout_active(TRANSACTION_TIMEOUT))
- disable_timeout(TRANSACTION_TIMEOUT, false);
}
/* Report any recently-changed GUC options */