85#include <systemd/sd-daemon.h>
88#ifdef HAVE_PTHREAD_IS_THREADED_NP
155 for (
int i = 0;
i < nargs;
i++)
156 mask.
mask |= 1 << t[
i];
160#define btmask_add(mask, ...) \
162 lengthof(((BackendType[]){__VA_ARGS__})), \
163 (BackendType[]){__VA_ARGS__} \
169 mask.
mask &= ~(1 << t);
178 for (
int i = 0;
i < nargs;
i++)
183#define btmask_all_except(...) \
184 btmask_all_except_n( \
185 lengthof(((BackendType[]){__VA_ARGS__})), \
186 (BackendType[]){__VA_ARGS__} \
192 return (mask.
mask & (1 << t)) != 0;
274#define SmartShutdown 1
275#define FastShutdown 2
276#define ImmediateShutdown 3
356#define SIGKILL_CHILDREN_AFTER_SECS 5
395static DNSServiceRef bonjour_sdref = NULL;
417 int pid,
int exitstatus);
433static bool CreateOptsFile(
int argc,
char *argv[],
char *fullprogname);
443static pid_t waitpid(pid_t pid,
int *exitstatus,
int options);
444static void WINAPI pgwin32_deadchild_callback(PVOID lpParameter, BOOLEAN TimerOrWaitFired);
446static HANDLE win32ChildQueue;
453} win32_deadchild_waitinfo;
457#define EXIT_STATUS_0(st) ((st) == 0)
458#define EXIT_STATUS_1(st) (WIFEXITED(st) && WEXITSTATUS(st) == 1)
459#define EXIT_STATUS_3(st) (WIFEXITED(st) && WEXITSTATUS(st) == 3)
469HANDLE PostmasterHandle;
481 bool listen_addr_saved =
false;
482 char *output_config_variable = NULL;
531 sigprocmask(SIG_SETMASK, &
BlockSig, NULL);
581 while ((opt =
getopt(argc, argv,
"B:bC:c:D:d:EeFf:h:ijk:lN:OPp:r:S:sTt:W:-:")) != -1)
595 output_config_variable = strdup(
optarg);
608 (
errcode(ERRCODE_SYNTAX_ERROR),
622 (
errcode(ERRCODE_SYNTAX_ERROR),
623 errmsg(
"--%s requires a value",
627 (
errcode(ERRCODE_SYNTAX_ERROR),
628 errmsg(
"-c %s requires a value",
661 write_stderr(
"%s: invalid argument for option -f: \"%s\"\n",
734 write_stderr(
"%s: invalid argument for option -t: \"%s\"\n",
746 write_stderr(
"Try \"%s --help\" for more information.\n",
759 write_stderr(
"Try \"%s --help\" for more information.\n",
771 if (output_config_variable != NULL)
796 puts(config_val ? config_val :
"");
825 write_stderr(
"%s: \"superuser_reserved_connections\" (%d) plus \"reserved_connections\" (%d) must be less than \"max_connections\" (%d)\n",
833 (
errmsg(
"WAL archival cannot be enabled when \"wal_level\" is \"minimal\"")));
836 (
errmsg(
"WAL streaming (\"max_wal_senders\" > 0) requires \"wal_level\" to be \"replica\" or \"logical\"")));
839 (
errmsg(
"WAL cannot be summarized when \"wal_level\" is \"minimal\"")));
856#ifdef HAVE_INT_OPTRESET
863#if !defined(WIN32) || defined(_MSC_VER)
970 if (output_config_variable != NULL)
975 puts(config_val ? config_val :
"");
1005 win32ChildQueue = CreateIoCompletionPort(INVALID_HANDLE_VALUE, NULL, 0, 1);
1006 if (win32ChildQueue == NULL)
1008 (
errmsg(
"could not create I/O completion port for child queue")));
1052 errmsg(
"could not remove file \"%s\": %m",
1074 (
errmsg(
"ending log output to stderr"),
1075 errhint(
"Future log output will go to log destination \"%s\".",
1086 (
errmsg(
"starting %s", PG_VERSION_STR)));
1112 (
errcode(ERRCODE_INVALID_PARAMETER_VALUE),
1113 errmsg(
"invalid list syntax in parameter \"%s\"",
1114 "listen_addresses")));
1117 foreach(l, elemlist)
1119 char *curhost = (
char *)
lfirst(l);
1121 if (strcmp(curhost,
"*") == 0)
1140 if (!listen_addr_saved)
1143 listen_addr_saved =
true;
1148 (
errmsg(
"could not create listen socket for \"%s\"",
1154 (
errmsg(
"could not create any TCP/IP sockets")));
1164 DNSServiceErrorType
err;
1172 err = DNSServiceRegister(&bonjour_sdref,
1176 "_postgresql._tcp.",
1184 if (
err != kDNSServiceErr_NoError)
1186 (
errmsg(
"DNSServiceRegister() failed: error code %ld",
1214 (
errcode(ERRCODE_INVALID_PARAMETER_VALUE),
1215 errmsg(
"invalid list syntax in parameter \"%s\"",
1216 "unix_socket_directories")));
1219 foreach(l, elemlist)
1221 char *socketdir = (
char *)
lfirst(l);
1239 (
errmsg(
"could not create Unix-domain socket in directory \"%s\"",
1245 (
errmsg(
"could not create any Unix-domain sockets")));
1256 (
errmsg(
"no socket created for listening")));
1263 if (!listen_addr_saved)
1287 write_stderr(
"%s: could not change permissions of external PID file \"%s\": %m\n",
1291 write_stderr(
"%s: could not write external PID file \"%s\": %m\n",
1331#ifdef HAVE_PTHREAD_IS_THREADED_NP
1342 if (pthread_is_threaded_np() != 0)
1344 (
errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
1345 errmsg(
"postmaster became multithreaded during startup"),
1346 errhint(
"Set the LC_ALL environment variable to a valid locale.")));
1405 elog(
LOG,
"could not close listen socket: %m");
1445 (
errmsg(
"%s: could not locate my own executable path",
argv0)));
1450 postgres_exec_path) < 0)
1452 (
errmsg(
"%s: could not locate matching postgres executable",
1473 errmsg(
"could not open directory \"%s\": %m",
1475 errhint(
"This may indicate an incomplete PostgreSQL installation, or that the file \"%s\" has been moved away from its proper location.",
1502 write_stderr(
"%s: could not find the database system\n"
1503 "Expected to find it in the directory \"%s\",\n"
1504 "but could not open file \"%s\": %m\n",
1540 return Max(seconds * 1000, 0);
1578 if (next_wakeup == 0 || this_wakeup < next_wakeup)
1579 next_wakeup = this_wakeup;
1583 if (next_wakeup != 0)
1590 return Min(60 * 1000, ms);
1617 if (accept_connections)
1631 time_t last_lockfile_recheck_time,
1637 last_lockfile_recheck_time = last_touch_time = time(NULL);
1653 for (
int i = 0;
i < nevents;
i++)
1685 elog(
LOG,
"could not close client socket: %m");
1704#ifdef HAVE_PTHREAD_IS_THREADED_NP
1710 Assert(pthread_is_threaded_np() == 0);
1739 (
errmsg(
"issuing %s to recalcitrant children",
1761 (
errmsg(
"performing immediate shutdown because data directory lock file is invalid")));
1764 last_lockfile_recheck_time =
now;
1776 last_touch_time =
now;
1852 errmsg_internal(
"could not close postmaster death monitoring pipe in child process: %m")));
1871 elog(
LOG,
"could not close listen socket: %m");
1899 close(DNSServiceRefSockFD(bonjour_sdref));
1982 (
errmsg(
"received SIGHUP, reloading configuration files")));
2004 (
errmsg(
"SSL configuration was not reloaded")));
2027 switch (postgres_signal_arg)
2090 (
errmsg(
"received smart shutdown request")));
2095 sd_notify(0,
"STOPPING=1");
2131 (
errmsg(
"received fast shutdown request")));
2136 sd_notify(0,
"STOPPING=1");
2149 (
errmsg(
"aborting any active transactions")));
2173 (
errmsg(
"received immediate shutdown request")));
2178 sd_notify(0,
"STOPPING=1");
2220 while ((pid = waitpid(-1, &exitstatus, WNOHANG)) > 0)
2248 (
errmsg(
"shutdown at recovery target")));
2269 (
errmsg(
"aborting startup due to startup process failure")));
2302 _(
"startup process"));
2325 (
errmsg(
"database system is ready to accept connections")));
2330 sd_notify(0,
"READY=1");
2347 _(
"background writer process"));
2395 _(
"checkpointer process"));
2412 _(
"WAL writer process"));
2428 _(
"WAL receiver process"));
2443 _(
"WAL summarizer process"));
2459 _(
"autovacuum launcher process"));
2475 _(
"archiver process"));
2508 _(
"slot sync worker process"));
2552 const char *procname;
2553 bool crashed =
false;
2554 bool logged =
false;
2556 bool bp_bgworker_notify;
2588 if (exitstatus == ERROR_WAIT_NO_CHILDREN)
2629 if (bp_bgworker_notify)
2656 procname, bp_pid, exitstatus);
2695 (
errmsg(
"terminating any other active server processes")));
2758 char activity_buffer[1024];
2759 const char *activity = NULL;
2764 sizeof(activity_buffer));
2772 (
errmsg(
"%s (PID %d) exited with exit code %d",
2774 activity ?
errdetail(
"Failed process was running: %s", activity) : 0));
2783 (
errmsg(
"%s (PID %d) was terminated by exception 0x%X",
2784 procname, pid,
WTERMSIG(exitstatus)),
2785 errhint(
"See C include file \"ntstatus.h\" for a description of the hexadecimal value."),
2786 activity ?
errdetail(
"Failed process was running: %s", activity) : 0));
2793 (
errmsg(
"%s (PID %d) was terminated by signal %d: %s",
2794 procname, pid,
WTERMSIG(exitstatus),
2796 activity ?
errdetail(
"Failed process was running: %s", activity) : 0));
2805 (
errmsg(
"%s (PID %d) exited with unrecognized status %d",
2806 procname, pid, exitstatus),
2807 activity ?
errdetail(
"Failed process was running: %s", activity) : 0));
2890#ifdef USE_ASSERT_CHECKING
3075 (
errmsg(
"shutting down due to startup process failure")));
3081 (
errmsg(
"shutting down because \"restart_after_crash\" is off")));
3093 (
errmsg(
"all server processes terminated; reinitializing")));
3125#define PM_TOSTR_CASE(sym) case sym: return #sym
3153 elog(
DEBUG1,
"updating PMState from %s to %s",
3282#define PM_TOSTR_CASE(sym) case sym: return #sym
3323 pid_t pid = pmchild->
pid;
3329 (
int) pmchild->
pid)));
3331 if (
kill(pid, signal) < 0)
3332 elog(
DEBUG3,
"kill(%ld,%d) failed: %m", (
long) pid, signal);
3341 if (
kill(-pid, signal) < 0)
3342 elog(
DEBUG3,
"kill(%ld,%d) failed: %m", (
long) (-pid), signal);
3370 bool signaled =
false;
3453 (
errcode(ERRCODE_OUT_OF_MEMORY),
3454 errmsg(
"out of memory")));
3467 (
char *) &startup_data,
sizeof(startup_data),
3472 int save_errno = errno;
3477 (
errmsg(
"could not fork new process for connection: %m")));
3486 (
int) pid, (
int) client_sock->
sock)));
3511 snprintf(buffer,
sizeof(buffer),
"E%s%s\n",
3512 _(
"could not fork new process for connection: "),
3522 rc =
send(client_sock->
sock, buffer, strlen(buffer) + 1, 0);
3523 }
while (rc < 0 && errno ==
EINTR);
3534#ifdef HAVE_PTHREAD_IS_THREADED_NP
3542 if (pthread_is_threaded_np() != 0)
3544 (
errcode(ERRCODE_INTERNAL_ERROR),
3546 errdetail(
"Please report this to <%s>.", PACKAGE_BUGREPORT)));
3603 sd_notify(0,
"READY=1");
3614 (
errmsg(
"database system is ready to accept read-only connections")));
3619 sd_notify(0,
"READY=1");
3781 (
errcode(ERRCODE_CONFIGURATION_LIMIT_EXCEEDED),
3782 errmsg(
"no slot available for new autovacuum worker process")));
3786 elog(
LOG,
"no postmaster child slot available for aux process");
3823 elog(
PANIC,
"no postmaster child slot available for syslogger");
3897#define OPTS_FILE "postmaster.opts"
3899 if ((fp = fopen(
OPTS_FILE,
"w")) == NULL)
3907 fprintf(fp,
"%s", fullprogname);
3908 for (
i = 1;
i < argc;
i++)
3955 (
errcode(ERRCODE_CONFIGURATION_LIMIT_EXCEEDED),
3956 errmsg(
"no slot available for new background worker process")));
3970 if (worker_pid == -1)
3974 (
errmsg(
"could not fork background worker process: %m")));
4042#define MAX_BGWORKERS_TO_LAUNCH 100
4043 int num_launched = 0;
4097 if (notify_pid != 0)
4183waitpid(pid_t pid,
int *exitstatus,
int options)
4185 win32_deadchild_waitinfo *childinfo;
4192 if (!GetQueuedCompletionStatus(win32ChildQueue, &dwd, &
key, &ovl, 0))
4198 childinfo = (win32_deadchild_waitinfo *)
key;
4199 pid = childinfo->procId;
4205 UnregisterWaitEx(childinfo->waitHandle, NULL);
4207 if (!GetExitCodeProcess(childinfo->procHandle, &exitcode))
4212 write_stderr(
"could not read exit code for process\n");
4215 *exitstatus = exitcode;
4221 CloseHandle(childinfo->procHandle);
4237pgwin32_deadchild_callback(PVOID lpParameter, BOOLEAN TimerOrWaitFired)
4240 if (TimerOrWaitFired)
4250 if (!PostQueuedCompletionStatus(win32ChildQueue,
4252 (ULONG_PTR) lpParameter,
4254 write_stderr(
"could not post child completion status\n");
4266pgwin32_register_deadchild_callback(HANDLE procHandle, DWORD procId)
4268 win32_deadchild_waitinfo *childinfo;
4270 childinfo =
palloc(
sizeof(win32_deadchild_waitinfo));
4271 childinfo->procHandle = procHandle;
4272 childinfo->procId = procId;
4274 if (!RegisterWaitForSingleObject(&childinfo->waitHandle,
4276 pgwin32_deadchild_callback,
4279 WT_EXECUTEONLYONCE | WT_EXECUTEINWAITTHREAD))
4281 (
errmsg_internal(
"could not register process for wait: error code %lu",
4311 errmsg_internal(
"could not create pipe to monitor postmaster death: %m")));
4324 errmsg_internal(
"could not set postmaster death monitoring pipe to nonblocking mode: %m")));
4330 if (DuplicateHandle(GetCurrentProcess(),
4331 GetCurrentProcess(),
4332 GetCurrentProcess(),
4336 DUPLICATE_SAME_ACCESS) == 0)
4338 (
errmsg_internal(
"could not duplicate postmaster handle: error code %lu",
bool AutoVacuumingActive(void)
void AutoVacWorkerFailed(void)
bool CheckDateTokenTables(void)
long TimestampDifferenceMilliseconds(TimestampTz start_time, TimestampTz stop_time)
bool TimestampDifferenceExceeds(TimestampTz start_time, TimestampTz stop_time, int msec)
TimestampTz GetCurrentTimestamp(void)
Datum now(PG_FUNCTION_ARGS)
pg_time_t timestamptz_to_time_t(TimestampTz t)
const char * pgstat_get_crashed_backend_activity(int pid, char *buffer, int buflen)
void secure_destroy(void)
int secure_initialize(bool isServerStart)
void ReportBackgroundWorkerPID(RegisteredBgWorker *rw)
void ReportBackgroundWorkerExit(RegisteredBgWorker *rw)
void ResetBackgroundWorkerCrashTimes(void)
dlist_head BackgroundWorkerList
void ForgetBackgroundWorker(RegisteredBgWorker *rw)
void BackgroundWorkerStopNotifications(pid_t pid)
void BackgroundWorkerStateChange(bool allow_new_workers)
void ForgetUnstartedBackgroundWorkers(void)
#define BGW_NEVER_RESTART
@ BgWorkerStart_RecoveryFinished
@ BgWorkerStart_ConsistentState
@ BgWorkerStart_PostmasterStart
#define write_stderr(str)
#define Assert(condition)
#define pg_attribute_noreturn()
int find_my_exec(const char *argv0, char *retpath)
int find_other_exec(const char *argv0, const char *target, const char *versionstr, char *retpath)
#define fprintf(file, fmt, msg)
int errcode_for_socket_access(void)
int errmsg_internal(const char *fmt,...)
int errcode_for_file_access(void)
int errdetail(const char *fmt,...)
int errhint(const char *fmt,...)
bool message_level_is_interesting(int elevel)
char * Log_destination_string
int errcode(int sqlerrcode)
int errmsg(const char *fmt,...)
#define LOG_DESTINATION_STDERR
#define ereport(elevel,...)
void err(int eval, const char *fmt,...)
void ReleaseExternalFD(void)
void RemovePgTempFilesInDir(const char *tmpdirname, bool missing_ok, bool unlink_all)
void RemovePgTempFiles(void)
DIR * AllocateDir(const char *dirname)
void ReserveExternalFD(void)
void set_max_safe_fds(void)
FILE * AllocateFile(const char *name, const char *mode)
#define PG_MODE_MASK_OWNER
#define PG_TEMP_FILES_DIR
char pkglib_path[MAXPGPATH]
TimestampTz MyStartTimestamp
bool IsPostmasterEnvironment
char my_exec_path[MAXPGPATH]
void ProcessConfigFile(GucContext context)
void SetConfigOption(const char *name, const char *value, GucContext context, GucSource source)
const char * GetConfigOption(const char *name, bool missing_ok, bool restrict_privileged)
bool SelectConfigFiles(const char *userDoption, const char *progname)
void ParseLongOption(const char *string, char **name, char **value)
void InitializeGUCOptions(void)
int GetConfigOptionFlags(const char *name, bool missing_ok)
#define GUC_RUNTIME_COMPUTED
#define dlist_foreach(iter, lhead)
#define dlist_foreach_modify(iter, lhead)
#define dlist_container(type, membername, ptr)
void on_proc_exit(pg_on_exit_callback function, Datum arg)
void shmem_exit(int code)
void InitializeShmemGUCs(void)
void CreateSharedMemoryAndSemaphores(void)
void FreeWaitEventSetAfterFork(WaitEventSet *set)
void InitializeLatchSupport(void)
void SetLatch(Latch *latch)
int AddWaitEventToSet(WaitEventSet *set, uint32 events, pgsocket fd, Latch *latch, void *user_data)
int WaitEventSetWait(WaitEventSet *set, long timeout, WaitEvent *occurred_events, int nevents, uint32 wait_event_info)
void FreeWaitEventSet(WaitEventSet *set)
WaitEventSet * CreateWaitEventSet(ResourceOwner resowner, int nevents)
void ResetLatch(Latch *latch)
const char * PostmasterChildName(BackendType child_type)
pid_t postmaster_child_launch(BackendType child_type, int child_slot, char *startup_data, size_t startup_data_len, ClientSocket *client_sock)
void ApplyLauncherRegister(void)
void list_free(List *list)
void list_free_deep(List *list)
DispatchOption parse_dispatch_option(const char *name)
char * pstrdup(const char *in)
void pfree(void *pointer)
MemoryContext TopMemoryContext
MemoryContext PostmasterContext
#define AllocSetContextCreate
#define ALLOCSET_DEFAULT_SIZES
#define BACKEND_NUM_TYPES
void ChangeToDataDir(void)
void process_shmem_requests(void)
void AddToDataDirLockFile(int target_line, const char *str)
void InitProcessLocalLatch(void)
const char * GetBackendTypeDesc(BackendType backendType)
void process_shared_preload_libraries(void)
void TouchSocketLockFiles(void)
bool RecheckDataDirLockFile(void)
void CreateDataDirLockFile(bool amPostmaster)
static MemoryContext MemoryContextSwitchTo(MemoryContext context)
static PgChecksumMode mode
int getopt(int nargc, char *const *nargv, const char *ostr)
PGDLLIMPORT char * optarg
uint32 pg_prng_uint32(pg_prng_state *state)
void pg_prng_seed(pg_prng_state *state, uint64 seed)
pg_prng_state pg_global_prng_state
#define pg_prng_strong_seed(state)
bool PgArchCanRestart(void)
#define PM_STATUS_STARTING
#define PM_STATUS_STOPPING
#define PM_STATUS_STANDBY
#define LOCK_FILE_LINE_LISTEN_ADDR
#define LOCK_FILE_LINE_PM_STATUS
#define LOCK_FILE_LINE_SOCKET_DIR
PMChild * AssignPostmasterChildSlot(BackendType btype)
bool ReleasePostmasterChildSlot(PMChild *pmchild)
void InitPostmasterChildSlots(void)
PMChild * AllocDeadEndChild(void)
dlist_head ActiveChildList
PMChild * FindPostmasterChildByPid(int pid)
bool CheckPostmasterSignal(PMSignalReason reason)
void SetQuitSignalReason(QuitSignalReason reason)
bool IsPostmasterChildWalSender(int slot)
@ PMSIGNAL_START_AUTOVAC_WORKER
@ PMSIGNAL_RECOVERY_STARTED
@ PMSIGNAL_START_WALRECEIVER
@ PMSIGNAL_START_AUTOVAC_LAUNCHER
@ PMSIGNAL_BEGIN_HOT_STANDBY
@ PMSIGNAL_BACKGROUND_WORKER_CHANGE
@ PMSIGNAL_ROTATE_LOGFILE
@ PMSIGNAL_ADVANCE_STATE_MACHINE
void get_pkglib_path(const char *my_exec_path, char *ret_path)
const char * pg_strsignal(int signum)
bool pg_set_noblock(pgsocket sock)
#define PG_BACKEND_VERSIONSTR
void set_debug_options(int debug_flag, GucContext context, GucSource source)
CommandDest whereToSendOutput
bool set_plan_disabling_options(const char *arg, GucContext context, GucSource source)
const char * get_stats_option_name(const char *arg)
static const char * userDoption
void InitializeMaxBackends(void)
void InitializeFastPathLocks(void)
static int CountChildren(BackendTypeMask targetMask)
static void ExitPostmaster(int status) pg_attribute_noreturn()
static void process_pm_pmsignal(void)
static CAC_state canAcceptConnections(BackendType backend_type)
static volatile sig_atomic_t pending_pm_reload_request
static PMChild * PgArchPMChild
static void handle_pm_shutdown_request_signal(SIGNAL_ARGS)
static volatile sig_atomic_t pending_pm_fast_shutdown_request
static const BackendTypeMask BTYPE_MASK_NONE
static void LogChildExit(int lev, const char *procname, int pid, int exitstatus)
static void maybe_start_bgworkers(void)
static void CloseServerPorts(int status, Datum arg)
static void InitPostmasterDeathWatchHandle(void)
#define EXIT_STATUS_1(st)
StaticAssertDecl(BACKEND_NUM_TYPES< 32, "too many backend types for uint32")
void InitProcessGlobals(void)
#define ImmediateShutdown
static int DetermineSleepTime(void)
static void report_fork_failure_to_client(ClientSocket *client_sock, int errnum)
static pgsocket * ListenSockets
static const BackendTypeMask BTYPE_MASK_ALL
#define btmask_all_except(...)
static void handle_pm_reload_request_signal(SIGNAL_ARGS)
static const char * pm_signame(int signal)
#define EXIT_STATUS_0(st)
static void PostmasterStateMachine(void)
static BackendTypeMask btmask_del(BackendTypeMask mask, BackendType t)
static void StartSysLogger(void)
static void TerminateChildren(int signal)
static bool btmask_contains(BackendTypeMask mask, BackendType t)
static void process_pm_child_exit(void)
#define btmask_add(mask,...)
static BackendTypeMask btmask_all_except_n(int nargs, BackendType *t)
static int ServerLoop(void)
static bool HaveCrashedWorker
static PMChild * AutoVacLauncherPMChild
static PMChild * BgWriterPMChild
static void checkControlFile(void)
void PostmasterMain(int argc, char *argv[])
static void LaunchMissingBackgroundProcesses(void)
bool remove_temp_files_after_crash
static void signal_child(PMChild *pmchild, int signal)
static PMChild * StartChildProcess(BackendType type)
static volatile sig_atomic_t pending_pm_shutdown_request
static time_t AbortStartTime
static bool SignalChildren(int signal, BackendTypeMask targetMask)
static bool start_autovac_launcher
static PMChild * WalReceiverPMChild
static PMChild * WalWriterPMChild
bool ClientAuthInProgress
static void handle_pm_pmsignal_signal(SIGNAL_ARGS)
static PMChild * WalSummarizerPMChild
BackgroundWorker * MyBgworkerEntry
static void UpdatePMState(PMState newState)
static PMChild * StartupPMChild
static volatile sig_atomic_t pending_pm_pmsignal
static PMChild * SysLoggerPMChild
static bool StartBackgroundWorker(RegisteredBgWorker *rw)
static int BackendStartup(ClientSocket *client_sock)
#define PM_TOSTR_CASE(sym)
static int NumListenSockets
char * Unix_socket_directories
int postmaster_alive_fds[2]
static bool ReachedNormalRunning
#define SIGKILL_CHILDREN_AFTER_SECS
static bool CreateOptsFile(int argc, char *argv[], char *fullprogname)
static void HandleChildCrash(int pid, int exitstatus, const char *procname)
static BackendTypeMask btmask_add_n(BackendTypeMask mask, int nargs, BackendType *t)
static void handle_pm_child_exit_signal(SIGNAL_ARGS)
static const char * pmstate_name(PMState state)
void ClosePostmasterPorts(bool am_syslogger)
static void StartAutovacuumWorker(void)
bool send_abort_for_crash
static WaitEventSet * pm_wait_set
static void getInstallationPaths(const char *argv0)
static volatile sig_atomic_t pending_pm_immediate_shutdown_request
int AuthenticationTimeout
static void unlink_external_pid_file(int status, Datum arg)
static StartupStatusEnum StartupStatus
static bool WalReceiverRequested
static volatile sig_atomic_t pending_pm_child_exit
#define MAX_BGWORKERS_TO_LAUNCH
static void dummy_handler(SIGNAL_ARGS)
static void process_pm_shutdown_request(void)
static void CleanupBackend(PMChild *bp, int exitstatus)
static BackendTypeMask btmask(BackendType t)
static PMChild * CheckpointerPMChild
static PMChild * SlotSyncWorkerPMChild
static bool bgworker_should_start_now(BgWorkerStartTime start_time)
static void ConfigurePostmasterWaitSet(bool accept_connections)
static void sigquit_child(PMChild *pmchild)
bool PostmasterMarkPIDForWorkerNotify(int pid)
int SuperuserReservedConnections
static bool StartWorkerNeeded
static bool avlauncher_needs_signal
#define EXIT_STATUS_3(st)
static void process_pm_reload_request(void)
PGDLLIMPORT bool LoadedSSL
#define POSTMASTER_FD_OWN
#define POSTMASTER_FD_WATCH
int ListenServerPort(int family, const char *hostName, unsigned short portNumber, const char *unixSocketDir, pgsocket ListenSockets[], int *NumListenSockets, int MaxListen)
int AcceptConnection(pgsocket server_fd, ClientSocket *client_sock)
void TouchSocketFiles(void)
void RemoveSocketFiles(void)
static int fd(const char *x, int i)
void pg_queue_signal(int signum)
void pgwin32_signal_initialize(void)
bool sync_replication_slots
bool SlotSyncWorkerCanRestart(void)
bool ValidateSlotSyncParams(int elevel)
void appendStringInfo(StringInfo str, const char *fmt,...)
void appendStringInfoString(StringInfo str, const char *s)
void initStringInfo(StringInfo str)
CAC_state canAcceptConnections
char bgw_name[BGW_MAXLEN]
char bgw_type[BGW_MAXLEN]
BgWorkerStartTime bgw_start_time
struct RegisteredBgWorker * rw
TimestampTz rw_crashed_at
BackgroundWorker rw_worker
bool CheckLogrotateSignal(void)
void RemoveLogrotateSignalFiles(void)
int SysLogger_Start(int child_slot)
#define LOG_METAINFO_DATAFILE
#define TimestampTzPlusMilliseconds(tz, ms)
bool SplitDirectoriesString(char *rawstring, char separator, List **namelist)
bool SplitGUCList(char *rawstring, char separator, List **namelist)
#define send(s, buf, len, flags)
void InitializeWalConsistencyChecking(void)
void LocalProcessControlFile(bool reset)
#define XLogArchivingActive()
#define XLogArchivingAlways()
bool CheckPromoteSignal(void)
void RemovePromoteSignalFiles(void)