diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 65e3ff95f50..1aa433071a0 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -518,6 +518,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. @@ -552,10 +556,14 @@ AutoVacLauncherMain(int argc, char *argv[]) SetConfigOption("default_transaction_isolation", "read committed", PGC_SUSET, PGC_S_OVERRIDE); - /* 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 */ } @@ -570,7 +578,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; @@ -765,6 +774,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;