aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorBruce Momjian <bruce@momjian.us>2005-09-19 17:21:49 +0000
committerBruce Momjian <bruce@momjian.us>2005-09-19 17:21:49 +0000
commit658657177e04b6b3af39ed9236146065afb422d8 (patch)
tree4732e2dbad98df34c2ec753e4e7c14316ce97138 /src
parent591a29b39803c8c060de621feaaeadfeb0ddca7d (diff)
downloadpostgresql-658657177e04b6b3af39ed9236146065afb422d8.tar.gz
postgresql-658657177e04b6b3af39ed9236146065afb422d8.zip
Print proper cause of statement cancel, user interaction or timeout.
Diffstat (limited to 'src')
-rw-r--r--src/backend/storage/lmgr/proc.c16
-rw-r--r--src/backend/tcop/postgres.c17
-rw-r--r--src/include/storage/proc.h4
-rw-r--r--src/test/regress/expected/prepared_xacts.out4
4 files changed, 30 insertions, 11 deletions
diff --git a/src/backend/storage/lmgr/proc.c b/src/backend/storage/lmgr/proc.c
index efb09fb08f2..3b264fa1796 100644
--- a/src/backend/storage/lmgr/proc.c
+++ b/src/backend/storage/lmgr/proc.c
@@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/backend/storage/lmgr/proc.c,v 1.163 2005/08/20 23:26:24 tgl Exp $
+ * $PostgreSQL: pgsql/src/backend/storage/lmgr/proc.c,v 1.164 2005/09/19 17:21:47 momjian Exp $
*
*-------------------------------------------------------------------------
*/
@@ -78,6 +78,7 @@ static bool waitingForLock = false;
/* Mark these volatile because they can be changed by signal handler */
static volatile bool statement_timeout_active = false;
static volatile bool deadlock_timeout_active = false;
+volatile bool cancel_from_timeout = false;
/* statement_fin_time is valid only if statement_timeout_active is true */
static struct timeval statement_fin_time;
@@ -1058,6 +1059,7 @@ enable_sig_alarm(int delayms, bool is_statement_timeout)
Assert(!deadlock_timeout_active);
statement_fin_time = fin_time;
statement_timeout_active = true;
+ cancel_from_timeout = false;
}
else if (statement_timeout_active)
{
@@ -1128,14 +1130,18 @@ disable_sig_alarm(bool is_statement_timeout)
MemSet(&timeval, 0, sizeof(struct itimerval));
if (setitimer(ITIMER_REAL, &timeval, NULL))
{
- statement_timeout_active = deadlock_timeout_active = false;
+ statement_timeout_active = false;
+ cancel_from_timeout = false;
+ deadlock_timeout_active = false;
return false;
}
#else
/* BeOS doesn't have setitimer, but has set_alarm */
if (set_alarm(B_INFINITE_TIMEOUT, B_PERIODIC_ALARM) < 0)
{
- statement_timeout_active = deadlock_timeout_active = false;
+ statement_timeout_active = false;
+ cancel_from_timeout = false;
+ deadlock_timeout_active = false;
return false;
}
#endif
@@ -1146,7 +1152,10 @@ disable_sig_alarm(bool is_statement_timeout)
/* Cancel or reschedule statement timeout */
if (is_statement_timeout)
+ {
statement_timeout_active = false;
+ cancel_from_timeout = false;
+ }
else if (statement_timeout_active)
{
if (!CheckStatementTimeout())
@@ -1179,6 +1188,7 @@ CheckStatementTimeout(void)
{
/* Time to die */
statement_timeout_active = false;
+ cancel_from_timeout = true;
kill(MyProcPid, SIGINT);
}
else
diff --git a/src/backend/tcop/postgres.c b/src/backend/tcop/postgres.c
index d1eb30c6ba0..7967bef1292 100644
--- a/src/backend/tcop/postgres.c
+++ b/src/backend/tcop/postgres.c
@@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/backend/tcop/postgres.c,v 1.459 2005/09/16 19:31:04 momjian Exp $
+ * $PostgreSQL: pgsql/src/backend/tcop/postgres.c,v 1.460 2005/09/19 17:21:47 momjian Exp $
*
* NOTES
* this is the "main" module of the postgres backend and
@@ -1979,7 +1979,9 @@ start_xact_command(void)
/* Set statement timeout running, if any */
if (StatementTimeout > 0)
enable_sig_alarm(StatementTimeout, true);
-
+ else
+ cancel_from_timeout = false;
+
xact_started = true;
}
}
@@ -2203,9 +2205,14 @@ ProcessInterrupts(void)
ImmediateInterruptOK = false; /* not idle anymore */
DisableNotifyInterrupt();
DisableCatchupInterrupt();
- ereport(ERROR,
- (errcode(ERRCODE_QUERY_CANCELED),
- errmsg("canceling query due to user request or statement timeout")));
+ if (cancel_from_timeout)
+ ereport(ERROR,
+ (errcode(ERRCODE_QUERY_CANCELED),
+ errmsg("canceling statement due to statement timeout")));
+ else
+ ereport(ERROR,
+ (errcode(ERRCODE_QUERY_CANCELED),
+ errmsg("canceling statement due to user request")));
}
/* If we get here, do nothing (probably, QueryCancelPending was reset) */
}
diff --git a/src/include/storage/proc.h b/src/include/storage/proc.h
index b9c9c5d5be6..7297f444bfd 100644
--- a/src/include/storage/proc.h
+++ b/src/include/storage/proc.h
@@ -7,7 +7,7 @@
* Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
- * $PostgreSQL: pgsql/src/include/storage/proc.h,v 1.81 2005/08/20 23:26:34 tgl Exp $
+ * $PostgreSQL: pgsql/src/include/storage/proc.h,v 1.82 2005/09/19 17:21:48 momjian Exp $
*
*-------------------------------------------------------------------------
*/
@@ -117,6 +117,8 @@ typedef struct PROC_HDR
extern int DeadlockTimeout;
extern int StatementTimeout;
+extern volatile bool cancel_from_timeout;
+
/*
* Function Prototypes
diff --git a/src/test/regress/expected/prepared_xacts.out b/src/test/regress/expected/prepared_xacts.out
index f36d1a2428c..aa4d22e8b7e 100644
--- a/src/test/regress/expected/prepared_xacts.out
+++ b/src/test/regress/expected/prepared_xacts.out
@@ -159,7 +159,7 @@ SELECT gid FROM pg_prepared_xacts;
-- pxtest3 should be locked because of the pending DROP
set statement_timeout to 1000;
SELECT * FROM pxtest3;
-ERROR: canceling query due to user request or statement timeout
+ERROR: canceling statement due to statement timeout
reset statement_timeout;
-- Disconnect, we will continue testing in a different backend
\c -
@@ -174,7 +174,7 @@ SELECT gid FROM pg_prepared_xacts;
-- pxtest3 should still be locked because of the pending DROP
set statement_timeout to 1000;
SELECT * FROM pxtest3;
-ERROR: canceling query due to user request or statement timeout
+ERROR: canceling statement due to statement timeout
reset statement_timeout;
-- Commit table creation
COMMIT PREPARED 'regress-one';