diff options
Diffstat (limited to 'src/backend')
-rw-r--r-- | src/backend/postmaster/bgworker.c | 67 | ||||
-rw-r--r-- | src/backend/postmaster/postmaster.c | 23 |
2 files changed, 34 insertions, 56 deletions
diff --git a/src/backend/postmaster/bgworker.c b/src/backend/postmaster/bgworker.c index 11c4ceddbf6..c05f5006393 100644 --- a/src/backend/postmaster/bgworker.c +++ b/src/backend/postmaster/bgworker.c @@ -652,17 +652,24 @@ static bool SanityCheckBackgroundWorker(BackgroundWorker *worker, int elevel) { /* sanity check for flags */ - if (worker->bgw_flags & BGWORKER_BACKEND_DATABASE_CONNECTION) + + /* + * We used to support workers not connected to shared memory, but don't + * anymore. Thus this is a required flag now. We're not removing the flag + * for compatibility reasons and because the flag still provides some + * signal when reading code. + */ + if (!(worker->bgw_flags & BGWORKER_SHMEM_ACCESS)) { - if (!(worker->bgw_flags & BGWORKER_SHMEM_ACCESS)) - { - ereport(elevel, - (errcode(ERRCODE_INVALID_PARAMETER_VALUE), - errmsg("background worker \"%s\": must attach to shared memory in order to request a database connection", - worker->bgw_name))); - return false; - } + ereport(elevel, + (errcode(ERRCODE_INVALID_PARAMETER_VALUE), + errmsg("background worker \"%s\": background worker without shared memory access are not supported", + worker->bgw_name))); + return false; + } + if (worker->bgw_flags & BGWORKER_BACKEND_DATABASE_CONNECTION) + { if (worker->bgw_start_time == BgWorkerStart_PostmasterStart) { ereport(elevel, @@ -745,20 +752,6 @@ StartBackgroundWorker(void) MyBackendType = B_BG_WORKER; init_ps_display(worker->bgw_name); - /* - * If we're not supposed to have shared memory access, then detach from - * shared memory. If we didn't request shared memory access, the - * postmaster won't force a cluster-wide restart if we exit unexpectedly, - * so we'd better make sure that we don't mess anything up that would - * require that sort of cleanup. - */ - if ((worker->bgw_flags & BGWORKER_SHMEM_ACCESS) == 0) - { - ShutdownLatchSupport(); - dsm_detach_all(); - PGSharedMemoryDetach(); - } - SetProcessingMode(InitProcessing); /* Apply PostAuthDelay */ @@ -832,29 +825,19 @@ StartBackgroundWorker(void) PG_exception_stack = &local_sigjmp_buf; /* - * If the background worker request shared memory access, set that up now; - * else, detach all shared memory segments. + * Create a per-backend PGPROC struct in shared memory, except in the + * EXEC_BACKEND case where this was done in SubPostmasterMain. We must + * do this before we can use LWLocks (and in the EXEC_BACKEND case we + * already had to do some stuff with LWLocks). */ - if (worker->bgw_flags & BGWORKER_SHMEM_ACCESS) - { - /* - * Create a per-backend PGPROC struct in shared memory, except in the - * EXEC_BACKEND case where this was done in SubPostmasterMain. We must - * do this before we can use LWLocks (and in the EXEC_BACKEND case we - * already had to do some stuff with LWLocks). - */ #ifndef EXEC_BACKEND - InitProcess(); + InitProcess(); #endif - /* - * Early initialization. Some of this could be useful even for - * background workers that aren't using shared memory, but they can - * call the individual startup routines for those subsystems if - * needed. - */ - BaseInit(); - } + /* + * Early initialization. + */ + BaseInit(); /* * Look up the entry point function, loading its library if necessary. diff --git a/src/backend/postmaster/postmaster.c b/src/backend/postmaster/postmaster.c index fc0bc8d99ee..9c2c98614aa 100644 --- a/src/backend/postmaster/postmaster.c +++ b/src/backend/postmaster/postmaster.c @@ -3302,26 +3302,21 @@ CleanupBackgroundWorker(int pid, } /* - * Additionally, for shared-memory-connected workers, just like a - * backend, any exit status other than 0 or 1 is considered a crash - * and causes a system-wide restart. + * Additionally, just like a backend, any exit status other than 0 or + * 1 is considered a crash and causes a system-wide restart. */ - if ((rw->rw_worker.bgw_flags & BGWORKER_SHMEM_ACCESS) != 0) + if (!EXIT_STATUS_0(exitstatus) && !EXIT_STATUS_1(exitstatus)) { - if (!EXIT_STATUS_0(exitstatus) && !EXIT_STATUS_1(exitstatus)) - { - HandleChildCrash(pid, exitstatus, namebuf); - return true; - } + HandleChildCrash(pid, exitstatus, namebuf); + return true; } /* - * We must release the postmaster child slot whether this worker is - * connected to shared memory or not, but we only treat it as a crash - * if it is in fact connected. + * We must release the postmaster child slot. If the worker failed to + * do so, it did not clean up after itself, requiring a crash-restart + * cycle. */ - if (!ReleasePostmasterChildSlot(rw->rw_child_slot) && - (rw->rw_worker.bgw_flags & BGWORKER_SHMEM_ACCESS) != 0) + if (!ReleasePostmasterChildSlot(rw->rw_child_slot)) { HandleChildCrash(pid, exitstatus, namebuf); return true; |