diff options
Diffstat (limited to 'src/backend/postmaster/postmaster.c')
-rw-r--r-- | src/backend/postmaster/postmaster.c | 23 |
1 files changed, 16 insertions, 7 deletions
diff --git a/src/backend/postmaster/postmaster.c b/src/backend/postmaster/postmaster.c index 1197b4fa87a..fff4227e0b6 100644 --- a/src/backend/postmaster/postmaster.c +++ b/src/backend/postmaster/postmaster.c @@ -3800,6 +3800,13 @@ PostmasterStateMachine(void) */ if (pmState == PM_STOP_BACKENDS) { + /* + * Forget any pending requests for background workers, since we're no + * longer willing to launch any new workers. (If additional requests + * arrive, BackgroundWorkerStateChange will reject them.) + */ + ForgetUnstartedBackgroundWorkers(); + /* Signal all backend children except walsenders */ SignalSomeChildren(SIGTERM, BACKEND_TYPE_ALL - BACKEND_TYPE_WALSND); @@ -5154,13 +5161,6 @@ sigusr1_handler(SIGNAL_ARGS) PG_SETMASK(&BlockSig); #endif - /* Process background worker state change. */ - if (CheckPostmasterSignal(PMSIGNAL_BACKGROUND_WORKER_CHANGE)) - { - BackgroundWorkerStateChange(); - StartWorkerNeeded = true; - } - /* * RECOVERY_STARTED and BEGIN_HOT_STANDBY signals are ignored in * unexpected states. If the startup process quickly starts up, completes @@ -5206,6 +5206,7 @@ sigusr1_handler(SIGNAL_ARGS) pmState = PM_RECOVERY; } + if (CheckPostmasterSignal(PMSIGNAL_BEGIN_HOT_STANDBY) && pmState == PM_RECOVERY && Shutdown == NoShutdown) { @@ -5231,6 +5232,14 @@ sigusr1_handler(SIGNAL_ARGS) StartWorkerNeeded = true; } + /* Process background worker state changes. */ + if (CheckPostmasterSignal(PMSIGNAL_BACKGROUND_WORKER_CHANGE)) + { + /* Accept new worker requests only if not stopping. */ + BackgroundWorkerStateChange(pmState < PM_STOP_BACKENDS); + StartWorkerNeeded = true; + } + if (StartWorkerNeeded || HaveCrashedWorker) maybe_start_bgworkers(); |