mirror of https://github.com/postgres/postgres
Print proper cause of statement cancel, user interaction or timeout.
This commit is contained in:
parent
591a29b398
commit
658657177e
|
@ -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>
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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,6 +1979,8 @@ 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();
|
||||
if (cancel_from_timeout)
|
||||
ereport(ERROR,
|
||||
(errcode(ERRCODE_QUERY_CANCELED),
|
||||
errmsg("canceling query due to user request or statement timeout")));
|
||||
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) */
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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';
|
||||
|
|
Loading…
Reference in New Issue