summaryrefslogtreecommitdiff
path: root/src/backend
diff options
context:
space:
mode:
authorTom Lane2007-07-01 18:30:54 +0000
committerTom Lane2007-07-01 18:30:54 +0000
commitbce7bacdf206436cf2b85ccbbdc6cef56415f32d (patch)
treea0972e3ad5b8d2f3e0df90a021b4cc218efb58ac /src/backend
parent421d50273f310a5ad923dfa99af3a2cb377dcef1 (diff)
Reduce the maximum sleep interval in the autovac launcher to 1 second,
so that it responds to SIGQUIT reasonably promptly even on machines where SA_RESTART signals restart a sleep from scratch. (This whole area could stand some rethinking, but for now make it work like the other processes do.) Also some marginal stylistic cleanups.
Diffstat (limited to 'src/backend')
-rw-r--r--src/backend/postmaster/autovacuum.c55
1 files changed, 29 insertions, 26 deletions
diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c
index a00f6d708d2..aa674e54f92 100644
--- a/src/backend/postmaster/autovacuum.c
+++ b/src/backend/postmaster/autovacuum.c
@@ -55,7 +55,7 @@
*
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/backend/postmaster/autovacuum.c,v 1.54 2007/07/01 02:20:59 tgl Exp $
+ * $PostgreSQL: pgsql/src/backend/postmaster/autovacuum.c,v 1.55 2007/07/01 18:30:54 tgl Exp $
*
*-------------------------------------------------------------------------
*/
@@ -99,10 +99,6 @@
#include "utils/syscache.h"
-static volatile sig_atomic_t got_SIGUSR1 = false;
-static volatile sig_atomic_t got_SIGHUP = false;
-static volatile sig_atomic_t avlauncher_shutdown_request = false;
-
/*
* GUC parameters
*/
@@ -121,13 +117,15 @@ int autovacuum_vac_cost_limit;
int Log_autovacuum = -1;
-/* maximum sleep duration in the launcher, in seconds */
-#define AV_SLEEP_QUANTUM 10
-
/* Flags to tell if we are in an autovacuum process */
static bool am_autovacuum_launcher = false;
static bool am_autovacuum_worker = false;
+/* Flags set by signal handlers */
+static volatile sig_atomic_t got_SIGHUP = false;
+static volatile sig_atomic_t got_SIGUSR1 = false;
+static volatile sig_atomic_t got_SIGTERM = false;
+
/* Comparison point for determining whether freeze_max_age is exceeded */
static TransactionId recentXid;
@@ -291,7 +289,7 @@ static PgStat_StatTabEntry *get_pgstat_tabentry_relid(Oid relid, bool isshared,
static void autovac_report_activity(VacuumStmt *vacstmt, Oid relid);
static void avl_sighup_handler(SIGNAL_ARGS);
static void avl_sigusr1_handler(SIGNAL_ARGS);
-static void avlauncher_shutdown(SIGNAL_ARGS);
+static void avl_sigterm_handler(SIGNAL_ARGS);
static void avl_quickdie(SIGNAL_ARGS);
@@ -411,7 +409,7 @@ AutoVacLauncherMain(int argc, char *argv[])
pqsignal(SIGHUP, avl_sighup_handler);
pqsignal(SIGINT, SIG_IGN);
- pqsignal(SIGTERM, avlauncher_shutdown);
+ pqsignal(SIGTERM, avl_sigterm_handler);
pqsignal(SIGQUIT, avl_quickdie);
pqsignal(SIGALRM, SIG_IGN);
@@ -544,23 +542,27 @@ AutoVacLauncherMain(int argc, char *argv[])
INVALID_OFFSET, false, &nap);
/*
- * Sleep for a while according to schedule. We only sleep in
- * AV_SLEEP_QUANTUM second intervals, in order to promptly notice
- * postmaster death.
+ * Sleep for a while according to schedule.
+ *
+ * On some platforms, signals won't interrupt the sleep. To ensure we
+ * respond reasonably promptly when someone signals us, break down the
+ * sleep into 1-second increments, and check for interrupts after each
+ * nap.
*/
while (nap.tv_sec > 0 || nap.tv_usec > 0)
{
uint32 sleeptime;
- sleeptime = nap.tv_usec;
- nap.tv_usec = 0;
-
if (nap.tv_sec > 0)
{
- sleeptime += Min(nap.tv_sec, AV_SLEEP_QUANTUM) * 1000000;
- nap.tv_sec -= Min(nap.tv_sec, AV_SLEEP_QUANTUM);
+ sleeptime = 1000000;
+ nap.tv_sec--;
+ }
+ else
+ {
+ sleeptime = nap.tv_usec;
+ nap.tv_usec = 0;
}
-
pg_usleep(sleeptime);
/*
@@ -570,12 +572,12 @@ AutoVacLauncherMain(int argc, char *argv[])
if (!PostmasterIsAlive(true))
exit(1);
- if (avlauncher_shutdown_request || got_SIGHUP || got_SIGUSR1)
+ if (got_SIGTERM || got_SIGHUP || got_SIGUSR1)
break;
}
/* the normal shutdown case */
- if (avlauncher_shutdown_request)
+ if (got_SIGTERM)
break;
if (got_SIGHUP)
@@ -788,7 +790,7 @@ launcher_determine_sleep(bool canlaunch, bool recursing, struct timeval *nap)
* We only recurse once. rebuild_database_list should always return times
* in the future, but it seems best not to trust too much on that.
*/
- if (nap->tv_sec == 0L && nap->tv_usec == 0 && !recursing)
+ if (nap->tv_sec == 0 && nap->tv_usec == 0 && !recursing)
{
rebuild_database_list(InvalidOid);
launcher_determine_sleep(canlaunch, true, nap);
@@ -796,9 +798,9 @@ launcher_determine_sleep(bool canlaunch, bool recursing, struct timeval *nap)
}
/* 100ms is the smallest time we'll allow the launcher to sleep */
- if (nap->tv_sec <= 0L && nap->tv_usec <= 100000)
+ if (nap->tv_sec <= 0 && nap->tv_usec <= 100000)
{
- nap->tv_sec = 0L;
+ nap->tv_sec = 0;
nap->tv_usec = 100000; /* 100 ms */
}
}
@@ -1276,10 +1278,11 @@ avl_sigusr1_handler(SIGNAL_ARGS)
got_SIGUSR1 = true;
}
+/* SIGTERM: time to die */
static void
-avlauncher_shutdown(SIGNAL_ARGS)
+avl_sigterm_handler(SIGNAL_ARGS)
{
- avlauncher_shutdown_request = true;
+ got_SIGTERM = true;
}
/*