Received: from smtp013.mail.yahoo.com (smtp013.mail.yahoo.com [216.136.173.57]) by postgresql.org (Postfix) with SMTP id 20D52474E71 for ; Fri, 12 Jul 2002 23:55:29 -0400 (EDT) Received: from h00045a2e4e7c.ne.client2.attbi.com (HELO europa.janwieck.net) (janwieck@24.61.137.137 with login) by smtp.mail.vip.sc5.yahoo.com with SMTP; 13 Jul 2002 03:55:34 -0000 Received: from Yahoo.com (localhost.localdomain [127.0.0.1]) by europa.janwieck.net (8.11.2/8.11.2) with ESMTP id g6D3tpI04332; Fri, 12 Jul 2002 23:55:51 -0400 Message-ID: <3D2FA4C7.6FC0D962@Yahoo.com> Date: Fri, 12 Jul 2002 23:55:51 -0400 From: Jan Wieck X-Mailer: Mozilla 4.79 [en] (X11; U; Linux 2.4.2-2 i686) X-Accept-Language: en MIME-Version: 1.0 To: Bruce Momjian Cc: Rudi Starcevic , pgsql-sql@postgresql.org Subject: Re: Query kill References: <200207130213.g6D2DBX02816@candle.pha.pa.us> Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-Archive-Number: 200207/198 X-Sequence-Number: 8577 Bruce Momjian wrote: > > Jan Wieck wrote: > > Bruce Momjian wrote: > > > > > > Rudi Starcevic wrote: > > > > Hello, > > > > > > > > If I write a query that is inefficient or in an eternal loop how > > > > do I stop it without restarting the postmaster ? > > > > > > > > I can see many postmaster processed appearing in the output of the 'ps' > > > > command. > > > > Do I need to stop/kill them all or can I stop just the query I want ? > > > > > > Just send a SIGINT to the process. That simulates a ^C, which works too > > > from the client like psql. > > > > Doesn't the client need a signal handler for that and call > > PQcancelRequest() in that? > > Every backend has that signal handler defined, I think. What? So you suggest that the client application, that actually want's to cancel it's query, send's a SIGINT signal to the backend it is connected to? Bruce! To do so would require to be the PostgreSQL UNIX user on the database server! What I was talking about is the PQcancelRequest(PGconn *conn) function in libpq. This "client side" function opens another connection to the postmaster, using the same host and port as "conn" did. Then it sends a cancel request startup packet containing this connections backend pid and cancel key (only known if the client talks version 2 or above of the protocol). The spawned off backend process receiving the cancel request startup packet on the "server side" checks the postmasters process list for validity of the pid and cancel key combination and sends the backend a signal. It is allowed to do so because it is a child of the postmaster, as the backend it is signalling is, both running under the same userid. So yes, every backend has that signal handler. But not everyone has a single user environment, where every process is allowed to kill everybody else. The client by default does not have any signal handler. So it could catch SIGALRM, do an alarm(10), do PQexec() and alarm(0). If the signal handler get's called, it'll call PQcancelRequest() causing PQexec() to recieve an ERROR (the message says something like "query canceled" or so). Jan -- #======================================================================# # It's easier to get forgiveness for being wrong than for being right. # # Let's break this rule - forgive me. # #================================================== JanWieck@Yahoo.com #