1
0
mirror of https://github.com/postgres/postgres.git synced 2025-06-14 18:42:34 +03:00

Add pg_terminate_backend() to allow terminating only a single session.

This commit is contained in:
Bruce Momjian
2008-04-15 13:55:12 +00:00
parent fcf053d782
commit 18b286f3e3
7 changed files with 90 additions and 24 deletions

View File

@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
* $PostgreSQL: pgsql/src/backend/tcop/postgres.c,v 1.548 2008/04/02 18:31:50 tgl Exp $
* $PostgreSQL: pgsql/src/backend/tcop/postgres.c,v 1.549 2008/04/15 13:55:11 momjian Exp $
*
* NOTES
* this is the "main" module of the postgres backend and
@ -2541,7 +2541,8 @@ StatementCancelHandler(SIGNAL_ARGS)
* waiting for input, however.
*/
if (ImmediateInterruptOK && InterruptHoldoffCount == 0 &&
CritSectionCount == 0 && !DoingCommandRead)
CritSectionCount == 0 &&
(!DoingCommandRead || MyProc->terminate))
{
/* bump holdoff count to make ProcessInterrupts() a no-op */
/* until we are done getting ready for it */
@ -2621,6 +2622,10 @@ ProcessInterrupts(void)
ereport(ERROR,
(errcode(ERRCODE_QUERY_CANCELED),
errmsg("canceling autovacuum task")));
else if (MyProc->terminate)
ereport(ERROR,
(errcode(ERRCODE_ADMIN_SHUTDOWN),
errmsg("terminating backend due to administrator command")));
else
ereport(ERROR,
(errcode(ERRCODE_QUERY_CANCELED),
@ -3459,6 +3464,9 @@ PostgresMain(int argc, char *argv[], const char *username)
/* We don't have a transaction command open anymore */
xact_started = false;
if (MyProc->terminate)
die(SIGINT);
/* Now we can allow interrupts again */
RESUME_INTERRUPTS();
}