From deebd45d5883c54d933ea03edc9cedf68179b653 Mon Sep 17 00:00:00 2001 From: Michael Paquier Date: Wed, 25 Mar 2015 15:30:35 +0900 Subject: [PATCH 1/2] Enable tracking of SIGHUP in autovacuum workers This check is done in the outer loop of the worker process before processing one table, and this is useful for example to change dynamically autovacuum cost parameters whiel processing one database with a worker. --- src/backend/postmaster/autovacuum.c | 26 +++++++++++++++++++------- 1 file changed, 19 insertions(+), 7 deletions(-) diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 5ccae24..004a074 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,21 @@ do_autovacuum(void) CHECK_FOR_INTERRUPTS(); /* + * Check for SIGHUP before processing each collected table, this + * is useful to balance dynamically autovacuum-related parameters, + * like cost parameters, while running process on a database. + */ + if (got_SIGHUP) + { + got_SIGHUP = false; + ProcessConfigFile(PGC_SIGHUP); + + /* shutdown requested in config file? */ + if (!AutoVacuumingActive()) + break; + } + + /* * 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. -- 2.3.4