aboutsummaryrefslogtreecommitdiff
path: root/src/backend/tcop/postgres.c
diff options
context:
space:
mode:
authorMarc G. Fournier <scrappy@hub.org>1998-07-09 03:29:11 +0000
committerMarc G. Fournier <scrappy@hub.org>1998-07-09 03:29:11 +0000
commita0659e3e2c79be49feb4aa527d823c71d7bcaf07 (patch)
tree7dc58e872cdfce999dd0848000fcd3f2e4edbafa /src/backend/tcop/postgres.c
parent8bf61820f033d7df0e89433a0272d7b2567378b8 (diff)
downloadpostgresql-a0659e3e2c79be49feb4aa527d823c71d7bcaf07.tar.gz
postgresql-a0659e3e2c79be49feb4aa527d823c71d7bcaf07.zip
From: Tom Lane <tgl@sss.pgh.pa.us>
Making PQrequestCancel safe to call in a signal handler turned out to be much easier than I feared. So here are the diffs. Some notes: * I modified the postmaster's packet "iodone" callback interface to allow the callback routine to return a continue-or-drop-connection return code; this was necessary to allow the connection to be closed after receiving a Cancel, rather than proceeding to launch a new backend... Being a neatnik, I also made the iodone proc have a typechecked parameter list. * I deleted all code I could find that had to do with OOB. * I made some edits to ensure that all signals mentioned in the code are referred to symbolically not by numbers ("SIGUSR2" not "2"). I think Bruce may have already done at least some of the same edits; I hope that merging these patches is not too painful.
Diffstat (limited to 'src/backend/tcop/postgres.c')
-rw-r--r--src/backend/tcop/postgres.c40
1 files changed, 27 insertions, 13 deletions
diff --git a/src/backend/tcop/postgres.c b/src/backend/tcop/postgres.c
index 97ac571d2c6..0a7408a7b94 100644
--- a/src/backend/tcop/postgres.c
+++ b/src/backend/tcop/postgres.c
@@ -7,7 +7,7 @@
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/tcop/postgres.c,v 1.78 1998/06/27 04:53:43 momjian Exp $
+ * $Header: /cvsroot/pgsql/src/backend/tcop/postgres.c,v 1.79 1998/07/09 03:28:48 scrappy Exp $
*
* NOTES
* this is the "main" module of the postgres backend and
@@ -724,7 +724,7 @@ pg_exec_query_dest(char *query_string, /* string to execute */
/* --------------------------------
* signal handler routines used in PostgresMain()
*
- * handle_warn() is used to catch kill(getpid(),1) which
+ * handle_warn() is used to catch kill(getpid(), SIGHUP) which
* occurs when elog(ERROR) is called.
*
* quickdie() occurs when signalled by the postmaster.
@@ -777,7 +777,7 @@ FloatExceptionHandler(SIGNAL_ARGS)
}
-/* signal handler for query cancel */
+/* signal handler for query cancel signal from postmaster */
static void
QueryCancelHandler(SIGNAL_ARGS)
{
@@ -787,12 +787,9 @@ QueryCancelHandler(SIGNAL_ARGS)
void
CancelQuery(void)
{
- char dummy;
-
- /* throw it away */
- while (pq_recvoob(&dummy, 1) > 0)
- ;
- /* QueryCancel reset in longjump after elog() call */
+ /* QueryCancel flag will be reset in main loop, which we reach by
+ * longjmp from elog().
+ */
elog(ERROR, "Query was cancelled.");
}
@@ -1261,7 +1258,6 @@ PostgresMain(int argc, char *argv[], int real_argc, char *real_argv[])
}
pq_init(Portfd);
whereToSendOutput = Remote;
- pq_regoob(QueryCancelHandler); /* we do it here so the backend it connected */
}
else
whereToSendOutput = Debug;
@@ -1288,13 +1284,31 @@ PostgresMain(int argc, char *argv[], int real_argc, char *real_argv[])
#endif
/* ----------------
+ * Set up handler for cancel-request signal, and
+ * send this backend's cancellation info to the frontend.
+ * This should not be done until we are sure startup is successful.
+ * ----------------
+ */
+
+ pqsignal(SIGINT, QueryCancelHandler);
+
+ if (whereToSendOutput == Remote &&
+ PG_PROTOCOL_MAJOR(FrontendProtocol) >= 2)
+ {
+ pq_putnchar("K", 1);
+ pq_putint((int32) MyProcPid, sizeof(int32));
+ pq_putint((int32) MyCancelKey, sizeof(int32));
+ /* Need not flush since ReadyForQuery will do it. */
+ }
+
+ /* ----------------
* if an exception is encountered, processing resumes here
* so we abort the current transaction and start a new one.
* This must be done after we initialize the slave backends
* so that the slaves signal the master to abort the transaction
* rather than calling AbortCurrentTransaction() themselves.
*
- * Note: elog(ERROR) causes a kill(getpid(),1) to occur sending
+ * Note: elog(ERROR) causes a kill(getpid(), SIGHUP) to occur sending
* us back here.
* ----------------
*/
@@ -1325,7 +1339,7 @@ PostgresMain(int argc, char *argv[], int real_argc, char *real_argv[])
if (!IsUnderPostmaster)
{
puts("\nPOSTGRES backend interactive interface");
- puts("$Revision: 1.78 $ $Date: 1998/06/27 04:53:43 $");
+ puts("$Revision: 1.79 $ $Date: 1998/07/09 03:28:48 $");
}
/* ----------------
@@ -1431,7 +1445,7 @@ PostgresMain(int argc, char *argv[], int real_argc, char *real_argv[])
break;
default:
- elog(ERROR, "unknown frontend message was recieved");
+ elog(ERROR, "unknown frontend message was received");
}
/* ----------------