From d43837d03067487560af481474ae985df894f786 Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Sat, 16 Mar 2013 23:22:17 -0400 Subject: Add lock_timeout configuration parameter. This GUC allows limiting the time spent waiting to acquire any one heavyweight lock. In support of this, improve the recently-added timeout infrastructure to permit efficiently enabling or disabling multiple timeouts at once. That reduces the performance hit from turning on lock_timeout, though it's still not zero. Zoltán Böszörményi, reviewed by Tom Lane, Stephen Frost, and Hari Babu --- src/backend/tcop/postgres.c | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) (limited to 'src/backend/tcop/postgres.c') diff --git a/src/backend/tcop/postgres.c b/src/backend/tcop/postgres.c index 407c548cf8f..587d065f1cc 100644 --- a/src/backend/tcop/postgres.c +++ b/src/backend/tcop/postgres.c @@ -2883,7 +2883,22 @@ ProcessInterrupts(void) (errcode(ERRCODE_QUERY_CANCELED), errmsg("canceling authentication due to timeout"))); } - if (get_timeout_indicator(STATEMENT_TIMEOUT)) + + /* + * If LOCK_TIMEOUT and STATEMENT_TIMEOUT indicators are both set, we + * prefer to report the former; but be sure to clear both. + */ + if (get_timeout_indicator(LOCK_TIMEOUT, true)) + { + ImmediateInterruptOK = false; /* not idle anymore */ + (void) get_timeout_indicator(STATEMENT_TIMEOUT, true); + DisableNotifyInterrupt(); + DisableCatchupInterrupt(); + ereport(ERROR, + (errcode(ERRCODE_QUERY_CANCELED), + errmsg("canceling statement due to lock timeout"))); + } + if (get_timeout_indicator(STATEMENT_TIMEOUT, true)) { ImmediateInterruptOK = false; /* not idle anymore */ DisableNotifyInterrupt(); -- cgit v1.2.3