mirror of
https://github.com/postgres/postgres.git
synced 2025-11-22 12:22:45 +03:00
Introduce transaction_timeout
This commit adds timeout that is expected to be used as a prevention of long-running queries. Any session within the transaction will be terminated after spanning longer than this timeout. However, this timeout is not applied to prepared transactions. Only transactions with user connections are affected. Discussion: https://postgr.es/m/CAAhFRxiQsRs2Eq5kCo9nXE3HTugsAAJdSQSmxncivebAxdmBjQ%40mail.gmail.com Author: Andrey Borodin <amborodin@acm.org> Author: Japin Li <japinli@hotmail.com> Author: Junwang Zhao <zhjwpku@gmail.com> Reviewed-by: Nikolay Samokhvalov <samokhvalov@gmail.com> Reviewed-by: Andres Freund <andres@anarazel.de> Reviewed-by: Fujii Masao <masao.fujii@oss.nttdata.com> Reviewed-by: bt23nguyent <bt23nguyent@oss.nttdata.com> Reviewed-by: Yuhang Qiu <iamqyh@gmail.com>
This commit is contained in:
@@ -252,6 +252,7 @@ Section: Class 25 - Invalid Transaction State
|
||||
25P01 E ERRCODE_NO_ACTIVE_SQL_TRANSACTION no_active_sql_transaction
|
||||
25P02 E ERRCODE_IN_FAILED_SQL_TRANSACTION in_failed_sql_transaction
|
||||
25P03 E ERRCODE_IDLE_IN_TRANSACTION_SESSION_TIMEOUT idle_in_transaction_session_timeout
|
||||
25P04 E ERRCODE_TRANSACTION_TIMEOUT transaction_timeout
|
||||
|
||||
Section: Class 26 - Invalid SQL Statement Name
|
||||
|
||||
|
||||
@@ -33,6 +33,7 @@ volatile sig_atomic_t ProcDiePending = false;
|
||||
volatile sig_atomic_t CheckClientConnectionPending = false;
|
||||
volatile sig_atomic_t ClientConnectionLost = false;
|
||||
volatile sig_atomic_t IdleInTransactionSessionTimeoutPending = false;
|
||||
volatile sig_atomic_t TransactionTimeoutPending = false;
|
||||
volatile sig_atomic_t IdleSessionTimeoutPending = false;
|
||||
volatile sig_atomic_t ProcSignalBarrierPending = false;
|
||||
volatile sig_atomic_t LogMemoryContextPending = false;
|
||||
|
||||
@@ -75,6 +75,7 @@ static void ShutdownPostgres(int code, Datum arg);
|
||||
static void StatementTimeoutHandler(void);
|
||||
static void LockTimeoutHandler(void);
|
||||
static void IdleInTransactionSessionTimeoutHandler(void);
|
||||
static void TransactionTimeoutHandler(void);
|
||||
static void IdleSessionTimeoutHandler(void);
|
||||
static void IdleStatsUpdateTimeoutHandler(void);
|
||||
static void ClientCheckTimeoutHandler(void);
|
||||
@@ -764,6 +765,7 @@ InitPostgres(const char *in_dbname, Oid dboid,
|
||||
RegisterTimeout(LOCK_TIMEOUT, LockTimeoutHandler);
|
||||
RegisterTimeout(IDLE_IN_TRANSACTION_SESSION_TIMEOUT,
|
||||
IdleInTransactionSessionTimeoutHandler);
|
||||
RegisterTimeout(TRANSACTION_TIMEOUT, TransactionTimeoutHandler);
|
||||
RegisterTimeout(IDLE_SESSION_TIMEOUT, IdleSessionTimeoutHandler);
|
||||
RegisterTimeout(CLIENT_CONNECTION_CHECK_TIMEOUT, ClientCheckTimeoutHandler);
|
||||
RegisterTimeout(IDLE_STATS_UPDATE_TIMEOUT,
|
||||
@@ -1395,6 +1397,14 @@ LockTimeoutHandler(void)
|
||||
kill(MyProcPid, SIGINT);
|
||||
}
|
||||
|
||||
static void
|
||||
TransactionTimeoutHandler(void)
|
||||
{
|
||||
TransactionTimeoutPending = true;
|
||||
InterruptPending = true;
|
||||
SetLatch(MyLatch);
|
||||
}
|
||||
|
||||
static void
|
||||
IdleInTransactionSessionTimeoutHandler(void)
|
||||
{
|
||||
|
||||
@@ -2577,6 +2577,17 @@ struct config_int ConfigureNamesInt[] =
|
||||
NULL, NULL, NULL
|
||||
},
|
||||
|
||||
{
|
||||
{"transaction_timeout", PGC_USERSET, CLIENT_CONN_STATEMENT,
|
||||
gettext_noop("Sets the maximum allowed time in a transaction with a session (not a prepared transaction)."),
|
||||
gettext_noop("A value of 0 turns off the timeout."),
|
||||
GUC_UNIT_MS
|
||||
},
|
||||
&TransactionTimeout,
|
||||
0, 0, INT_MAX,
|
||||
NULL, assign_transaction_timeout, NULL
|
||||
},
|
||||
|
||||
{
|
||||
{"idle_session_timeout", PGC_USERSET, CLIENT_CONN_STATEMENT,
|
||||
gettext_noop("Sets the maximum allowed idle time between queries, when not in a transaction."),
|
||||
|
||||
@@ -701,6 +701,7 @@
|
||||
#default_transaction_deferrable = off
|
||||
#session_replication_role = 'origin'
|
||||
#statement_timeout = 0 # in milliseconds, 0 is disabled
|
||||
#transaction_timeout = 0 # in milliseconds, 0 is disabled
|
||||
#lock_timeout = 0 # in milliseconds, 0 is disabled
|
||||
#idle_in_transaction_session_timeout = 0 # in milliseconds, 0 is disabled
|
||||
#idle_session_timeout = 0 # in milliseconds, 0 is disabled
|
||||
|
||||
Reference in New Issue
Block a user