Print proper cause of statement cancel, user interaction or timeout.

This commit is contained in:
Bruce Momjian 2005-09-19 17:21:49 +00:00
parent 591a29b398
commit 658657177e
5 changed files with 35 additions and 13 deletions

View File

@ -1,5 +1,5 @@
<!--
$PostgreSQL: pgsql/doc/src/sgml/config.sgml,v 1.17 2005/09/13 15:24:56 neilc Exp $
$PostgreSQL: pgsql/doc/src/sgml/config.sgml,v 1.18 2005/09/19 17:21:46 momjian Exp $
-->
<chapter Id="runtime-config">
<title>Run-time Configuration</title>
@ -3232,7 +3232,10 @@ SELECT * FROM parent WHERE key = 2400;
<listitem>
<para>
Abort any statement that takes over the specified number of
milliseconds. A value of zero (the default) turns off the limitation.
milliseconds. If <varname>log_min_error_statement</> is set to
<literal>ERROR</> or lower, the statement that timed out will also be
logged. A value of zero (the default) turns off the
limitation.
</para>
</listitem>
</varlistentry>

View File

@ -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

View File

@ -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) */
}

View File

@ -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

View File

@ -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';