262 (
errmsg(
"inconsistent background worker state (max_worker_processes=%d, total_slots=%d)",
314 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",
637 BackgroundWorkerEntry(
int slotno)
642 Assert(slotno < BackgroundWorkerData->total_slots);
647 memcpy(&myEntry, &slot->
worker,
sizeof myEntry);
671 (
errcode(ERRCODE_INVALID_PARAMETER_VALUE),
672 errmsg(
"background worker \"%s\": background workers without shared memory access are not supported",
682 (
errcode(ERRCODE_INVALID_PARAMETER_VALUE),
683 errmsg(
"background worker \"%s\": cannot request database access if starting at postmaster start",
696 (
errcode(ERRCODE_INVALID_PARAMETER_VALUE),
697 errmsg(
"background worker \"%s\": invalid restart interval",
711 (
errcode(ERRCODE_INVALID_PARAMETER_VALUE),
712 errmsg(
"background worker \"%s\": parallel workers may not be configured for restart",
720 if (strcmp(worker->
bgw_type,
"") == 0)
732 sigprocmask(SIG_SETMASK, &
BlockSig, NULL);
735 (
errcode(ERRCODE_ADMIN_SHUTDOWN),
736 errmsg(
"terminating background worker \"%s\" due to administrator command",
749 sigjmp_buf local_sigjmp_buf;
754 elog(
FATAL,
"unable to find bgworker entry");
802 if (sigsetjmp(local_sigjmp_buf, 1) != 0)
881 static int numworkers = 0;
892 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
893 errmsg(
"background worker \"%s\": must be registered in shared_preload_libraries",
904 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
905 errmsg(
"background worker \"%s\": only dynamic background workers can request notification",
919 (
errcode(ERRCODE_CONFIGURATION_LIMIT_EXCEEDED),
920 errmsg(
"too many background workers"),
921 errdetail_plural(
"Up to %d background worker can be registered with the current settings.",
922 "Up to %d background workers can be registered with the current settings.",
925 errhint(
"Consider increasing the configuration parameter \"max_worker_processes\".")));
936 (
errcode(ERRCODE_OUT_OF_MEMORY),
937 errmsg(
"out of memory")));
968 uint64 generation = 0;
1049 (*handle)->slot = slotno;
1050 (*handle)->generation = generation;
1148 WAIT_EVENT_BGWORKER_STARTUP);
1191 WAIT_EVENT_BGWORKER_SHUTDOWN);
1216 bool signal_postmaster =
false;
1226 signal_postmaster =
true;
1231 if (signal_postmaster)
1260 if (strcmp(libraryname,
"postgres") == 0)
1300 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
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[MAXPGPATH]
TimestampTz rw_crashed_at
struct bkend * rw_backend
BackgroundWorker rw_worker
void TablesyncWorkerMain(Datum main_arg)
void InitializeTimeouts(void)