260 (
errmsg(
"inconsistent background worker state (max_worker_processes=%d, total_slots=%d)",
312 if (!allow_new_workers)
354 (
errcode(ERRCODE_OUT_OF_MEMORY),
355 errmsg(
"out of memory")));
398 elog(
DEBUG1,
"worker notification PID %d is not valid",
650 (
errcode(ERRCODE_INVALID_PARAMETER_VALUE),
651 errmsg(
"background worker \"%s\": background workers without shared memory access are not supported",
661 (
errcode(ERRCODE_INVALID_PARAMETER_VALUE),
662 errmsg(
"background worker \"%s\": cannot request database access if starting at postmaster start",
675 (
errcode(ERRCODE_INVALID_PARAMETER_VALUE),
676 errmsg(
"background worker \"%s\": invalid restart interval",
690 (
errcode(ERRCODE_INVALID_PARAMETER_VALUE),
691 errmsg(
"background worker \"%s\": parallel workers may not be configured for restart",
699 if (strcmp(worker->
bgw_type,
"") == 0)
711 sigprocmask(SIG_SETMASK, &
BlockSig, NULL);
714 (
errcode(ERRCODE_ADMIN_SHUTDOWN),
715 errmsg(
"terminating background worker \"%s\" due to administrator command",
725 sigjmp_buf local_sigjmp_buf;
729 if (startup_data == NULL)
730 elog(
FATAL,
"unable to find bgworker entry");
790 if (sigsetjmp(local_sigjmp_buf, 1) != 0)
873 (
errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
874 errmsg(
"database connection requirement not indicated during registration")));
884 (
errmsg(
"invalid processing mode in background worker")));
907 (
errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
908 errmsg(
"database connection requirement not indicated during registration")));
918 (
errmsg(
"invalid processing mode in background worker")));
928 sigprocmask(SIG_SETMASK, &
BlockSig, NULL);
948 static int numworkers = 0;
970 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
971 errmsg(
"background worker \"%s\": must be registered in \"shared_preload_libraries\"",
981 elog(
ERROR,
"cannot register background worker \"%s\" after shmem init",
993 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
994 errmsg(
"background worker \"%s\": only dynamic background workers can request notification",
1008 (
errcode(ERRCODE_CONFIGURATION_LIMIT_EXCEEDED),
1009 errmsg(
"too many background workers"),
1010 errdetail_plural(
"Up to %d background worker can be registered with the current settings.",
1011 "Up to %d background workers can be registered with the current settings.",
1014 errhint(
"Consider increasing the configuration parameter \"%s\".",
"max_worker_processes")));
1027 (
errcode(ERRCODE_OUT_OF_MEMORY),
1028 errmsg(
"out of memory")));
1059 uint64 generation = 0;
1140 (*handle)->slot = slotno;
1141 (*handle)->generation = generation;
1239 WAIT_EVENT_BGWORKER_STARTUP);
1282 WAIT_EVENT_BGWORKER_SHUTDOWN);
1307 bool signal_postmaster =
false;
1317 signal_postmaster =
true;
1322 if (signal_postmaster)
1351 if (strcmp(libraryname,
"postgres") == 0)
1391 if (slot->
pid > 0 && slot->
pid == pid)
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)
static RegisteredBgWorker * FindRegisteredWorkerBySlotNumber(int slotno)
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[]
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)
const char * GetBackgroundWorkerTypeByPid(pid_t pid)
void ForgetBackgroundWorker(slist_mutable_iter *cur)
slist_head BackgroundWorkerList
BgwHandleStatus GetBackgroundWorkerPid(BackgroundWorkerHandle *handle, pid_t *pidp)
static BackgroundWorkerArray * BackgroundWorkerData
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)
void BackgroundWorkerMain(char *startup_data, size_t startup_data_len)
bool RegisterDynamicBackgroundWorker(BackgroundWorker *worker, BackgroundWorkerHandle **handle)
void ReportBackgroundWorkerExit(slist_mutable_iter *cur)
bgworker_main_type fn_addr
void ForgetUnstartedBackgroundWorkers(void)
struct BackgroundWorkerArray BackgroundWorkerArray
#define BGW_NEVER_RESTART
#define BGWORKER_BYPASS_ROLELOGINCHECK
#define BGWORKER_CLASS_PARALLEL
@ 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 Assert(condition)
#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 MCXT_ALLOC_NO_OOM
bool IsPostmasterEnvironment
static void slist_delete_current(slist_mutable_iter *iter)
#define slist_foreach_modify(iter, lhead)
#define SLIST_STATIC_INIT(name)
static void slist_push_head(slist_head *head, slist_node *node)
#define slist_container(type, membername, ptr)
#define slist_foreach(iter, lhead)
void ResetLatch(Latch *latch)
int WaitLatch(Latch *latch, int wakeEvents, long timeout, uint32 wait_event_info)
#define WL_POSTMASTER_DEATH
void ApplyLauncherMain(Datum main_arg)
bool LWLockAcquire(LWLock *lock, LWLockMode mode)
void LWLockRelease(LWLock *lock)
void pfree(void *pointer)
MemoryContext TopMemoryContext
void * MemoryContextAllocExtended(MemoryContext context, Size size, int flags)
void * MemoryContextAlloc(MemoryContext context, Size size)
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
pqsigfunc pqsignal(int signo, pqsigfunc func)
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)
void procsignal_sigusr1_handler(SIGNAL_ARGS)
void init_ps_display(const char *fixed_part)
Size add_size(Size s1, Size s2)
void * ShmemInitStruct(const char *name, Size size, bool *foundPtr)
Size mul_size(Size s1, Size s2)
void pg_usleep(long microsec)
static pg_noinline void Size size
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
struct bkend * rw_backend
BackgroundWorker rw_worker
void TablesyncWorkerMain(Datum main_arg)
void InitializeTimeouts(void)