264 (
errmsg(
"inconsistent background worker state (\"max_worker_processes\"=%d, total slots=%d)",
316 if (!allow_new_workers)
358 (
errcode(ERRCODE_OUT_OF_MEMORY),
359 errmsg(
"out of memory")));
402 elog(
DEBUG1,
"worker notification PID %d is not valid",
649 (
errcode(ERRCODE_INVALID_PARAMETER_VALUE),
650 errmsg(
"background worker \"%s\": background workers without shared memory access are not supported",
660 (
errcode(ERRCODE_INVALID_PARAMETER_VALUE),
661 errmsg(
"background worker \"%s\": cannot request database access if starting at postmaster start",
674 (
errcode(ERRCODE_INVALID_PARAMETER_VALUE),
675 errmsg(
"background worker \"%s\": cannot make background workers interruptible without database access",
685 (
errcode(ERRCODE_INVALID_PARAMETER_VALUE),
686 errmsg(
"background worker \"%s\": invalid restart interval",
700 (
errcode(ERRCODE_INVALID_PARAMETER_VALUE),
701 errmsg(
"background worker \"%s\": parallel workers may not be configured for restart",
709 if (strcmp(worker->
bgw_type,
"") == 0)
721 sigprocmask(SIG_SETMASK, &
BlockSig, NULL);
724 (
errcode(ERRCODE_ADMIN_SHUTDOWN),
725 errmsg(
"terminating background worker \"%s\" due to administrator command",
735 sigjmp_buf local_sigjmp_buf;
739 if (startup_data == NULL)
740 elog(
FATAL,
"unable to find bgworker entry");
800 if (sigsetjmp(local_sigjmp_buf, 1) != 0)
883 (
errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
884 errmsg(
"database connection requirement not indicated during registration")));
894 (
errmsg(
"invalid processing mode in background worker")));
917 (
errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
918 errmsg(
"database connection requirement not indicated during registration")));
928 (
errmsg(
"invalid processing mode in background worker")));
938 sigprocmask(SIG_SETMASK, &
BlockSig, NULL);
958 static int numworkers = 0;
980 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
981 errmsg(
"background worker \"%s\": must be registered in \"shared_preload_libraries\"",
991 elog(
ERROR,
"cannot register background worker \"%s\" after shmem init",
1003 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
1004 errmsg(
"background worker \"%s\": only dynamic background workers can request notification",
1018 (
errcode(ERRCODE_CONFIGURATION_LIMIT_EXCEEDED),
1019 errmsg(
"too many background workers"),
1020 errdetail_plural(
"Up to %d background worker can be registered with the current settings.",
1021 "Up to %d background workers can be registered with the current settings.",
1024 errhint(
"Consider increasing the configuration parameter \"%s\".",
"max_worker_processes")));
1037 (
errcode(ERRCODE_OUT_OF_MEMORY),
1038 errmsg(
"out of memory")));
1148 (*handle)->slot = slotno;
1149 (*handle)->generation = generation;
1247 WAIT_EVENT_BGWORKER_STARTUP);
1290 WAIT_EVENT_BGWORKER_SHUTDOWN);
1315 bool signal_postmaster =
false;
1325 signal_postmaster =
true;
1330 if (signal_postmaster)
1359 if (strcmp(libraryname,
"postgres") == 0)
1399 if (slot->
pid > 0 && slot->
pid == pid)
1422 bool signal_postmaster =
false;
1442 signal_postmaster =
true;
1450 if (signal_postmaster)
void ParallelApplyWorkerMain(Datum main_arg)
void ascii_safe_strlcpy(char *dest, const char *src, size_t destsiz)
#define pg_memory_barrier()
#define pg_read_barrier()
#define pg_write_barrier()
void ParallelWorkerMain(Datum main_arg)
void ApplyWorkerMain(Datum main_arg)
void RegisterBackgroundWorker(BackgroundWorker *worker)
BgwHandleStatus WaitForBackgroundWorkerStartup(BackgroundWorkerHandle *handle, pid_t *pidp)
void BackgroundWorkerInitializeConnection(const char *dbname, const char *username, uint32 flags)
static bool SanityCheckBackgroundWorker(BackgroundWorker *worker, int elevel)
void ReportBackgroundWorkerPID(RegisteredBgWorker *rw)
void TerminateBackgroundWorker(BackgroundWorkerHandle *handle)
static const struct @18 InternalBGWorkers[]
void TerminateBackgroundWorkersForDatabase(Oid databaseId)
void ReportBackgroundWorkerExit(RegisteredBgWorker *rw)
BgwHandleStatus WaitForBackgroundWorkerShutdown(BackgroundWorkerHandle *handle)
void ResetBackgroundWorkerCrashTimes(void)
void BackgroundWorkerShmemInit(void)
void BackgroundWorkerUnblockSignals(void)
struct BackgroundWorkerSlot BackgroundWorkerSlot
void BackgroundWorkerInitializeConnectionByOid(Oid dboid, Oid useroid, uint32 flags)
void BackgroundWorkerBlockSignals(void)
dlist_head BackgroundWorkerList
void ForgetBackgroundWorker(RegisteredBgWorker *rw)
BgwHandleStatus GetBackgroundWorkerPid(BackgroundWorkerHandle *handle, pid_t *pidp)
static BackgroundWorkerArray * BackgroundWorkerData
static RegisteredBgWorker * FindRegisteredWorkerBySlotNumber(int slotno)
static bgworker_main_type LookupBackgroundWorkerFunction(const char *libraryname, const char *funcname)
static void bgworker_die(SIGNAL_ARGS)
void BackgroundWorkerStopNotifications(pid_t pid)
Size BackgroundWorkerShmemSize(void)
void BackgroundWorkerStateChange(bool allow_new_workers)
const char * GetBackgroundWorkerTypeByPid(pid_t pid)
bool RegisterDynamicBackgroundWorker(BackgroundWorker *worker, BackgroundWorkerHandle **handle)
void BackgroundWorkerMain(const void *startup_data, size_t startup_data_len)
bgworker_main_type fn_addr
void ForgetUnstartedBackgroundWorkers(void)
struct BackgroundWorkerArray BackgroundWorkerArray
#define BGW_NEVER_RESTART
#define BGWORKER_BYPASS_ROLELOGINCHECK
#define BGWORKER_CLASS_PARALLEL
#define BGWORKER_INTERRUPTIBLE
@ BgWorkerStart_PostmasterStart
#define BGWORKER_BACKEND_DATABASE_CONNECTION
#define BGWORKER_BYPASS_ALLOWCONN
#define BGWORKER_SHMEM_ACCESS
void(* bgworker_main_type)(Datum main_arg)
#define MAX_PARALLEL_WORKER_LIMIT
#define FLEXIBLE_ARRAY_MEMBER
void * load_external_function(const char *filename, const char *funcname, bool signalNotFound, void **filehandle)
int errmsg_internal(const char *fmt,...)
void EmitErrorReport(void)
ErrorContextCallback * error_context_stack
int errdetail_plural(const char *fmt_singular, const char *fmt_plural, unsigned long n,...)
int errhint(const char *fmt,...)
int errcode(int sqlerrcode)
int errmsg(const char *fmt,...)
sigjmp_buf * PG_exception_stack
#define ereport(elevel,...)
#define palloc_object(type)
#define MCXT_ALLOC_NO_OOM
bool IsPostmasterEnvironment
Assert(PointerIsAligned(start, uint64))
#define dlist_foreach(iter, lhead)
static void dlist_delete(dlist_node *node)
static void dlist_push_head(dlist_head *head, dlist_node *node)
#define dlist_foreach_modify(iter, lhead)
#define DLIST_STATIC_INIT(name)
#define dlist_container(type, membername, ptr)
void ResetLatch(Latch *latch)
int WaitLatch(Latch *latch, int wakeEvents, long timeout, uint32 wait_event_info)
void ApplyLauncherMain(Datum main_arg)
bool LWLockAcquire(LWLock *lock, LWLockMode mode)
void LWLockRelease(LWLock *lock)
void * MemoryContextAlloc(MemoryContext context, Size size)
void pfree(void *pointer)
MemoryContext TopMemoryContext
void * MemoryContextAllocExtended(MemoryContext context, Size size, int flags)
MemoryContext PostmasterContext
void MemoryContextDelete(MemoryContext context)
#define GetProcessingMode()
#define CHECK_FOR_INTERRUPTS()
#define HOLD_INTERRUPTS()
#define IsInitProcessingMode()
#define SetProcessingMode(mode)
#define INIT_PG_OVERRIDE_ROLE_LOGIN
#define INIT_PG_OVERRIDE_ALLOW_CONNS
BackendType MyBackendType
bool process_shared_preload_libraries_in_progress
void SendPostmasterSignal(PMSignalReason reason)
@ PMSIGNAL_BACKGROUND_WORKER_CHANGE
void FloatExceptionHandler(SIGNAL_ARGS)
void StatementCancelHandler(SIGNAL_ARGS)
void InitPostgres(const char *in_dbname, Oid dboid, const char *username, Oid useroid, bits32 flags, char *out_dbname)
BackgroundWorker * MyBgworkerEntry
bool PostmasterMarkPIDForWorkerNotify(int pid)
PGPROC * BackendPidGetProc(int pid)
void procsignal_sigusr1_handler(SIGNAL_ARGS)
void init_ps_display(const char *fixed_part)
void SequenceSyncWorkerMain(Datum main_arg)
Size add_size(Size s1, Size s2)
Size mul_size(Size s1, Size s2)
void * ShmemInitStruct(const char *name, Size size, bool *foundPtr)
void pg_usleep(long microsec)
uint32 parallel_terminate_count
uint32 parallel_register_count
BackgroundWorkerSlot slot[FLEXIBLE_ARRAY_MEMBER]
char bgw_function_name[BGW_MAXLEN]
char bgw_name[BGW_MAXLEN]
char bgw_type[BGW_MAXLEN]
BgWorkerStartTime bgw_start_time
char bgw_extra[BGW_EXTRALEN]
char bgw_library_name[MAXPGPATH]
TimestampTz rw_crashed_at
BackgroundWorker rw_worker
void TableSyncWorkerMain(Datum main_arg)
void InitializeTimeouts(void)
#define WL_POSTMASTER_DEATH