259 (
errmsg(
"inconsistent background worker state (max_worker_processes=%d, total_slots=%d)",
311 if (!allow_new_workers)
351 (
errcode(ERRCODE_OUT_OF_MEMORY),
352 errmsg(
"out of memory")));
395 elog(
DEBUG1,
"worker notification PID %d is not valid",
634 BackgroundWorkerEntry(
int slotno)
639 Assert(slotno < BackgroundWorkerData->total_slots);
644 memcpy(&myEntry, &slot->
worker,
sizeof myEntry);
668 (
errcode(ERRCODE_INVALID_PARAMETER_VALUE),
669 errmsg(
"background worker \"%s\": background workers without shared memory access are not supported",
679 (
errcode(ERRCODE_INVALID_PARAMETER_VALUE),
680 errmsg(
"background worker \"%s\": cannot request database access if starting at postmaster start",
693 (
errcode(ERRCODE_INVALID_PARAMETER_VALUE),
694 errmsg(
"background worker \"%s\": invalid restart interval",
708 (
errcode(ERRCODE_INVALID_PARAMETER_VALUE),
709 errmsg(
"background worker \"%s\": parallel workers may not be configured for restart",
717 if (strcmp(worker->
bgw_type,
"") == 0)
729 sigprocmask(SIG_SETMASK, &
BlockSig, NULL);
732 (
errcode(ERRCODE_ADMIN_SHUTDOWN),
733 errmsg(
"terminating background worker \"%s\" due to administrator command",
746 sigjmp_buf local_sigjmp_buf;
751 elog(
FATAL,
"unable to find bgworker entry");
799 if (sigsetjmp(local_sigjmp_buf, 1) != 0)
878 static int numworkers = 0;
889 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
890 errmsg(
"background worker \"%s\": must be registered in shared_preload_libraries",
901 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
902 errmsg(
"background worker \"%s\": only dynamic background workers can request notification",
916 (
errcode(ERRCODE_CONFIGURATION_LIMIT_EXCEEDED),
917 errmsg(
"too many background workers"),
918 errdetail_plural(
"Up to %d background worker can be registered with the current settings.",
919 "Up to %d background workers can be registered with the current settings.",
922 errhint(
"Consider increasing the configuration parameter \"max_worker_processes\".")));
933 (
errcode(ERRCODE_OUT_OF_MEMORY),
934 errmsg(
"out of memory")));
965 uint64 generation = 0;
1046 (*handle)->slot = slotno;
1047 (*handle)->generation = generation;
1213 bool signal_postmaster =
false;
1223 signal_postmaster =
true;
1228 if (signal_postmaster)
1257 if (strcmp(libraryname,
"postgres") == 0)
1297 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)
static bool SanityCheckBackgroundWorker(BackgroundWorker *worker, int elevel)
void ReportBackgroundWorkerPID(RegisteredBgWorker *rw)
void TerminateBackgroundWorker(BackgroundWorkerHandle *handle)
BgwHandleStatus WaitForBackgroundWorkerShutdown(BackgroundWorkerHandle *handle)
void ResetBackgroundWorkerCrashTimes(void)
void BackgroundWorkerShmemInit(void)
void StartBackgroundWorker(void)
struct BackgroundWorkerSlot BackgroundWorkerSlot
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)
static const struct @15 InternalBGWorkers[]
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_CLASS_PARALLEL
@ BgWorkerStart_PostmasterStart
#define BGWORKER_BACKEND_DATABASE_CONNECTION
#define BGWORKER_SHMEM_ACCESS
void(* bgworker_main_type)(Datum main_arg)
#define MAX_PARALLEL_WORKER_LIMIT
#define FLEXIBLE_ARRAY_MEMBER
elog(ERROR, "%s: %s", p2, msg)
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,...)
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)
Assert(fmt[strlen(fmt) - 1] !='\n')
bool LWLockAcquire(LWLock *lock, LWLockMode mode)
void LWLockRelease(LWLock *lock)
#define CHECK_FOR_INTERRUPTS()
#define HOLD_INTERRUPTS()
#define SetProcessingMode(mode)
BackendType MyBackendType
bool process_shared_preload_libraries_in_progress
static void static void status(const char *fmt,...) pg_attribute_printf(1
void SendPostmasterSignal(PMSignalReason reason)
@ PMSIGNAL_BACKGROUND_WORKER_CHANGE
pqsigfunc pqsignal(int signo, pqsigfunc func)
void FloatExceptionHandler(SIGNAL_ARGS)
void StatementCancelHandler(SIGNAL_ARGS)
void BackgroundWorkerUnblockSignals(void)
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)
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[BGW_MAXLEN]
TimestampTz rw_crashed_at
struct bkend * rw_backend
BackgroundWorker rw_worker
void InitializeTimeouts(void)
@ WAIT_EVENT_BGWORKER_STARTUP
@ WAIT_EVENT_BGWORKER_SHUTDOWN