Commit 65865717 authored by Bruce Momjian's avatar Bruce Momjian

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

parent 591a29b3
<!-- <!--
$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"> <chapter Id="runtime-config">
<title>Run-time Configuration</title> <title>Run-time Configuration</title>
...@@ -3232,7 +3232,10 @@ SELECT * FROM parent WHERE key = 2400; ...@@ -3232,7 +3232,10 @@ SELECT * FROM parent WHERE key = 2400;
<listitem> <listitem>
<para> <para>
Abort any statement that takes over the specified number of 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> </para>
</listitem> </listitem>
</varlistentry> </varlistentry>
......
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
* *
* *
* IDENTIFICATION * 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; ...@@ -78,6 +78,7 @@ static bool waitingForLock = false;
/* Mark these volatile because they can be changed by signal handler */ /* Mark these volatile because they can be changed by signal handler */
static volatile bool statement_timeout_active = false; static volatile bool statement_timeout_active = false;
static volatile bool deadlock_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 */ /* statement_fin_time is valid only if statement_timeout_active is true */
static struct timeval statement_fin_time; static struct timeval statement_fin_time;
...@@ -1058,6 +1059,7 @@ enable_sig_alarm(int delayms, bool is_statement_timeout) ...@@ -1058,6 +1059,7 @@ enable_sig_alarm(int delayms, bool is_statement_timeout)
Assert(!deadlock_timeout_active); Assert(!deadlock_timeout_active);
statement_fin_time = fin_time; statement_fin_time = fin_time;
statement_timeout_active = true; statement_timeout_active = true;
cancel_from_timeout = false;
} }
else if (statement_timeout_active) else if (statement_timeout_active)
{ {
...@@ -1128,14 +1130,18 @@ disable_sig_alarm(bool is_statement_timeout) ...@@ -1128,14 +1130,18 @@ disable_sig_alarm(bool is_statement_timeout)
MemSet(&timeval, 0, sizeof(struct itimerval)); MemSet(&timeval, 0, sizeof(struct itimerval));
if (setitimer(ITIMER_REAL, &timeval, NULL)) 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; return false;
} }
#else #else
/* BeOS doesn't have setitimer, but has set_alarm */ /* BeOS doesn't have setitimer, but has set_alarm */
if (set_alarm(B_INFINITE_TIMEOUT, B_PERIODIC_ALARM) < 0) 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; return false;
} }
#endif #endif
...@@ -1146,7 +1152,10 @@ disable_sig_alarm(bool is_statement_timeout) ...@@ -1146,7 +1152,10 @@ disable_sig_alarm(bool is_statement_timeout)
/* Cancel or reschedule statement timeout */ /* Cancel or reschedule statement timeout */
if (is_statement_timeout) if (is_statement_timeout)
{
statement_timeout_active = false; statement_timeout_active = false;
cancel_from_timeout = false;
}
else if (statement_timeout_active) else if (statement_timeout_active)
{ {
if (!CheckStatementTimeout()) if (!CheckStatementTimeout())
...@@ -1179,6 +1188,7 @@ CheckStatementTimeout(void) ...@@ -1179,6 +1188,7 @@ CheckStatementTimeout(void)
{ {
/* Time to die */ /* Time to die */
statement_timeout_active = false; statement_timeout_active = false;
cancel_from_timeout = true;
kill(MyProcPid, SIGINT); kill(MyProcPid, SIGINT);
} }
else else
......
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
* *
* *
* IDENTIFICATION * 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 * NOTES
* this is the "main" module of the postgres backend and * this is the "main" module of the postgres backend and
...@@ -1979,6 +1979,8 @@ start_xact_command(void) ...@@ -1979,6 +1979,8 @@ start_xact_command(void)
/* Set statement timeout running, if any */ /* Set statement timeout running, if any */
if (StatementTimeout > 0) if (StatementTimeout > 0)
enable_sig_alarm(StatementTimeout, true); enable_sig_alarm(StatementTimeout, true);
else
cancel_from_timeout = false;
xact_started = true; xact_started = true;
} }
...@@ -2203,9 +2205,14 @@ ProcessInterrupts(void) ...@@ -2203,9 +2205,14 @@ ProcessInterrupts(void)
ImmediateInterruptOK = false; /* not idle anymore */ ImmediateInterruptOK = false; /* not idle anymore */
DisableNotifyInterrupt(); DisableNotifyInterrupt();
DisableCatchupInterrupt(); DisableCatchupInterrupt();
if (cancel_from_timeout)
ereport(ERROR,
(errcode(ERRCODE_QUERY_CANCELED),
errmsg("canceling statement due to statement timeout")));
else
ereport(ERROR, ereport(ERROR,
(errcode(ERRCODE_QUERY_CANCELED), (errcode(ERRCODE_QUERY_CANCELED),
errmsg("canceling query due to user request or statement timeout"))); errmsg("canceling statement due to user request")));
} }
/* If we get here, do nothing (probably, QueryCancelPending was reset) */ /* If we get here, do nothing (probably, QueryCancelPending was reset) */
} }
......
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
* Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group * Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California * 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 ...@@ -117,6 +117,8 @@ typedef struct PROC_HDR
extern int DeadlockTimeout; extern int DeadlockTimeout;
extern int StatementTimeout; extern int StatementTimeout;
extern volatile bool cancel_from_timeout;
/* /*
* Function Prototypes * Function Prototypes
......
...@@ -159,7 +159,7 @@ SELECT gid FROM pg_prepared_xacts; ...@@ -159,7 +159,7 @@ SELECT gid FROM pg_prepared_xacts;
-- pxtest3 should be locked because of the pending DROP -- pxtest3 should be locked because of the pending DROP
set statement_timeout to 1000; set statement_timeout to 1000;
SELECT * FROM pxtest3; SELECT * FROM pxtest3;
ERROR: canceling query due to user request or statement timeout ERROR: canceling statement due to statement timeout
reset statement_timeout; reset statement_timeout;
-- Disconnect, we will continue testing in a different backend -- Disconnect, we will continue testing in a different backend
\c - \c -
...@@ -174,7 +174,7 @@ SELECT gid FROM pg_prepared_xacts; ...@@ -174,7 +174,7 @@ SELECT gid FROM pg_prepared_xacts;
-- pxtest3 should still be locked because of the pending DROP -- pxtest3 should still be locked because of the pending DROP
set statement_timeout to 1000; set statement_timeout to 1000;
SELECT * FROM pxtest3; SELECT * FROM pxtest3;
ERROR: canceling query due to user request or statement timeout ERROR: canceling statement due to statement timeout
reset statement_timeout; reset statement_timeout;
-- Commit table creation -- Commit table creation
COMMIT PREPARED 'regress-one'; COMMIT PREPARED 'regress-one';
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment