mirror of
https://github.com/postgres/postgres.git
synced 2025-06-05 23:56:58 +03:00
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">
|
<chapter Id="runtime-config">
|
||||||
<title>Run-time Configuration</title>
|
<title>Run-time Configuration</title>
|
||||||
@ -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 @@
|
|||||||
*
|
*
|
||||||
*
|
*
|
||||||
* 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;
|
|||||||
/* 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)
|
|||||||
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)
|
|||||||
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)
|
|||||||
|
|
||||||
/* 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)
|
|||||||
{
|
{
|
||||||
/* 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 @@
|
|||||||
*
|
*
|
||||||
*
|
*
|
||||||
* 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,7 +1979,9 @@ 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)
|
|||||||
ImmediateInterruptOK = false; /* not idle anymore */
|
ImmediateInterruptOK = false; /* not idle anymore */
|
||||||
DisableNotifyInterrupt();
|
DisableNotifyInterrupt();
|
||||||
DisableCatchupInterrupt();
|
DisableCatchupInterrupt();
|
||||||
ereport(ERROR,
|
if (cancel_from_timeout)
|
||||||
(errcode(ERRCODE_QUERY_CANCELED),
|
ereport(ERROR,
|
||||||
errmsg("canceling query due to user request or statement timeout")));
|
(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) */
|
/* 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) 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
|
|||||||
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;
|
|||||||
-- 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;
|
|||||||
-- 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';
|
||||||
|
Loading…
x
Reference in New Issue
Block a user