Server instrumentation: pg_terminate_backend, pg_reload_conf - Mailing list pgsql-patches
| From | Andreas Pflug |
|---|---|
| Subject | Server instrumentation: pg_terminate_backend, pg_reload_conf |
| Date | |
| Msg-id | 429E23A9.5030905@pse-consulting.de Whole thread Raw |
| Responses |
Re: Server instrumentation: pg_terminate_backend, pg_reload_conf
|
| List | pgsql-patches |
This patch reenables pg_terminate_backend, allowing (superuser only, of
course) to terminate a backend. As taken from the discussion some weeks
earlier, SIGTERM seems to be used quite widely, without a report of
misbehaviour so while the code path is officially not too well tested,
in practice it's working ok and helpful.
pg_reload_conf is a client-side issued SIGHUP, shouldn't provoke too
much problems.
Regards,
Andreas
Index: doc/src/sgml/func.sgml
===================================================================
RCS file: /projects/cvsroot/pgsql/doc/src/sgml/func.sgml,v
retrieving revision 1.250
diff -u -r1.250 func.sgml
--- doc/src/sgml/func.sgml 23 May 2005 01:50:01 -0000 1.250
+++ doc/src/sgml/func.sgml 1 Jun 2005 20:49:09 -0000
@@ -8860,6 +8860,12 @@
<indexterm zone="functions-admin">
<primary>pg_cancel_backend</primary>
</indexterm>
+ <indexterm zone="functions-admin">
+ <primary>pg_terminate_backend</primary>
+ </indexterm>
+ <indexterm zone="functions-admin">
+ <primary>pg_reload_conf</primary>
+ </indexterm>
<indexterm zone="functions-admin">
<primary>signal</primary>
@@ -8889,17 +8895,46 @@
<entry><type>int</type></entry>
<entry>Cancel a backend's current query</entry>
</row>
+ <row>
+ <entry>
+ <literal><function>pg_terminate_backend</function>(<parameter>pid</parameter>)</literal>
+ </entry>
+ <entry><type>int</type></entry>
+ <entry>Terminate a backend process</entry>
+ </row>
+ <row>
+ <entry>
+ <literal><function>pg_reload_conf</function>(<parameter></parameter>)</literal>
+ </entry>
+ <entry><type>int</type></entry>
+ <entry>Triggers the server processes to reload configuration files</entry>
+ </row>
</tbody>
</tgroup>
</table>
<para>
- This function returns 1 if successful, 0 if not successful.
+ These functions return 1 if successful, 0 if not successful.
The process ID (<literal>pid</literal>) of an active backend can be found
from the <structfield>procpid</structfield> column in the
<structname>pg_stat_activity</structname> view, or by listing the <command>postgres</command>
processes on the server with <application>ps</>.
</para>
+ <para>
+ Terminating a backend with <function>pg_terminate_backend</>
+ should be used only as a last resort, i.e. if the backend process
+ doesn't react to <function>pg_cancel_backend</> any more and can't
+ be controlled otherwise. Since the exact state of the
+ backend at the moment of termination isn't precisely known, some
+ locked resources might remain in the server's shared memory
+ structure, effectively blocking other backends. In this case,
+ you'd have to stop and restart the postmaster.
+ </para>
+ <para>
+ <function>pg_reload_conf</> sends a SIGHUP event to the
+ postmaster, and thus triggers a reload of the configuration files
+ in all backend processes.
+ </para>
<indexterm zone="functions-admin">
<primary>pg_start_backup</primary>
@@ -8970,6 +9005,83 @@
For details about proper usage of these functions, see
<xref linkend="backup-online">.
</para>
Index: src/backend/utils/adt/misc.c
===================================================================
RCS file: /projects/cvsroot/pgsql/src/backend/utils/adt/misc.c,v
retrieving revision 1.43
diff -u -r1.43 misc.c
--- src/backend/utils/adt/misc.c 19 May 2005 21:35:47 -0000 1.43
+++ src/backend/utils/adt/misc.c 1 Jun 2005 20:49:13 -0000
@@ -101,22 +101,40 @@
return 1;
}
+
Datum
pg_cancel_backend(PG_FUNCTION_ARGS)
{
PG_RETURN_INT32(pg_signal_backend(PG_GETARG_INT32(0), SIGINT));
}
-#ifdef NOT_USED
-
-/* Disabled in 8.0 due to reliability concerns; FIXME someday */
Datum
pg_terminate_backend(PG_FUNCTION_ARGS)
{
PG_RETURN_INT32(pg_signal_backend(PG_GETARG_INT32(0), SIGTERM));
}
-#endif
+
+
+Datum
+pg_reload_conf(PG_FUNCTION_ARGS)
+{
+ if (!superuser())
+ ereport(ERROR,
+ (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
+ (errmsg("only superuser can signal the postmaster"))));
+
+ if (kill(PostmasterPid, SIGHUP))
+ {
+ ereport(WARNING,
+ (errmsg("failed to send signal to postmaster: %m")));
+
+ PG_RETURN_INT32(0);
+ }
+
+ PG_RETURN_INT32(1);
+}
+
/* Function to find out which databases make use of a tablespace */
Index: src/include/catalog/pg_proc.h
===================================================================
RCS file: /projects/cvsroot/pgsql/src/include/catalog/pg_proc.h,v
retrieving revision 1.363
diff -u -r1.363 pg_proc.h
--- src/include/catalog/pg_proc.h 20 May 2005 01:29:55 -0000 1.363
+++ src/include/catalog/pg_proc.h 1 Jun 2005 20:49:31 -0000
@@ -3016,12 +3016,16 @@
DESCR("is conversion visible in search path?");
+DATA(insert OID = 2168 ( pg_terminate_backend PGNSP PGUID 12 f f t f v 1 23 "23" _null_ _null_ _null_
pg_terminate_backend- _null_ ));
+DESCR("Terminate a server process");
DATA(insert OID = 2171 ( pg_cancel_backend PGNSP PGUID 12 f f t f v 1 23 "23" _null_ _null_ _null_
pg_cancel_backend- _null_ ));
DESCR("Cancel a server process' current query");
DATA(insert OID = 2172 ( pg_start_backup PGNSP PGUID 12 f f t f v 1 25 "25" _null_ _null_ _null_
pg_start_backup- _null_ ));
DESCR("Prepare for taking an online backup");
DATA(insert OID = 2173 ( pg_stop_backup PGNSP PGUID 12 f f t f v 0 25 "" _null_ _null_ _null_
pg_stop_backup- _null_ ));
DESCR("Finish taking an online backup");
+DATA(insert OID = 2284 ( pg_reload_conf PGNSP PGUID 12 f f t f v 0 23 "" _null_ _null_ _null_ pg_reload_conf -
_null_));
+DESCR("Reloads configuration files");
/* Aggregates (moved here from pg_aggregate for 7.3) */
Index: src/include/utils/builtins.h
===================================================================
RCS file: /projects/cvsroot/pgsql/src/include/utils/builtins.h,v
retrieving revision 1.257
diff -u -r1.257 builtins.h
--- src/include/utils/builtins.h 27 May 2005 00:57:49 -0000 1.257
+++ src/include/utils/builtins.h 1 Jun 2005 20:49:34 -0000
@@ -362,8 +362,10 @@
extern Datum nonnullvalue(PG_FUNCTION_ARGS);
extern Datum current_database(PG_FUNCTION_ARGS);
extern Datum pg_cancel_backend(PG_FUNCTION_ARGS);
+extern Datum pg_terminate_backend(PG_FUNCTION_ARGS);
+extern Datum pg_reload_conf(PG_FUNCTION_ARGS);
extern Datum pg_tablespace_databases(PG_FUNCTION_ARGS);
/* not_in.c */
extern Datum int4notin(PG_FUNCTION_ARGS);
extern Datum oidnotin(PG_FUNCTION_ARGS);
pgsql-patches by date: