diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index d12173a3e5a..b931961cc45 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -515,6 +515,10 @@ AutoVacLauncherMain(int argc, char *argv[]) /* Now we can allow interrupts again */ RESUME_INTERRUPTS(); + /* if in shutdown mode, no need for anything further; just go away */ + if (got_SIGTERM) + goto shutdown; + /* * Sleep at least 1 second after any error. We don't want to be * filling the error logs as fast as we can. @@ -528,10 +532,14 @@ AutoVacLauncherMain(int argc, char *argv[]) /* must unblock signals before calling rebuild_database_list */ PG_SETMASK(&UnBlockSig); - /* in emergency mode, just start a worker and go away */ + /* + * In emergency mode, just start a worker (unless shutdown was requested) + * and go away. + */ if (!AutoVacuumingActive()) { - do_start_worker(); + if (!got_SIGTERM) + do_start_worker(); proc_exit(0); /* done */ } @@ -546,7 +554,8 @@ AutoVacLauncherMain(int argc, char *argv[]) */ rebuild_database_list(InvalidOid); - for (;;) + /* loop until shutdown request */ + while (!got_SIGTERM) { struct timeval nap; TimestampTz current_time = 0; @@ -758,6 +767,7 @@ AutoVacLauncherMain(int argc, char *argv[]) } /* Normal exit from the autovac launcher is here */ +shutdown: ereport(LOG, (errmsg("autovacuum launcher shutting down"))); AutoVacuumShmem->av_launcherpid = 0;