summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlvaro Herrera <alvherre@alvh.no-ip.org>2015-04-03 11:52:55 -0300
committerAlvaro Herrera <alvherre@alvh.no-ip.org>2015-04-03 11:52:55 -0300
commita75fb9b335db0e063ece283ebd207530abe1b53b (patch)
tree367d81a70f9dee7651ab30f256b3e7ba7aafb9a7
parent6e4bf4ecd3c2a266870139462a079809dfe7ab8c (diff)
Have autovacuum workers listen to SIGHUP, too
They have historically ignored it, but it's been said to be useful at times to change their settings mid-flight. Author: Michael Paquier
-rw-r--r--src/backend/postmaster/autovacuum.c27
1 files changed, 20 insertions, 7 deletions
diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c
index 080c3e62df8..b2d37e5d479 100644
--- a/src/backend/postmaster/autovacuum.c
+++ b/src/backend/postmaster/autovacuum.c
@@ -311,7 +311,7 @@ static PgStat_StatTabEntry *get_pgstat_tabentry_relid(Oid relid, bool isshared,
PgStat_StatDBEntry *shared,
PgStat_StatDBEntry *dbentry);
static void autovac_report_activity(autovac_table *tab);
-static void avl_sighup_handler(SIGNAL_ARGS);
+static void av_sighup_handler(SIGNAL_ARGS);
static void avl_sigusr2_handler(SIGNAL_ARGS);
static void avl_sigterm_handler(SIGNAL_ARGS);
static void autovac_refresh_stats(void);
@@ -419,7 +419,7 @@ AutoVacLauncherMain(int argc, char *argv[])
* backend, so we use the same signal handling. See equivalent code in
* tcop/postgres.c.
*/
- pqsignal(SIGHUP, avl_sighup_handler);
+ pqsignal(SIGHUP, av_sighup_handler);
pqsignal(SIGINT, StatementCancelHandler);
pqsignal(SIGTERM, avl_sigterm_handler);
@@ -1329,7 +1329,7 @@ AutoVacWorkerFailed(void)
/* SIGHUP: set flag to re-read config file at next convenient time */
static void
-avl_sighup_handler(SIGNAL_ARGS)
+av_sighup_handler(SIGNAL_ARGS)
{
int save_errno = errno;
@@ -1460,11 +1460,8 @@ AutoVacWorkerMain(int argc, char *argv[])
* Set up signal handlers. We operate on databases much like a regular
* backend, so we use the same signal handling. See equivalent code in
* tcop/postgres.c.
- *
- * Currently, we don't pay attention to postgresql.conf changes that
- * happen during a single daemon iteration, so we can ignore SIGHUP.
*/
- pqsignal(SIGHUP, SIG_IGN);
+ pqsignal(SIGHUP, av_sighup_handler);
/*
* SIGINT is used to signal canceling the current table's vacuum; SIGTERM
@@ -2164,6 +2161,22 @@ do_autovacuum(void)
CHECK_FOR_INTERRUPTS();
/*
+ * Check for config changes before processing each collected table.
+ */
+ if (got_SIGHUP)
+ {
+ got_SIGHUP = false;
+ ProcessConfigFile(PGC_SIGHUP);
+
+ /*
+ * You might be tempted to bail out if we see autovacuum is now
+ * disabled. Must resist that temptation -- this might be a
+ * for-wraparound emergency worker, in which case that would be
+ * entirely inappropriate.
+ */
+ }
+
+ /*
* hold schedule lock from here until we're sure that this table still
* needs vacuuming. We also need the AutovacuumLock to walk the
* worker array, but we'll let go of that one quickly.