59 #define DIRECTORY_LOCK_FILE "postmaster.pid"
125 _setmode(fileno(stderr), _O_BINARY);
162 sigprocmask(SIG_SETMASK, &
BlockSig, NULL);
172 errmsg_internal(
"could not set postmaster death monitoring pipe to FD_CLOEXEC mode: %m")));
207 sigprocmask(SIG_SETMASK, &
BlockSig, NULL);
213 elog(
FATAL,
"%s: could not locate my own executable path",
266 const char *backendDesc =
"unknown process type";
271 backendDesc =
"not initialized";
274 backendDesc =
"archiver";
277 backendDesc =
"autovacuum launcher";
280 backendDesc =
"autovacuum worker";
283 backendDesc =
"client backend";
286 backendDesc =
"background worker";
289 backendDesc =
"background writer";
292 backendDesc =
"checkpointer";
295 backendDesc =
"logger";
298 backendDesc =
"standalone backend";
301 backendDesc =
"startup";
304 backendDesc =
"walreceiver";
307 backendDesc =
"walsender";
310 backendDesc =
"walwriter";
338 struct stat stat_buf;
347 errmsg(
"data directory \"%s\" does not exist",
352 errmsg(
"could not read permissions of directory \"%s\": %m",
359 (
errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
360 errmsg(
"specified data directory \"%s\" is not a directory",
372 #if !defined(WIN32) && !defined(__CYGWIN__)
373 if (stat_buf.
st_uid != geteuid())
375 (
errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
376 errmsg(
"data directory \"%s\" has wrong ownership",
378 errhint(
"The server must be started by the user that owns the data directory.")));
392 #if !defined(WIN32) && !defined(__CYGWIN__)
395 (
errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
396 errmsg(
"data directory \"%s\" has invalid permissions",
398 errdetail(
"Permissions should be u=rwx (0700) or u=rwx,g=rx (0750).")));
413 #if !defined(WIN32) && !defined(__CYGWIN__)
456 errmsg(
"could not change directory to \"%s\": %m",
692 (
errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
693 errmsg(
"cannot set parameter \"%s\" within security-restricted operation",
751 if (rolename != NULL)
756 (
errcode(ERRCODE_INVALID_AUTHORIZATION_SPECIFICATION),
757 errmsg(
"role \"%s\" does not exist", rolename)));
764 (
errcode(ERRCODE_INVALID_AUTHORIZATION_SPECIFICATION),
765 errmsg(
"role with OID %u does not exist", roleid)));
770 rname =
NameStr(rform->rolname);
792 if (!rform->rolcanlogin)
794 (
errcode(ERRCODE_INVALID_AUTHORIZATION_SPECIFICATION),
795 errmsg(
"role \"%s\" is not permitted to log in",
808 if (rform->rolconnlimit >= 0 &&
812 (
errcode(ERRCODE_TOO_MANY_CONNECTIONS),
813 errmsg(
"too many connections for role \"%s\"",
911 (
errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
912 errmsg(
"permission denied to set session authorization")));
994 (
errcode(ERRCODE_UNDEFINED_OBJECT),
995 errmsg(
"invalid role OID: %u", roleid)));
1058 Assert(maxsize >=
sizeof(serialized));
1059 memcpy(start_address, &serialized,
sizeof(serialized));
1061 maxsize -=
sizeof(serialized);
1062 start_address +=
sizeof(serialized);
1068 memcpy(start_address,
1083 memcpy(&serialized, conninfo,
sizeof(serialized));
1093 authn_id = conninfo +
sizeof(serialized);
1125 char *curfile = (
char *)
lfirst(l);
1142 (
errmsg(
"database system is shut down")));
1155 const char *socketDir,
1156 bool isDDLock,
const char *refName)
1190 my_p_pid = getppid();
1200 envvar = getenv(
"PG_GRANDPARENT_PID");
1202 my_gp_pid = atoi(envvar);
1211 for (ntries = 0;; ntries++)
1226 if ((errno != EEXIST && errno != EACCES) || ntries > 100)
1229 errmsg(
"could not create lock file \"%s\": %m",
1239 if (errno == ENOENT)
1243 errmsg(
"could not open lock file \"%s\": %m",
1247 if ((
len =
read(
fd, buffer,
sizeof(buffer) - 1)) < 0)
1250 errmsg(
"could not read lock file \"%s\": %m",
1258 (
errcode(ERRCODE_LOCK_FILE_EXISTS),
1260 errhint(
"Either another server is starting, or the lock file is the remnant of a previous server startup crash.")));
1264 encoded_pid = atoi(buffer);
1267 other_pid = (pid_t) (encoded_pid < 0 ? -encoded_pid : encoded_pid);
1270 elog(
FATAL,
"bogus data in lock file \"%s\": \"%s\"",
1295 if (other_pid != my_pid && other_pid != my_p_pid &&
1296 other_pid != my_gp_pid)
1298 if (
kill(other_pid, 0) == 0 ||
1299 (errno != ESRCH && errno != EPERM))
1303 (
errcode(ERRCODE_LOCK_FILE_EXISTS),
1304 errmsg(
"lock file \"%s\" already exists",
1308 errhint(
"Is another postgres (PID %d) running in data directory \"%s\"?",
1309 (
int) other_pid, refName) :
1310 errhint(
"Is another postmaster (PID %d) running in data directory \"%s\"?",
1311 (
int) other_pid, refName)) :
1313 errhint(
"Is another postgres (PID %d) using socket file \"%s\"?",
1314 (
int) other_pid, refName) :
1315 errhint(
"Is another postmaster (PID %d) using socket file \"%s\"?",
1316 (
int) other_pid, refName))));
1340 if ((ptr = strchr(ptr,
'\n')) == NULL)
1346 sscanf(ptr,
"%lu %lu", &id1, &id2) == 2)
1350 (
errcode(ERRCODE_LOCK_FILE_EXISTS),
1351 errmsg(
"pre-existing shared memory block (key %lu, ID %lu) is still in use",
1353 errhint(
"Terminate any old server processes associated with data directory \"%s\".",
1366 errmsg(
"could not remove old lock file \"%s\": %m",
1368 errhint(
"The file seems accidentally left over, but "
1369 "it could not be removed. Please remove the file "
1370 "by hand and try again.")));
1379 snprintf(buffer,
sizeof(buffer),
"%d\n%s\n%ld\n%d\n%s\n",
1380 amPostmaster ? (
int) my_pid : -((
int) my_pid),
1390 if (isDDLock && !amPostmaster)
1391 strlcat(buffer,
"\n",
sizeof(buffer));
1395 if (
write(
fd, buffer, strlen(buffer)) != strlen(buffer))
1397 int save_errno = errno;
1402 errno = save_errno ? save_errno : ENOSPC;
1412 int save_errno = errno;
1424 int save_errno = errno;
1469 const char *socketDir)
1473 snprintf(lockfile,
sizeof(lockfile),
"%s.lock", socketfile);
1474 CreateLockFile(lockfile, amPostmaster, socketDir,
false, socketfile);
1492 char *socketLockFile = (
char *)
lfirst(l);
1499 (void) utime(socketLockFile, NULL);
1522 char srcbuffer[BLCKSZ];
1523 char destbuffer[BLCKSZ];
1530 errmsg(
"could not open file \"%s\": %m",
1535 len =
read(
fd, srcbuffer,
sizeof(srcbuffer) - 1);
1541 errmsg(
"could not read from file \"%s\": %m",
1546 srcbuffer[
len] =
'\0';
1553 for (lineno = 1; lineno < target_line; lineno++)
1555 char *eol = strchr(srcptr,
'\n');
1561 memcpy(destbuffer, srcbuffer, srcptr - srcbuffer);
1562 destptr = destbuffer + (srcptr - srcbuffer);
1568 for (; lineno < target_line; lineno++)
1570 if (destptr < destbuffer +
sizeof(destbuffer))
1577 snprintf(destptr, destbuffer +
sizeof(destbuffer) - destptr,
"%s\n",
str);
1578 destptr += strlen(destptr);
1583 if ((srcptr = strchr(srcptr,
'\n')) != NULL)
1586 snprintf(destptr, destbuffer +
sizeof(destbuffer) - destptr,
"%s",
1594 len = strlen(destbuffer);
1605 errmsg(
"could not write to file \"%s\": %m",
1616 errmsg(
"could not write to file \"%s\": %m",
1624 errmsg(
"could not write to file \"%s\": %m",
1647 char buffer[BLCKSZ];
1664 errmsg(
"could not open file \"%s\": %m",
1671 errmsg(
"could not open file \"%s\": %m; continuing anyway",
1677 len =
read(
fd, buffer,
sizeof(buffer) - 1);
1683 errmsg(
"could not read from file \"%s\": %m",
1690 file_pid = atol(buffer);
1691 if (file_pid == getpid())
1696 (
errmsg(
"lock file \"%s\" contains wrong PID: %ld instead of %ld",
1722 char file_version_string[64];
1723 const char *my_version_string = PG_VERSION;
1725 my_major = strtol(my_version_string, &endptr, 10);
1727 snprintf(full_path,
sizeof(full_path),
"%s/PG_VERSION", path);
1732 if (errno == ENOENT)
1734 (
errcode(ERRCODE_INVALID_PARAMETER_VALUE),
1735 errmsg(
"\"%s\" is not a valid data directory",
1737 errdetail(
"File \"%s\" is missing.", full_path)));
1741 errmsg(
"could not open file \"%s\": %m", full_path)));
1744 file_version_string[0] =
'\0';
1745 ret = fscanf(file,
"%63s", file_version_string);
1746 file_major = strtol(file_version_string, &endptr, 10);
1748 if (ret != 1 || endptr == file_version_string)
1750 (
errcode(ERRCODE_INVALID_PARAMETER_VALUE),
1751 errmsg(
"\"%s\" is not a valid data directory",
1753 errdetail(
"File \"%s\" does not contain valid data.",
1755 errhint(
"You might need to initdb.")));
1759 if (my_major != file_major)
1761 (
errcode(ERRCODE_INVALID_PARAMETER_VALUE),
1762 errmsg(
"database files are incompatible with server"),
1763 errdetail(
"The data directory was initialized by PostgreSQL version %s, "
1764 "which is not compatible with this version %s.",
1765 file_version_string, my_version_string)));
1801 if (libraries == NULL || libraries[0] ==
'\0')
1805 rawstring =
pstrdup(libraries);
1814 (
errcode(ERRCODE_SYNTAX_ERROR),
1815 errmsg(
"invalid list syntax in parameter \"%s\"",
1820 foreach(l, elemlist)
1824 char *expanded = NULL;
1851 "shared_preload_libraries",
1864 "session_preload_libraries",
1867 "local_preload_libraries",
1892 bindtextdomain(domain, locale_path);
1893 pg_bind_textdomain_codeset(domain);
bool IsAutoVacuumWorkerProcess(void)
#define CStringGetTextDatum(s)
#define OidIsValid(objectId)
int find_my_exec(const char *argv0, char *retpath)
elog(ERROR, "%s: %s", p2, msg)
void load_file(const char *filename, bool restricted)
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,...)
int errcode(int sqlerrcode)
int errmsg(const char *fmt,...)
#define ereport(elevel,...)
FILE * AllocateFile(const char *name, const char *mode)
void SetDataDirectoryCreatePerm(int dataDirMode)
#define PG_MODE_MASK_GROUP
#define PG_RETURN_DATUM(x)
char pkglib_path[MAXPGPATH]
bool IsPostmasterEnvironment
char my_exec_path[MAXPGPATH]
void SetConfigOption(const char *name, const char *value, GucContext context, GucSource source)
#define HeapTupleIsValid(tuple)
void SignalHandlerForCrashExit(SIGNAL_ARGS)
void AcceptInvalidationMessages(void)
void on_proc_exit(pg_on_exit_callback function, Datum arg)
void InitializeLatchWaitSet(void)
void InitializeLatchSupport(void)
void ModifyWaitEvent(WaitEventSet *set, int pos, uint32 events, Latch *latch)
void SetLatch(Latch *latch)
void InitLatch(Latch *latch)
#define FeBeWaitSetLatchPos
Assert(fmt[strlen(fmt) - 1] !='\n')
List * lcons(void *datum, List *list)
void list_free_deep(List *list)
char * pstrdup(const char *in)
void pfree(void *pointer)
MemoryContext TopMemoryContext
char * MemoryContextStrdup(MemoryContext context, const char *string)
#define IsBootstrapProcessingMode()
#define SECURITY_NOFORCE_RLS
#define SECURITY_RESTRICTED_OPERATION
#define SECURITY_LOCAL_USERID_CHANGE
void(* shmem_request_hook_type)(void)
struct SerializedClientConnectionInfo SerializedClientConnectionInfo
void ChangeToDataDir(void)
char * GetUserNameFromId(Oid roleid, bool noerr)
bool process_shared_preload_libraries_done
void process_shmem_requests(void)
static void SetOuterUserId(Oid userid)
void InitStandaloneProcess(const char *argv0)
void SerializeClientConnectionInfo(Size maxsize, char *start_address)
void InitializeSystemUser(const char *authn_id, const char *auth_method)
void InitializeSessionUserIdStandalone(void)
void AddToDataDirLockFile(int target_line, const char *str)
void InitProcessLocalLatch(void)
static bool AuthenticatedUserIsSuperuser
void GetUserIdAndSecContext(Oid *userid, int *sec_context)
void SetSessionAuthorization(Oid userid, bool is_superuser)
void process_session_preload_libraries(void)
static bool SessionUserIsSuperuser
bool process_shmem_requests_in_progress
bool InSecurityRestrictedOperation(void)
#define DIRECTORY_LOCK_FILE
static const char * SystemUser
static int SecurityRestrictionContext
Size EstimateClientConnectionInfoSpace(void)
const char * GetSystemUser(void)
Oid GetSessionUserId(void)
void SetCurrentRoleId(Oid roleid, bool is_superuser)
Oid GetAuthenticatedUserId(void)
bool InLocalUserIdChange(void)
Datum system_user(PG_FUNCTION_ARGS)
void SetDatabasePath(const char *path)
void InitPostmasterChild(void)
void InitializeSessionUserId(const char *rolename, Oid roleid)
char * shared_preload_libraries_string
ClientConnectionInfo MyClientConnectionInfo
void process_shared_preload_libraries(void)
char * session_preload_libraries_string
static void SetSessionUserId(Oid userid, bool is_superuser)
shmem_request_hook_type shmem_request_hook
char * local_preload_libraries_string
static Latch LocalLatchData
const char * GetBackendTypeDesc(BackendType backendType)
void TouchSocketLockFiles(void)
void RestoreClientConnectionInfo(char *conninfo)
static bool SetRoleIsActive
bool InNoForceRLSOperation(void)
static Oid AuthenticatedUserId
static void load_libraries(const char *libraries, const char *gucname, bool restricted)
Oid GetCurrentRoleId(void)
static void UnlinkLockFiles(int status, Datum arg)
void SwitchToSharedLatch(void)
BackendType MyBackendType
void GetUserIdAndContext(Oid *userid, bool *sec_def_context)
void SetDataDir(const char *dir)
void SetUserIdAndContext(Oid userid, bool sec_def_context)
bool process_shared_preload_libraries_in_progress
void pg_bindtextdomain(const char *domain)
bool has_rolreplication(Oid roleid)
static void CreateLockFile(const char *filename, bool amPostmaster, const char *socketDir, bool isDDLock, const char *refName)
void ValidatePgVersion(const char *path)
void SetUserIdAndSecContext(Oid userid, int sec_context)
bool RecheckDataDirLockFile(void)
void CreateDataDirLockFile(bool amPostmaster)
void SwitchBackToLocalLatch(void)
void CreateSocketLockFile(const char *socketfile, bool amPostmaster, const char *socketDir)
FormData_pg_authid * Form_pg_authid
static bool is_superuser(Archive *fout)
#define LOCK_FILE_LINE_SHMEM_KEY
void PostmasterDeathSignalInit(void)
void get_pkglib_path(const char *my_exec_path, char *ret_path)
void get_locale_path(const char *my_exec_path, char *ret_path)
char * make_absolute_path(const char *path)
char * first_dir_separator(const char *filename)
pqsigfunc pqsignal(int signo, pqsigfunc func)
size_t strlcat(char *dst, const char *src, size_t siz)
pg_stack_base_t set_stack_base(void)
static Datum PointerGetDatum(const void *X)
static Datum ObjectIdGetDatum(Oid X)
void InitProcessGlobals(void)
int postmaster_alive_fds[2]
#define POSTMASTER_FD_WATCH
WaitEventSet * FeBeWaitSet
static int fd(const char *x, int i)
int CountUserBackends(Oid roleid)
char * psprintf(const char *fmt,...)
Size add_size(Size s1, Size s2)
void pgwin32_signal_initialize(void)
bool superuser_arg(Oid roleid)
void ReleaseSysCache(HeapTuple tuple)
HeapTuple SearchSysCache1(int cacheId, Datum key1)
bool PGSharedMemoryIsInUse(unsigned long id1, unsigned long id2)
bool SplitDirectoriesString(char *rawstring, char separator, List **namelist)
@ WAIT_EVENT_LOCK_FILE_ADDTODATADIR_WRITE
@ WAIT_EVENT_LOCK_FILE_CREATE_SYNC
@ WAIT_EVENT_LOCK_FILE_CREATE_READ
@ WAIT_EVENT_LOCK_FILE_CREATE_WRITE
@ WAIT_EVENT_LOCK_FILE_RECHECKDATADIR_READ
@ WAIT_EVENT_LOCK_FILE_ADDTODATADIR_READ
@ WAIT_EVENT_LOCK_FILE_ADDTODATADIR_SYNC
static void pgstat_report_wait_start(uint32 wait_event_info)
static void pgstat_report_wait_end(void)