PostgreSQL Source Code  git master
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros
miscadmin.h File Reference
#include <signal.h>
#include "pgtime.h"
Include dependency graph for miscadmin.h:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Macros

#define InvalidPid   (-1)
 
#define CHECK_FOR_INTERRUPTS()
 
#define HOLD_INTERRUPTS()   (InterruptHoldoffCount++)
 
#define RESUME_INTERRUPTS()
 
#define HOLD_CANCEL_INTERRUPTS()   (QueryCancelHoldoffCount++)
 
#define RESUME_CANCEL_INTERRUPTS()
 
#define START_CRIT_SECTION()   (CritSectionCount++)
 
#define END_CRIT_SECTION()
 
#define USE_POSTGRES_DATES   0
 
#define USE_ISO_DATES   1
 
#define USE_SQL_DATES   2
 
#define USE_GERMAN_DATES   3
 
#define USE_XSD_DATES   4
 
#define DATEORDER_YMD   0
 
#define DATEORDER_DMY   1
 
#define DATEORDER_MDY   2
 
#define INTSTYLE_POSTGRES   0
 
#define INTSTYLE_POSTGRES_VERBOSE   1
 
#define INTSTYLE_SQL_STANDARD   2
 
#define INTSTYLE_ISO_8601   3
 
#define MAXTZLEN   10 /* max TZ name len, not counting tr. null */
 
#define SECURITY_LOCAL_USERID_CHANGE   0x0001
 
#define SECURITY_RESTRICTED_OPERATION   0x0002
 
#define SECURITY_NOFORCE_RLS   0x0004
 
#define IsBootstrapProcessingMode()   (Mode == BootstrapProcessing)
 
#define IsInitProcessingMode()   (Mode == InitProcessing)
 
#define IsNormalProcessingMode()   (Mode == NormalProcessing)
 
#define GetProcessingMode()   Mode
 
#define SetProcessingMode(mode)
 
#define AmBootstrapProcess()   (MyAuxProcType == BootstrapProcess)
 
#define AmStartupProcess()   (MyAuxProcType == StartupProcess)
 
#define AmBackgroundWriterProcess()   (MyAuxProcType == BgWriterProcess)
 
#define AmCheckpointerProcess()   (MyAuxProcType == CheckpointerProcess)
 
#define AmWalWriterProcess()   (MyAuxProcType == WalWriterProcess)
 
#define AmWalReceiverProcess()   (MyAuxProcType == WalReceiverProcess)
 

Typedefs

typedef char * pg_stack_base_t
 
typedef enum ProcessingMode ProcessingMode
 

Enumerations

enum  ProcessingMode { BootstrapProcessing, InitProcessing, NormalProcessing }
 
enum  AuxProcType {
  NotAnAuxProcess = -1, CheckerProcess = 0, BootstrapProcess, StartupProcess,
  BgWriterProcess, CheckpointerProcess, WalWriterProcess, WalReceiverProcess,
  NUM_AUXPROCTYPES
}
 

Functions

void ProcessInterrupts (void)
 
pg_stack_base_t set_stack_base (void)
 
void restore_stack_base (pg_stack_base_t base)
 
void check_stack_depth (void)
 
bool stack_is_too_deep (void)
 
void PostgresSigHupHandler (SIGNAL_ARGS)
 
void PreventCommandIfReadOnly (const char *cmdname)
 
void PreventCommandIfParallelMode (const char *cmdname)
 
void PreventCommandDuringRecovery (const char *cmdname)
 
int trace_recovery (int trace_level)
 
void InitPostmasterChild (void)
 
void InitStandaloneProcess (const char *argv0)
 
void SetDatabasePath (const char *path)
 
char * GetUserNameFromId (Oid roleid, bool noerr)
 
Oid GetUserId (void)
 
Oid GetOuterUserId (void)
 
Oid GetSessionUserId (void)
 
Oid GetAuthenticatedUserId (void)
 
void GetUserIdAndSecContext (Oid *userid, int *sec_context)
 
void SetUserIdAndSecContext (Oid userid, int sec_context)
 
bool InLocalUserIdChange (void)
 
bool InSecurityRestrictedOperation (void)
 
bool InNoForceRLSOperation (void)
 
void GetUserIdAndContext (Oid *userid, bool *sec_def_context)
 
void SetUserIdAndContext (Oid userid, bool sec_def_context)
 
void InitializeSessionUserId (const char *rolename, Oid useroid)
 
void InitializeSessionUserIdStandalone (void)
 
void SetSessionAuthorization (Oid userid, bool is_superuser)
 
Oid GetCurrentRoleId (void)
 
void SetCurrentRoleId (Oid roleid, bool is_superuser)
 
void SetDataDir (const char *dir)
 
void ChangeToDataDir (void)
 
void SwitchToSharedLatch (void)
 
void SwitchBackToLocalLatch (void)
 
bool superuser (void)
 
bool superuser_arg (Oid roleid)
 
void pg_split_opts (char **argv, int *argcp, const char *optstr)
 
void InitializeMaxBackends (void)
 
void InitPostgres (const char *in_dbname, Oid dboid, const char *username, Oid useroid, char *out_dbname)
 
void BaseInit (void)
 
void CreateDataDirLockFile (bool amPostmaster)
 
void CreateSocketLockFile (const char *socketfile, bool amPostmaster, const char *socketDir)
 
void TouchSocketLockFiles (void)
 
void AddToDataDirLockFile (int target_line, const char *str)
 
bool RecheckDataDirLockFile (void)
 
void ValidatePgVersion (const char *path)
 
void process_shared_preload_libraries (void)
 
void process_session_preload_libraries (void)
 
void pg_bindtextdomain (const char *domain)
 
bool has_rolreplication (Oid roleid)
 
bool BackupInProgress (void)
 
void CancelBackup (void)
 

Variables

PGDLLIMPORT volatile bool InterruptPending
 
PGDLLIMPORT volatile bool QueryCancelPending
 
PGDLLIMPORT volatile bool ProcDiePending
 
PGDLLIMPORT volatile bool IdleInTransactionSessionTimeoutPending
 
PGDLLIMPORT volatile sig_atomic_t ConfigReloadPending
 
volatile bool ClientConnectionLost
 
PGDLLIMPORT volatile uint32 InterruptHoldoffCount
 
PGDLLIMPORT volatile uint32 QueryCancelHoldoffCount
 
PGDLLIMPORT volatile uint32 CritSectionCount
 
PGDLLIMPORT pid_t PostmasterPid
 
PGDLLIMPORT bool IsPostmasterEnvironment
 
PGDLLIMPORT bool IsUnderPostmaster
 
PGDLLIMPORT bool IsBackgroundWorker
 
PGDLLIMPORT bool IsBinaryUpgrade
 
bool ExitOnAnyError
 
PGDLLIMPORT char * DataDir
 
PGDLLIMPORT int NBuffers
 
int MaxBackends
 
int MaxConnections
 
int max_worker_processes
 
int max_parallel_workers
 
PGDLLIMPORT int MyProcPid
 
PGDLLIMPORT pg_time_t MyStartTime
 
PGDLLIMPORT struct PortMyProcPort
 
PGDLLIMPORT struct LatchMyLatch
 
int32 MyCancelKey
 
int MyPMChildSlot
 
char OutputFileName []
 
PGDLLIMPORT char my_exec_path []
 
char pkglib_path []
 
PGDLLIMPORT Oid MyDatabaseId
 
PGDLLIMPORT Oid MyDatabaseTableSpace
 
PGDLLIMPORT int DateStyle
 
PGDLLIMPORT int DateOrder
 
PGDLLIMPORT int IntervalStyle
 
bool enableFsync
 
bool allowSystemTableMods
 
PGDLLIMPORT int work_mem
 
PGDLLIMPORT int maintenance_work_mem
 
int VacuumCostPageHit
 
int VacuumCostPageMiss
 
int VacuumCostPageDirty
 
int VacuumCostLimit
 
int VacuumCostDelay
 
int VacuumPageHit
 
int VacuumPageMiss
 
int VacuumPageDirty
 
int VacuumCostBalance
 
bool VacuumCostActive
 
int trace_recovery_messages
 
char * DatabasePath
 
ProcessingMode Mode
 
AuxProcType MyAuxProcType
 
bool IgnoreSystemIndexes
 
PGDLLIMPORT bool process_shared_preload_libraries_in_progress
 
char * session_preload_libraries_string
 
char * shared_preload_libraries_string
 
char * local_preload_libraries_string
 

Macro Definition Documentation

#define AmBackgroundWriterProcess ( )    (MyAuxProcType == BgWriterProcess)

Definition at line 406 of file miscadmin.h.

Referenced by ForwardFsyncRequest().

#define AmBootstrapProcess ( )    (MyAuxProcType == BootstrapProcess)

Definition at line 404 of file miscadmin.h.

#define AmCheckpointerProcess ( )    (MyAuxProcType == CheckpointerProcess)
#define AmStartupProcess ( )    (MyAuxProcType == StartupProcess)

Definition at line 405 of file miscadmin.h.

Referenced by HotStandbyActiveInReplay(), and mdinit().

#define AmWalReceiverProcess ( )    (MyAuxProcType == WalReceiverProcess)

Definition at line 409 of file miscadmin.h.

Referenced by get_sync_bit().

#define AmWalWriterProcess ( )    (MyAuxProcType == WalWriterProcess)

Definition at line 408 of file miscadmin.h.

#define CHECK_FOR_INTERRUPTS ( )
Value:
do { \
} while(0)
PGDLLIMPORT volatile bool InterruptPending
Definition: globals.c:29
void ProcessInterrupts(void)
Definition: postgres.c:2860

Definition at line 98 of file miscadmin.h.

Referenced by _bt_buildadd(), _bt_readnextpage(), _bt_walk_left(), _crypt_blowfish_rn(), _hash_init(), _hash_readnext(), _hash_readprev(), add_partial_path(), add_path(), agg_retrieve_hash_table(), analyze_rel(), ApplyLauncherMain(), apw_dump_now(), ATRewriteTable(), autoprewarm_database_main(), backend_read_statsfile(), BipartiteMatch(), BitmapHeapNext(), blgetbitmap(), bloomBuildCallback(), brin_evacuate_page(), brin_getinsertbuffer(), brin_vacuum_scan(), bringetbitmap(), brinGetTupleForHeapBlock(), brininsert(), brinsummarize(), bt_check_level_from_leftmost(), bt_right_page_check_scankey(), bt_target_page_check(), btree_xlog_delete_get_latestRemovedXid(), calculate_database_size(), calculate_relation_size(), calculate_tablespace_size(), check_default_allows_bound(), ClientAuthentication(), cluster_rel(), collect_corrupt_items(), collect_visibility_data(), ConditionVariableSleep(), copy_file(), copy_heap_data(), copy_messages(), copy_read_data(), copy_relation_data(), copydir(), CopyFrom(), CopyTo(), count_nondeletable_pages(), CountOtherDBBackends(), db_dir_size(), DecodingContextFindStartpoint(), do_autovacuum(), do_des(), do_pg_stop_backup(), dofindsubquery(), errfinish(), exec_execute_message(), exec_parse_message(), exec_replication_command(), exec_simple_query(), exec_stmt(), exec_stmts(), ExecAgg(), ExecAppend(), ExecCustomScan(), ExecGather(), ExecGatherMerge(), ExecGroup(), ExecHashIncreaseNumBatches(), ExecHashIncreaseNumBuckets(), ExecHashJoin(), ExecHashJoinGetSavedTuple(), ExecHashRemoveNextSkewBucket(), ExecLimit(), ExecLockRows(), ExecMakeTableFunctionResult(), ExecMaterial(), ExecMergeAppend(), ExecMergeJoin(), ExecModifyTable(), ExecNestLoop(), ExecProjectSet(), ExecRecursiveUnion(), ExecResult(), ExecScanFetch(), ExecScanHashTableForUnmatched(), ExecSetOp(), ExecSort(), ExecSubPlan(), ExecUnique(), ExecWindowAgg(), fetch_input_tuple(), findPartialMatch(), fsm_vacuum_page(), gather_getnext(), gather_merge_init(), gather_readnext(), get_query_def(), get_rule_expr(), get_setop_query(), GetMultiXactIdMembers(), GetNewOidWithIndex(), GetNewRelFileNode(), getNextNearest(), ginbuild(), ginBuildCallback(), gingetbitmap(), gistgetbitmap(), gistgettuple(), gistProcessItup(), gm_readnext_tuple(), HandleFunctionRequest(), hash_xlog_vacuum_get_latestRemovedXid(), heap_lock_updated_tuple_rec(), heap_multi_insert(), heapgetpage(), hypothetical_dense_rank_final(), hypothetical_rank_common(), ident_inet(), IndexBuildHeapRangeScan(), IndexCheckExclusion(), IndexNext(), IndexNextWithReorder(), IndexOnlyNext(), interactive_getc(), lazy_truncate_heap(), libpqrcv_connect(), libpqrcv_PQexec(), libpqrcv_processTuples(), logicalrep_worker_stop(), LogicalRepApplyLoop(), lseg_inside_poly(), make_bounded_heap(), mode_final(), mq_putmessage(), MultiExecBitmapIndexScan(), MultiExecProcNode(), numeric_fac(), OpenTableList(), pg_logical_slot_get_changes_guts(), pg_prewarm(), pg_sleep(), pg_visibility_map_summary(), pgfdw_get_cleanup_result(), pgfdw_get_result(), PGSemaphoreLock(), pgstat_collect_oids(), pgstat_get_backend_current_activity(), pgstat_heap(), pgstat_index(), pgstat_read_current_status(), pgstat_vacuum_stat(), pgstathashindex(), pgstatindex_impl(), plperl_spi_prepare(), PortalRunMulti(), postgresAcquireSampleRowsFunc(), PostgresMain(), predicate_implied_by_simple_clause(), predicate_refuted_by_simple_clause(), process_ordered_aggregate_multi(), ProcessClientReadInterrupt(), ProcessClientWriteInterrupt(), ProcessWalRcvInterrupts(), ProcSleep(), ProcWaitForSignal(), puttuple_common(), random_relative_prime(), RE_compile_and_cache(), RE_wchar_execute(), read_local_xlog_page(), refresh_matview_datafill(), regexp_fixed_prefix(), replace_text(), replace_text_regexp(), replorigin_create(), RequestCheckpoint(), revmap_extend_and_get_blkno(), sendAuthRequest(), sendDir(), set_rtable_names(), setop_retrieve_hash_table(), shm_mq_receive_bytes(), shm_mq_send_bytes(), shm_mq_wait_internal(), spgdoinsert(), spgWalk(), statapprox_heap(), storeQueryResult(), summarize_range(), tablesample_getnext(), test_shm_mq_pipelined(), text_to_array_internal(), tfuncLoadRows(), throttle(), TidNext(), toast_save_datum(), tuplesort_heap_insert(), tuplesort_heap_replace_top(), tuplesort_skiptuples(), tuplestore_skiptuples(), vacuum_delay_point(), vacuum_rel(), validate_index_heapscan(), wait_for_relation_state_change(), wait_for_worker_state_change(), wait_for_workers_to_become_ready(), wait_pid(), WaitExceedsMaxStandbyDelay(), WaitForBackgroundWorkerShutdown(), WaitForBackgroundWorkerStartup(), WaitForParallelWorkersToFinish(), WaitForReplicationWorkerAttach(), walkdir(), WalSndLoop(), WalSndWaitForWal(), WalSndWriteData(), and window_gettupleslot().

#define DATEORDER_DMY   1
#define DATEORDER_MDY   2

Definition at line 219 of file miscadmin.h.

Referenced by check_datestyle(), locale_date_order(), and setup_config().

#define DATEORDER_YMD   0

Definition at line 217 of file miscadmin.h.

Referenced by check_datestyle(), DecodeNumber(), locale_date_order(), and setup_config().

#define END_CRIT_SECTION ( )
Value:
do { \
} while(0)
#define Assert(condition)
Definition: c.h:681
PGDLLIMPORT volatile uint32 CritSectionCount
Definition: globals.c:37

Definition at line 133 of file miscadmin.h.

Referenced by _bt_delitems_delete(), _bt_delitems_vacuum(), _bt_getroot(), _bt_insertonpg(), _bt_mark_page_halfdead(), _bt_newroot(), _bt_split(), _bt_unlink_halfdead_page(), _hash_addovflpage(), _hash_doinsert(), _hash_expandtable(), _hash_freeovflpage(), _hash_splitbucket(), _hash_squeezebucket(), _hash_vacuum_one_page(), AbsorbFsyncRequests(), addLeafTuple(), brin_doinsert(), brin_doupdate(), brin_initialize_empty_new_buffer(), brinbuildempty(), brinRevmapDesummarizeRange(), CreateCheckPoint(), CreateEndOfRecoveryRecord(), createPostingTree(), CreateSlotOnDisk(), do_setval(), doPickSplit(), EndPrepare(), fill_seq_with_data(), FreeSpaceMapTruncateRel(), GenericXLogFinish(), ginbuild(), ginbuildempty(), ginbulkdelete(), ginDeletePage(), ginHeapTupleFastInsert(), ginPlaceToPage(), ginUpdateStats(), ginVacuumPostingTreeLeaf(), gistbuild(), gistbuildempty(), gistbulkdelete(), gistplacetopage(), gistvacuumpage(), hashbucketcleanup(), hashbulkdelete(), heap_abort_speculative(), heap_delete(), heap_finish_speculative(), heap_inplace_update(), heap_insert(), heap_lock_tuple(), heap_lock_updated_tuple_rec(), heap_multi_insert(), heap_page_prune(), heap_update(), lazy_scan_heap(), lazy_vacuum_page(), moveLeafs(), MultiXactIdCreateFromMembers(), nextval_internal(), PostPrepare_Locks(), RecordTransactionAbort(), RecordTransactionAbortPrepared(), RecordTransactionCommit(), RecordTransactionCommitPrepared(), ReplicationSlotDropPtr(), RestoreSlotFromDisk(), revmap_physical_extend(), SaveSlotToPath(), shiftList(), SlruPhysicalWritePage(), spgAddNodeAction(), spgbuild(), spgSplitNodeAction(), TruncateMultiXact(), UpdateFullPageWrites(), vacuumLeafPage(), vacuumLeafRoot(), vacuumRedirectAndPlaceholder(), visibilitymap_set(), visibilitymap_truncate(), write_relmap_file(), writeListPage(), XLogBackgroundFlush(), XLogFlush(), and XLogInsertRecord().

#define GetProcessingMode ( )    Mode

Definition at line 371 of file miscadmin.h.

#define HOLD_CANCEL_INTERRUPTS ( )    (QueryCancelHoldoffCount++)

Definition at line 123 of file miscadmin.h.

Referenced by CopyGetData(), and SocketBackend().

#define INTSTYLE_ISO_8601   3

Definition at line 234 of file miscadmin.h.

Referenced by EncodeInterval().

#define INTSTYLE_POSTGRES   0

Definition at line 231 of file miscadmin.h.

Referenced by EncodeInterval(), and set_transmission_modes().

#define INTSTYLE_POSTGRES_VERBOSE   1

Definition at line 232 of file miscadmin.h.

Referenced by DecodeInterval(), EncodeInterval(), and PGTYPESinterval_to_asc().

#define INTSTYLE_SQL_STANDARD   2

Definition at line 233 of file miscadmin.h.

Referenced by DecodeInterval(), and EncodeInterval().

#define IsInitProcessingMode ( )    (Mode == InitProcessing)
#define IsNormalProcessingMode ( )    (Mode == NormalProcessing)
#define MAXTZLEN   10 /* max TZ name len, not counting tr. null */

Definition at line 238 of file miscadmin.h.

Referenced by abstime2tm(), and EncodeDateTime().

#define RESUME_CANCEL_INTERRUPTS ( )
Value:
do { \
} while(0)
PGDLLIMPORT volatile uint32 QueryCancelHoldoffCount
Definition: globals.c:36
#define Assert(condition)
Definition: c.h:681

Definition at line 125 of file miscadmin.h.

Referenced by CopyGetData(), and SocketBackend().

#define SECURITY_NOFORCE_RLS   0x0004

Definition at line 295 of file miscadmin.h.

Referenced by InNoForceRLSOperation(), ri_PerformCheck(), and ri_PlanCheck().

#define SECURITY_RESTRICTED_OPERATION   0x0002
#define SetProcessingMode (   mode)
#define START_CRIT_SECTION ( )    (CritSectionCount++)

Definition at line 131 of file miscadmin.h.

Referenced by _bt_delitems_delete(), _bt_delitems_vacuum(), _bt_getroot(), _bt_insertonpg(), _bt_mark_page_halfdead(), _bt_newroot(), _bt_split(), _bt_unlink_halfdead_page(), _hash_addovflpage(), _hash_doinsert(), _hash_expandtable(), _hash_freeovflpage(), _hash_splitbucket(), _hash_squeezebucket(), _hash_vacuum_one_page(), AbsorbFsyncRequests(), addLeafTuple(), brin_doinsert(), brin_doupdate(), brin_initialize_empty_new_buffer(), brinbuildempty(), brinRevmapDesummarizeRange(), CreateCheckPoint(), CreateEndOfRecoveryRecord(), createPostingTree(), CreateSlotOnDisk(), do_setval(), doPickSplit(), EndPrepare(), fill_seq_with_data(), FreeSpaceMapTruncateRel(), GenericXLogFinish(), GetNewMultiXactId(), ginbuild(), ginbuildempty(), ginbulkdelete(), ginDeletePage(), ginHeapTupleFastInsert(), ginPlaceToPage(), ginUpdateStats(), ginVacuumPostingTreeLeaf(), gistbuild(), gistbuildempty(), gistbulkdelete(), gistplacetopage(), gistvacuumpage(), hashbucketcleanup(), hashbulkdelete(), heap_abort_speculative(), heap_delete(), heap_finish_speculative(), heap_inplace_update(), heap_insert(), heap_lock_tuple(), heap_lock_updated_tuple_rec(), heap_multi_insert(), heap_page_prune(), heap_update(), lazy_scan_heap(), lazy_vacuum_page(), moveLeafs(), nextval_internal(), PostPrepare_Locks(), RecordTransactionAbort(), RecordTransactionAbortPrepared(), RecordTransactionCommit(), RecordTransactionCommitPrepared(), ReplicationSlotDropPtr(), RestoreSlotFromDisk(), revmap_physical_extend(), SaveSlotToPath(), shiftList(), SlruPhysicalWritePage(), spgAddNodeAction(), spgbuild(), spgSplitNodeAction(), TruncateMultiXact(), UpdateFullPageWrites(), vacuumLeafPage(), vacuumLeafRoot(), vacuumRedirectAndPlaceholder(), visibilitymap_set(), visibilitymap_truncate(), write_relmap_file(), writeListPage(), XLogBackgroundFlush(), XLogFlush(), and XLogInsertRecord().

#define USE_GERMAN_DATES   3

Definition at line 213 of file miscadmin.h.

Referenced by check_datestyle(), EncodeDateOnly(), and EncodeDateTime().

#define USE_ISO_DATES   1
#define USE_POSTGRES_DATES   0

Definition at line 210 of file miscadmin.h.

Referenced by check_datestyle(), EncodeDateOnly(), and EncodeDateTime().

#define USE_SQL_DATES   2

Definition at line 212 of file miscadmin.h.

Referenced by check_datestyle(), EncodeDateOnly(), and EncodeDateTime().

#define USE_XSD_DATES   4

Typedef Documentation

Definition at line 268 of file miscadmin.h.

Enumeration Type Documentation

Enumerator
NotAnAuxProcess 
CheckerProcess 
BootstrapProcess 
StartupProcess 
BgWriterProcess 
CheckpointerProcess 
WalWriterProcess 
WalReceiverProcess 
NUM_AUXPROCTYPES 

Definition at line 388 of file miscadmin.h.

Enumerator
BootstrapProcessing 
InitProcessing 
NormalProcessing 

Definition at line 358 of file miscadmin.h.

359 {
360  BootstrapProcessing, /* bootstrap creation of template database */
361  InitProcessing, /* initializing system */
362  NormalProcessing /* normal processing */
ProcessingMode
Definition: miscadmin.h:358

Function Documentation

void AddToDataDirLockFile ( int  target_line,
const char *  str 
)

Definition at line 1158 of file miscinit.c.

References close, DIRECTORY_LOCK_FILE, ereport, errcode_for_file_access(), errmsg(), fd(), LOG, PG_BINARY, pg_fsync(), pgstat_report_wait_end(), pgstat_report_wait_start(), read, snprintf(), WAIT_EVENT_LOCK_FILE_ADDTODATADIR_READ, WAIT_EVENT_LOCK_FILE_ADDTODATADIR_SYNC, WAIT_EVENT_LOCK_FILE_ADDTODATADIR_WRITE, and write.

Referenced by InternalIpcMemoryCreate(), pmdie(), PostmasterMain(), reaper(), and sigusr1_handler().

1159 {
1160  int fd;
1161  int len;
1162  int lineno;
1163  char *srcptr;
1164  char *destptr;
1165  char srcbuffer[BLCKSZ];
1166  char destbuffer[BLCKSZ];
1167 
1168  fd = open(DIRECTORY_LOCK_FILE, O_RDWR | PG_BINARY, 0);
1169  if (fd < 0)
1170  {
1171  ereport(LOG,
1173  errmsg("could not open file \"%s\": %m",
1175  return;
1176  }
1178  len = read(fd, srcbuffer, sizeof(srcbuffer) - 1);
1180  if (len < 0)
1181  {
1182  ereport(LOG,
1184  errmsg("could not read from file \"%s\": %m",
1186  close(fd);
1187  return;
1188  }
1189  srcbuffer[len] = '\0';
1190 
1191  /*
1192  * Advance over lines we are not supposed to rewrite, then copy them to
1193  * destbuffer.
1194  */
1195  srcptr = srcbuffer;
1196  for (lineno = 1; lineno < target_line; lineno++)
1197  {
1198  char *eol = strchr(srcptr, '\n');
1199 
1200  if (eol == NULL)
1201  break; /* not enough lines in file yet */
1202  srcptr = eol + 1;
1203  }
1204  memcpy(destbuffer, srcbuffer, srcptr - srcbuffer);
1205  destptr = destbuffer + (srcptr - srcbuffer);
1206 
1207  /*
1208  * Fill in any missing lines before the target line, in case lines are
1209  * added to the file out of order.
1210  */
1211  for (; lineno < target_line; lineno++)
1212  {
1213  if (destptr < destbuffer + sizeof(destbuffer))
1214  *destptr++ = '\n';
1215  }
1216 
1217  /*
1218  * Write or rewrite the target line.
1219  */
1220  snprintf(destptr, destbuffer + sizeof(destbuffer) - destptr, "%s\n", str);
1221  destptr += strlen(destptr);
1222 
1223  /*
1224  * If there are more lines in the old file, append them to destbuffer.
1225  */
1226  if ((srcptr = strchr(srcptr, '\n')) != NULL)
1227  {
1228  srcptr++;
1229  snprintf(destptr, destbuffer + sizeof(destbuffer) - destptr, "%s",
1230  srcptr);
1231  }
1232 
1233  /*
1234  * And rewrite the data. Since we write in a single kernel call, this
1235  * update should appear atomic to onlookers.
1236  */
1237  len = strlen(destbuffer);
1238  errno = 0;
1240  if (lseek(fd, (off_t) 0, SEEK_SET) != 0 ||
1241  (int) write(fd, destbuffer, len) != len)
1242  {
1244  /* if write didn't set errno, assume problem is no disk space */
1245  if (errno == 0)
1246  errno = ENOSPC;
1247  ereport(LOG,
1249  errmsg("could not write to file \"%s\": %m",
1251  close(fd);
1252  return;
1253  }
1256  if (pg_fsync(fd) != 0)
1257  {
1258  ereport(LOG,
1260  errmsg("could not write to file \"%s\": %m",
1262  }
1264  if (close(fd) != 0)
1265  {
1266  ereport(LOG,
1268  errmsg("could not write to file \"%s\": %m",
1270  }
1271 }
#define write(a, b, c)
Definition: win32.h:14
#define DIRECTORY_LOCK_FILE
Definition: miscinit.c:55
int snprintf(char *str, size_t count, const char *fmt,...) pg_attribute_printf(3
#define LOG
Definition: elog.h:26
static int fd(const char *x, int i)
Definition: preproc-init.c:105
#define PG_BINARY
Definition: c.h:1044
int errcode_for_file_access(void)
Definition: elog.c:598
static void pgstat_report_wait_end(void)
Definition: pgstat.h:1244
#define ereport(elevel, rest)
Definition: elog.h:122
static void pgstat_report_wait_start(uint32 wait_event_info)
Definition: pgstat.h:1220
int errmsg(const char *fmt,...)
Definition: elog.c:797
int pg_fsync(int fd)
Definition: fd.c:338
#define close(a)
Definition: win32.h:12
#define read(a, b, c)
Definition: win32.h:13
bool BackupInProgress ( void  )

Definition at line 11433 of file xlog.c.

References BACKUP_LABEL_FILE.

Referenced by pg_is_in_backup(), and PostmasterStateMachine().

11434 {
11435  struct stat stat_buf;
11436 
11437  return (stat(BACKUP_LABEL_FILE, &stat_buf) == 0);
11438 }
struct stat stat_buf
Definition: pg_standby.c:103
#define BACKUP_LABEL_FILE
Definition: xlog.h:322
void BaseInit ( void  )

Definition at line 518 of file postinit.c.

References DebugFileOpen(), InitBufferPoolAccess(), InitCommunication(), InitFileAccess(), and smgrinit().

Referenced by AutoVacLauncherMain(), AutoVacWorkerMain(), AuxiliaryProcessMain(), PostgresMain(), and StartBackgroundWorker().

519 {
520  /*
521  * Attach to shared memory and semaphores, and initialize our
522  * input/output/debugging file descriptors.
523  */
525  DebugFileOpen();
526 
527  /* Do local initialization of file, storage and buffer managers */
528  InitFileAccess();
529  smgrinit();
531 }
static void InitCommunication(void)
Definition: postinit.c:410
void InitBufferPoolAccess(void)
Definition: bufmgr.c:2437
void DebugFileOpen(void)
Definition: elog.c:1863
void smgrinit(void)
Definition: smgr.c:102
void InitFileAccess(void)
Definition: fd.c:769
void CancelBackup ( void  )

Definition at line 11453 of file xlog.c.

References BACKUP_LABEL_FILE, BACKUP_LABEL_OLD, DEBUG1, durable_rename(), ereport, errcode_for_file_access(), errdetail(), errmsg(), LOG, TABLESPACE_MAP, TABLESPACE_MAP_OLD, and WARNING.

Referenced by PostmasterStateMachine().

11454 {
11455  struct stat stat_buf;
11456 
11457  /* if the backup_label file is not there, return */
11458  if (stat(BACKUP_LABEL_FILE, &stat_buf) < 0)
11459  return;
11460 
11461  /* remove leftover file from previously canceled backup if it exists */
11462  unlink(BACKUP_LABEL_OLD);
11463 
11465  {
11466  ereport(WARNING,
11468  errmsg("online backup mode was not canceled"),
11469  errdetail("File \"%s\" could not be renamed to \"%s\": %m.",
11471  return;
11472  }
11473 
11474  /* if the tablespace_map file is not there, return */
11475  if (stat(TABLESPACE_MAP, &stat_buf) < 0)
11476  {
11477  ereport(LOG,
11478  (errmsg("online backup mode canceled"),
11479  errdetail("File \"%s\" was renamed to \"%s\".",
11481  return;
11482  }
11483 
11484  /* remove leftover file from previously canceled backup if it exists */
11485  unlink(TABLESPACE_MAP_OLD);
11486 
11488  {
11489  ereport(LOG,
11490  (errmsg("online backup mode canceled"),
11491  errdetail("Files \"%s\" and \"%s\" were renamed to "
11492  "\"%s\" and \"%s\", respectively.",
11495  }
11496  else
11497  {
11498  ereport(WARNING,
11500  errmsg("online backup mode canceled"),
11501  errdetail("File \"%s\" was renamed to \"%s\", but "
11502  "file \"%s\" could not be renamed to \"%s\": %m.",
11505  }
11506 }
#define DEBUG1
Definition: elog.h:25
#define LOG
Definition: elog.h:26
#define BACKUP_LABEL_OLD
Definition: xlog.h:323
#define TABLESPACE_MAP
Definition: xlog.h:325
struct stat stat_buf
Definition: pg_standby.c:103
int errdetail(const char *fmt,...)
Definition: elog.c:873
int errcode_for_file_access(void)
Definition: elog.c:598
#define ereport(elevel, rest)
Definition: elog.h:122
int durable_rename(const char *oldfile, const char *newfile, int elevel)
Definition: fd.c:598
#define WARNING
Definition: elog.h:40
#define TABLESPACE_MAP_OLD
Definition: xlog.h:326
int errmsg(const char *fmt,...)
Definition: elog.c:797
#define BACKUP_LABEL_FILE
Definition: xlog.h:322
void ChangeToDataDir ( void  )

Definition at line 116 of file miscinit.c.

References AssertState, DataDir, ereport, errcode_for_file_access(), errmsg(), and FATAL.

Referenced by AuxiliaryProcessMain(), PostgresMain(), and PostmasterMain().

117 {
119 
120  if (chdir(DataDir) < 0)
121  ereport(FATAL,
123  errmsg("could not change directory to \"%s\": %m",
124  DataDir)));
125 }
#define AssertState(condition)
Definition: c.h:684
#define FATAL
Definition: elog.h:52
int errcode_for_file_access(void)
Definition: elog.c:598
#define ereport(elevel, rest)
Definition: elog.h:122
int errmsg(const char *fmt,...)
Definition: elog.c:797
char * DataDir
Definition: globals.c:60
void check_stack_depth ( void  )

Definition at line 3150 of file postgres.c.

References ereport, errcode(), errhint(), errmsg(), ERROR, max_stack_depth, and stack_is_too_deep().

Referenced by clean_NOT_intree(), clean_stopword_intree(), cntsize(), contains_required_value(), convertJsonbValue(), copyObjectImpl(), Cover(), datum_to_json(), datum_to_jsonb(), dofindsubquery(), EventTriggerInvoke(), ExecEndNode(), ExecEvalAlternativeSubPlan(), ExecEvalSubPlan(), ExecInitExprRec(), ExecInitNode(), ExecMakeFunctionResultSet(), ExecProcNodeFirst(), ExecShutdownNode(), execute(), expand_partitioned_rtentry(), expression_tree_mutator(), expression_tree_walker(), fillQT(), find_composite_type_dependencies(), findoprnd(), findoprnd_recurse(), flatten_grouping_sets(), FreePageManagerDumpBtree(), freetree(), generate_partition_qual(), generate_partition_wise_join_paths(), get_partition_dispatch_recurse(), get_query_def(), get_rels_with_domain(), get_rule_expr(), get_setop_query(), gistSplit(), hash_range(), hash_range_extended(), hk_depth_search(), infix(), inline_set_returning_function(), int_query_opr_selec(), JsonbDeepContains(), JumbleExpr(), ltree_execute(), makepol(), maketree(), MatchText(), MultiExecProcNode(), parse_array(), parse_object(), plainnode(), plperl_hash_from_tuple(), plperl_sv_to_datum(), populate_array_dim_jsonb(), populate_record_field(), QT2QTN(), QTNBinary(), QTNClearFlags(), QTNCopy(), QTNFree(), QTNodeCompare(), QTNSort(), QTNTernary(), range_cmp(), range_in(), range_out(), range_recv(), range_send(), raw_expression_tree_walker(), record_cmp(), record_eq(), record_in(), record_out(), record_recv(), record_send(), set_append_rel_size(), setPath(), split_array(), transformExprRecurse(), transformSetOperationTree(), traverse_lacons(), try_partition_wise_join(), TS_execute(), TS_execute_ternary(), TS_phrase_execute(), tsquery_opr_selec(), and tsquery_requires_match().

3151 {
3152  if (stack_is_too_deep())
3153  {
3154  ereport(ERROR,
3155  (errcode(ERRCODE_STATEMENT_TOO_COMPLEX),
3156  errmsg("stack depth limit exceeded"),
3157  errhint("Increase the configuration parameter \"max_stack_depth\" (currently %dkB), "
3158  "after ensuring the platform's stack depth limit is adequate.",
3159  max_stack_depth)));
3160  }
3161 }
int errhint(const char *fmt,...)
Definition: elog.c:987
int errcode(int sqlerrcode)
Definition: elog.c:575
#define ERROR
Definition: elog.h:43
#define ereport(elevel, rest)
Definition: elog.h:122
int max_stack_depth
Definition: postgres.c:96
int errmsg(const char *fmt,...)
Definition: elog.c:797
bool stack_is_too_deep(void)
Definition: postgres.c:3164
void CreateDataDirLockFile ( bool  amPostmaster)

Definition at line 1081 of file miscinit.c.

References CreateLockFile(), DataDir, and DIRECTORY_LOCK_FILE.

Referenced by AuxiliaryProcessMain(), PostgresMain(), and PostmasterMain().

1082 {
1083  CreateLockFile(DIRECTORY_LOCK_FILE, amPostmaster, "", true, DataDir);
1084 }
#define DIRECTORY_LOCK_FILE
Definition: miscinit.c:55
static void CreateLockFile(const char *filename, bool amPostmaster, const char *socketDir, bool isDDLock, const char *refName)
Definition: miscinit.c:769
char * DataDir
Definition: globals.c:60
void CreateSocketLockFile ( const char *  socketfile,
bool  amPostmaster,
const char *  socketDir 
)

Definition at line 1090 of file miscinit.c.

References CreateLockFile(), MAXPGPATH, and snprintf().

1092 {
1093  char lockfile[MAXPGPATH];
1094 
1095  snprintf(lockfile, sizeof(lockfile), "%s.lock", socketfile);
1096  CreateLockFile(lockfile, amPostmaster, socketDir, false, socketfile);
1097 }
int snprintf(char *str, size_t count, const char *fmt,...) pg_attribute_printf(3
static void CreateLockFile(const char *filename, bool amPostmaster, const char *socketDir, bool isDDLock, const char *refName)
Definition: miscinit.c:769
#define MAXPGPATH
Oid GetAuthenticatedUserId ( void  )

Definition at line 343 of file miscinit.c.

References AssertState, AuthenticatedUserId, and OidIsValid.

Referenced by InitializeParallelDSM().

344 {
346  return AuthenticatedUserId;
347 }
#define AssertState(condition)
Definition: c.h:684
#define OidIsValid(objectId)
Definition: c.h:532
static Oid AuthenticatedUserId
Definition: miscinit.c:156
Oid GetCurrentRoleId ( void  )

Definition at line 636 of file miscinit.c.

References InvalidOid, OuterUserId, and SetRoleIsActive.

Referenced by show_role().

637 {
638  if (SetRoleIsActive)
639  return OuterUserId;
640  else
641  return InvalidOid;
642 }
static Oid OuterUserId
Definition: miscinit.c:158
#define InvalidOid
Definition: postgres_ext.h:36
static bool SetRoleIsActive
Definition: miscinit.c:168
Oid GetOuterUserId ( void  )

Definition at line 295 of file miscinit.c.

References AssertState, OidIsValid, and OuterUserId.

Referenced by DropRole(), and RenameRole().

296 {
298  return OuterUserId;
299 }
#define AssertState(condition)
Definition: c.h:684
static Oid OuterUserId
Definition: miscinit.c:158
#define OidIsValid(objectId)
Definition: c.h:532
Oid GetSessionUserId ( void  )

Definition at line 318 of file miscinit.c.

References AssertState, OidIsValid, and SessionUserId.

Referenced by check_role(), DropRole(), get_rolespec_oid(), get_rolespec_tuple(), InitPostgres(), is_admin_of_role(), pgstat_bestart(), RenameRole(), and session_user().

319 {
321  return SessionUserId;
322 }
#define AssertState(condition)
Definition: c.h:684
static Oid SessionUserId
Definition: miscinit.c:157
#define OidIsValid(objectId)
Definition: c.h:532
Oid GetUserId ( void  )

Definition at line 284 of file miscinit.c.

References AssertState, CurrentUserId, and OidIsValid.

Referenced by AddRoleMems(), AggregateCreate(), AlterCollation(), AlterDatabase(), AlterDatabaseOwner(), AlterDatabaseSet(), AlterEventTrigger(), AlterEventTriggerOwner_internal(), AlterExtensionNamespace(), AlterForeignServer(), AlterForeignServerOwner_internal(), AlterFunction(), AlterObjectNamespace_internal(), AlterObjectOwner_internal(), AlterObjectRename_internal(), AlterOperator(), AlterOpFamilyAdd(), AlterPublication(), AlterPublicationOwner_internal(), AlterRole(), AlterRoleSet(), AlterSchemaOwner_internal(), AlterSubscription(), AlterSubscriptionOwner_internal(), AlterTableMoveAll(), AlterTableSpaceOptions(), AlterTSConfiguration(), AlterTSDictionary(), AlterTypeNamespace_oid(), AlterTypeOwner(), analyze_rel(), ATExecAddColumn(), ATExecChangeOwner(), ATPrepAlterColumnType(), ATPrepSetStatistics(), ATPrepSetTableSpace(), ATSimplePermissions(), be_lo_put(), be_lo_unlink(), binary_upgrade_create_empty_extension(), brin_desummarize_range(), brin_summarize_range(), BuildCachedPlan(), BuildDescForRelation(), BuildIndexValueDescription(), calculate_database_size(), calculate_tablespace_size(), call_pltcl_start_proc(), check_enable_rls(), check_permissions(), check_temp_tablespaces(), CheckCachedPlan(), checkDomainOwner(), checkEnumOwner(), checkFkeyPermissions(), CheckFunctionValidatorAccess(), CheckMyDatabase(), cluster_rel(), CommentObject(), compile_plperl_function(), compile_pltcl_function(), CompleteCachedPlan(), compute_return_type(), CreateCast(), CreateConversionCommand(), createdb(), CreateEventTrigger(), CreateExtensionInternal(), CreateForeignDataWrapper(), CreateForeignServer(), CreateForeignTable(), CreateFunction(), CreateOpFamily(), CreateProceduralLanguage(), CreatePublication(), CreateRole(), CreateStatistics(), CreateSubscription(), CreateTableSpace(), CreateTransform(), CreateTrigger(), current_user(), currtid_byrelname(), currtid_byreloid(), currval_oid(), DefineAggregate(), DefineCollation(), DefineDomain(), DefineEnum(), DefineIndex(), DefineOpClass(), DefineOperator(), DefineOpFamily(), DefineQueryRewrite(), DefineRange(), DefineRelation(), DefineTSConfiguration(), DefineTSDictionary(), DefineType(), DelRoleMems(), do_setval(), dropdb(), DropOwnedObjects(), DropRole(), DropSubscription(), DropTableSpace(), EnableDisableRule(), examine_simple_variable(), examine_variable(), ExecAlterDefaultPrivilegesStmt(), ExecAlterExtensionContentsStmt(), ExecAlterExtensionStmt(), ExecBuildSlotPartitionKeyDescription(), ExecBuildSlotValueDescription(), ExecCheckRTEPerms(), ExecGrant_Attribute(), ExecGrant_Database(), ExecGrant_Fdw(), ExecGrant_ForeignServer(), ExecGrant_Function(), ExecGrant_Language(), ExecGrant_Largeobject(), ExecGrant_Namespace(), ExecGrant_Relation(), ExecGrant_Tablespace(), ExecGrant_Type(), ExecInitAgg(), ExecInitExprRec(), ExecInitFunc(), ExecInitWindowAgg(), ExecSecLabelStmt(), ExecuteDoStmt(), ExecuteTruncate(), findRangeCanonicalFunction(), findRangeSubtypeDiffFunction(), FinishPreparedTransaction(), get_connect_string(), get_other_operator(), get_rel_from_relname(), get_rolespec_oid(), get_rolespec_tuple(), get_row_security_policies(), get_tables_to_cluster(), GetConfigOption(), GetConfigOptionByName(), GetConfigOptionByNum(), GetConfigOptionResetString(), gin_clean_pending_list(), GrantRole(), HandleFunctionRequest(), has_any_column_privilege_id(), has_any_column_privilege_name(), has_column_privilege_id_attnum(), has_column_privilege_id_name(), has_column_privilege_name_attnum(), has_column_privilege_name_name(), has_database_privilege_id(), has_database_privilege_name(), has_foreign_data_wrapper_privilege_id(), has_foreign_data_wrapper_privilege_name(), has_function_privilege_id(), has_function_privilege_name(), has_language_privilege_id(), has_language_privilege_name(), has_schema_privilege_id(), has_schema_privilege_name(), has_sequence_privilege_id(), has_sequence_privilege_name(), has_server_privilege_id(), has_server_privilege_name(), has_table_privilege_id(), has_table_privilege_name(), has_tablespace_privilege_id(), has_tablespace_privilege_name(), has_type_privilege_id(), has_type_privilege_name(), have_createdb_privilege(), have_createrole_privilege(), ImportForeignSchema(), init_sexpr(), InitializeSearchPath(), InitPostgres(), InitTempTableNamespace(), inline_function(), inline_set_returning_function(), insert_username(), interpret_function_parameter_list(), inv_create(), LargeObjectCreate(), lastval(), lo_get_fragment_internal(), lo_read(), lo_truncate_internal(), lo_write(), LockTableAclCheck(), lookup_agg_function(), LookupCreationNamespace(), LookupExplicitNamespace(), MergeAttributes(), movedb(), nextval_internal(), OperatorCreate(), OperatorShellMake(), pg_has_role_id(), pg_has_role_name(), pg_import_system_collations(), pg_prewarm(), pg_sequence_last_value(), pg_sequence_parameters(), pg_signal_backend(), pg_stat_get_activity(), pg_stat_get_backend_activity(), pg_stat_get_backend_activity_start(), pg_stat_get_backend_client_addr(), pg_stat_get_backend_client_port(), pg_stat_get_backend_start(), pg_stat_get_backend_wait_event(), pg_stat_get_backend_wait_event_type(), pg_stat_get_backend_xact_start(), pg_stat_get_progress_info(), pg_stat_get_wal_receiver(), pg_stat_statements_internal(), pgrowlocks(), pgss_store(), pgstat_get_backend_current_activity(), pltcl_fetch_interp(), postgresBeginDirectModify(), postgresBeginForeignModify(), postgresBeginForeignScan(), postgresGetForeignRelSize(), postgresImportForeignSchema(), PrepareTempTablespaces(), PrepareTransaction(), PublicationAddTables(), RangeVarCallbackForAlterRelation(), RangeVarCallbackForDropRelation(), RangeVarCallbackForPolicy(), RangeVarCallbackForReindexIndex(), RangeVarCallbackForRenameRule(), RangeVarCallbackForRenameTrigger(), RangeVarCallbackOwnsRelation(), RangeVarCallbackOwnsTable(), RangeVarGetAndCheckCreationNamespace(), ReassignOwnedObjects(), recomputeNamespacePath(), ReindexMultipleTables(), RemoveObjects(), RemoveRoleFromObjectPolicy(), renameatt_check(), RenameDatabase(), RenameSchema(), RenameTableSpace(), RenameType(), RevalidateCachedQuery(), RI_Initial_Check(), ri_ReportViolation(), select_perl_context(), set_foreign_rel_properties(), superuser(), timetravel(), transformTableLikeClause(), truncate_check_rel(), user_mapping_ddl_aclcheck(), vacuum_rel(), ValidateJoinEstimator(), and ValidateRestrictionEstimator().

285 {
287  return CurrentUserId;
288 }
#define AssertState(condition)
Definition: c.h:684
#define OidIsValid(objectId)
Definition: c.h:532
static Oid CurrentUserId
Definition: miscinit.c:159
void GetUserIdAndContext ( Oid userid,
bool sec_def_context 
)

Definition at line 438 of file miscinit.c.

References CurrentUserId, and InLocalUserIdChange().

439 {
440  *userid = CurrentUserId;
441  *sec_def_context = InLocalUserIdChange();
442 }
bool InLocalUserIdChange(void)
Definition: miscinit.c:407
static Oid CurrentUserId
Definition: miscinit.c:159
void GetUserIdAndSecContext ( Oid userid,
int *  sec_context 
)
char* GetUserNameFromId ( Oid  roleid,
bool  noerr 
)

Definition at line 692 of file miscinit.c.

References AUTHOID, ereport, errcode(), errmsg(), ERROR, GETSTRUCT, HeapTupleIsValid, NameStr, ObjectIdGetDatum, pstrdup(), ReleaseSysCache(), and SearchSysCache1().

Referenced by check_is_member_of_role(), current_user(), getObjectDescription(), getObjectIdentityParts(), insert_username(), regroleout(), RemoveRoleFromObjectPolicy(), session_user(), and timetravel().

693 {
694  HeapTuple tuple;
695  char *result;
696 
697  tuple = SearchSysCache1(AUTHOID, ObjectIdGetDatum(roleid));
698  if (!HeapTupleIsValid(tuple))
699  {
700  if (!noerr)
701  ereport(ERROR,
702  (errcode(ERRCODE_UNDEFINED_OBJECT),
703  errmsg("invalid role OID: %u", roleid)));
704  result = NULL;
705  }
706  else
707  {
708  result = pstrdup(NameStr(((Form_pg_authid) GETSTRUCT(tuple))->rolname));
709  ReleaseSysCache(tuple);
710  }
711  return result;
712 }
#define GETSTRUCT(TUP)
Definition: htup_details.h:656
char * pstrdup(const char *in)
Definition: mcxt.c:1076
int errcode(int sqlerrcode)
Definition: elog.c:575
FormData_pg_authid * Form_pg_authid
Definition: pg_authid.h:72
#define ObjectIdGetDatum(X)
Definition: postgres.h:513
#define ERROR
Definition: elog.h:43
#define ereport(elevel, rest)
Definition: elog.h:122
HeapTuple SearchSysCache1(int cacheId, Datum key1)
Definition: syscache.c:1112
void ReleaseSysCache(HeapTuple tuple)
Definition: syscache.c:1160
#define HeapTupleIsValid(tuple)
Definition: htup.h:77
int errmsg(const char *fmt,...)
Definition: elog.c:797
#define NameStr(name)
Definition: c.h:493
bool has_rolreplication ( Oid  roleid)

Definition at line 465 of file miscinit.c.

References AUTHOID, GETSTRUCT, HeapTupleIsValid, ObjectIdGetDatum, ReleaseSysCache(), and SearchSysCache1().

Referenced by check_permissions(), and InitPostgres().

466 {
467  bool result = false;
468  HeapTuple utup;
469 
470  utup = SearchSysCache1(AUTHOID, ObjectIdGetDatum(roleid));
471  if (HeapTupleIsValid(utup))
472  {
473  result = ((Form_pg_authid) GETSTRUCT(utup))->rolreplication;
474  ReleaseSysCache(utup);
475  }
476  return result;
477 }
#define GETSTRUCT(TUP)
Definition: htup_details.h:656
FormData_pg_authid * Form_pg_authid
Definition: pg_authid.h:72
#define ObjectIdGetDatum(X)
Definition: postgres.h:513
HeapTuple SearchSysCache1(int cacheId, Datum key1)
Definition: syscache.c:1112
void ReleaseSysCache(HeapTuple tuple)
Definition: syscache.c:1160
#define HeapTupleIsValid(tuple)
Definition: htup.h:77
void InitializeMaxBackends ( void  )

Definition at line 496 of file postinit.c.

References Assert, autovacuum_max_workers, elog, ERROR, MAX_BACKENDS, max_worker_processes, MaxBackends, and MaxConnections.

Referenced by AuxiliaryProcessMain(), PostgresMain(), and PostmasterMain().

497 {
498  Assert(MaxBackends == 0);
499 
500  /* the extra unit accounts for the autovacuum launcher */
503 
504  /* internal error because the values were all checked previously */
506  elog(ERROR, "too many backends configured");
507 }
#define ERROR
Definition: elog.h:43
#define MAX_BACKENDS
Definition: postmaster.h:75
int MaxBackends
Definition: globals.c:126
int MaxConnections
Definition: globals.c:123
int autovacuum_max_workers
Definition: autovacuum.c:115
#define Assert(condition)
Definition: c.h:681
int max_worker_processes
Definition: globals.c:124
#define elog
Definition: elog.h:219
void InitializeSessionUserId ( const char *  rolename,
Oid  useroid 
)

Definition at line 483 of file miscinit.c.

References AssertState, AuthenticatedUserId, AuthenticatedUserIsSuperuser, AUTHNAME, AUTHOID, CountUserBackends(), ereport, errcode(), errmsg(), FATAL, GETSTRUCT, HeapTupleGetOid, HeapTupleIsValid, IsBootstrapProcessingMode, IsUnderPostmaster, MyProc, NameStr, ObjectIdGetDatum, OidIsValid, PGC_BACKEND, PGC_INTERNAL, PGC_S_OVERRIDE, PointerGetDatum, ReleaseSysCache(), PGPROC::roleId, SearchSysCache1(), SetConfigOption(), and SetSessionUserId().

Referenced by InitPostgres().

484 {
485  HeapTuple roleTup;
486  Form_pg_authid rform;
487  char *rname;
488 
489  /*
490  * Don't do scans if we're bootstrapping, none of the system catalogs
491  * exist yet, and they should be owned by postgres anyway.
492  */
494 
495  /* call only once */
497 
498  if (rolename != NULL)
499  {
500  roleTup = SearchSysCache1(AUTHNAME, PointerGetDatum(rolename));
501  if (!HeapTupleIsValid(roleTup))
502  ereport(FATAL,
503  (errcode(ERRCODE_INVALID_AUTHORIZATION_SPECIFICATION),
504  errmsg("role \"%s\" does not exist", rolename)));
505  }
506  else
507  {
508  roleTup = SearchSysCache1(AUTHOID, ObjectIdGetDatum(roleid));
509  if (!HeapTupleIsValid(roleTup))
510  ereport(FATAL,
511  (errcode(ERRCODE_INVALID_AUTHORIZATION_SPECIFICATION),
512  errmsg("role with OID %u does not exist", roleid)));
513  }
514 
515  rform = (Form_pg_authid) GETSTRUCT(roleTup);
516  roleid = HeapTupleGetOid(roleTup);
517  rname = NameStr(rform->rolname);
518 
519  AuthenticatedUserId = roleid;
520  AuthenticatedUserIsSuperuser = rform->rolsuper;
521 
522  /* This sets OuterUserId/CurrentUserId too */
524 
525  /* Also mark our PGPROC entry with the authenticated user id */
526  /* (We assume this is an atomic store so no lock is needed) */
527  MyProc->roleId = roleid;
528 
529  /*
530  * These next checks are not enforced when in standalone mode, so that
531  * there is a way to recover from sillinesses like "UPDATE pg_authid SET
532  * rolcanlogin = false;".
533  */
534  if (IsUnderPostmaster)
535  {
536  /*
537  * Is role allowed to login at all?
538  */
539  if (!rform->rolcanlogin)
540  ereport(FATAL,
541  (errcode(ERRCODE_INVALID_AUTHORIZATION_SPECIFICATION),
542  errmsg("role \"%s\" is not permitted to log in",
543  rname)));
544 
545  /*
546  * Check connection limit for this role.
547  *
548  * There is a race condition here --- we create our PGPROC before
549  * checking for other PGPROCs. If two backends did this at about the
550  * same time, they might both think they were over the limit, while
551  * ideally one should succeed and one fail. Getting that to work
552  * exactly seems more trouble than it is worth, however; instead we
553  * just document that the connection limit is approximate.
554  */
555  if (rform->rolconnlimit >= 0 &&
557  CountUserBackends(roleid) > rform->rolconnlimit)
558  ereport(FATAL,
559  (errcode(ERRCODE_TOO_MANY_CONNECTIONS),
560  errmsg("too many connections for role \"%s\"",
561  rname)));
562  }
563 
564  /* Record username and superuser status as GUC settings too */
565  SetConfigOption("session_authorization", rname,
567  SetConfigOption("is_superuser",
568  AuthenticatedUserIsSuperuser ? "on" : "off",
570 
571  ReleaseSysCache(roleTup);
572 }
#define GETSTRUCT(TUP)
Definition: htup_details.h:656
#define AssertState(condition)
Definition: c.h:684
PGPROC * MyProc
Definition: proc.c:67
#define PointerGetDatum(X)
Definition: postgres.h:562
Oid roleId
Definition: proc.h:115
int errcode(int sqlerrcode)
Definition: elog.c:575
#define OidIsValid(objectId)
Definition: c.h:532
FormData_pg_authid * Form_pg_authid
Definition: pg_authid.h:72
#define ObjectIdGetDatum(X)
Definition: postgres.h:513
#define FATAL
Definition: elog.h:52
void SetConfigOption(const char *name, const char *value, GucContext context, GucSource source)
Definition: guc.c:6681
bool IsUnderPostmaster
Definition: globals.c:101
static bool AuthenticatedUserIsSuperuser
Definition: miscinit.c:162
#define ereport(elevel, rest)
Definition: elog.h:122
HeapTuple SearchSysCache1(int cacheId, Datum key1)
Definition: syscache.c:1112
void ReleaseSysCache(HeapTuple tuple)
Definition: syscache.c:1160
#define HeapTupleIsValid(tuple)
Definition: htup.h:77
int CountUserBackends(Oid roleid)
Definition: procarray.c:2840
#define IsBootstrapProcessingMode()
Definition: miscadmin.h:367
int errmsg(const char *fmt,...)
Definition: elog.c:797
#define NameStr(name)
Definition: c.h:493
#define HeapTupleGetOid(tuple)
Definition: htup_details.h:695
static void SetSessionUserId(Oid userid, bool is_superuser)
Definition: miscinit.c:326
static Oid AuthenticatedUserId
Definition: miscinit.c:156
void InitializeSessionUserIdStandalone ( void  )

Definition at line 579 of file miscinit.c.

References AssertState, AuthenticatedUserId, AuthenticatedUserIsSuperuser, BOOTSTRAP_SUPERUSERID, IsAutoVacuumWorkerProcess(), IsBackgroundWorker, IsUnderPostmaster, OidIsValid, and SetSessionUserId().

Referenced by InitPostgres().

580 {
581  /*
582  * This function should only be called in single-user mode, in autovacuum
583  * workers, and in background workers.
584  */
586 
587  /* call only once */
589 
592 
594 }
#define AssertState(condition)
Definition: c.h:684
#define OidIsValid(objectId)
Definition: c.h:532
bool IsBackgroundWorker
Definition: globals.c:103
bool IsUnderPostmaster
Definition: globals.c:101
static bool AuthenticatedUserIsSuperuser
Definition: miscinit.c:162
bool IsAutoVacuumWorkerProcess(void)
Definition: autovacuum.c:3256
#define BOOTSTRAP_SUPERUSERID
Definition: pg_authid.h:102
static void SetSessionUserId(Oid userid, bool is_superuser)
Definition: miscinit.c:326
static Oid AuthenticatedUserId
Definition: miscinit.c:156
void InitPostgres ( const char *  in_dbname,
Oid  dboid,
const char *  username,
Oid  useroid,
char *  out_dbname 
)

Definition at line 559 of file postinit.c.

References am_db_walsender, am_walsender, Assert, before_shmem_exit(), CAC_WAITBACKUP, Port::canAcceptConnections, CheckDeadLockAlert(), CheckMyDatabase(), CommitTransactionCommand(), PGPROC::databaseId, DatabaseRelationId, dbname, DEADLOCK_TIMEOUT, DEBUG3, DEFAULTTABLESPACE_OID, elog, EnablePortalManager(), ereport, errcode(), errcode_for_file_access(), errdetail(), errhint(), errmsg(), FATAL, GetDatabasePath(), GetDatabaseTuple(), GetDatabaseTupleByOid(), GetSessionUserId(), GETSTRUCT, GetTransactionSnapshot(), GetUserId(), has_rolreplication(), HaveNFreeProcs(), HeapTupleGetOid, HeapTupleIsValid, IDLE_IN_TRANSACTION_SESSION_TIMEOUT, IdleInTransactionSessionTimeoutHandler(), InitBufferPoolBackend(), InitCatalogCache(), initialize_acl(), InitializeClientEncoding(), InitializeSearchPath(), InitializeSession(), InitializeSessionUserId(), InitializeSessionUserIdStandalone(), InitPlanCache(), InitProcessPhase2(), InvalidateCatalogSnapshot(), InvalidBackendId, IsAutoVacuumLauncherProcess(), IsAutoVacuumWorkerProcess(), IsBackgroundWorker, IsBinaryUpgrade, IsBootstrapProcessingMode, IsUnderPostmaster, LOCK_TIMEOUT, LockSharedObject(), LockTimeoutHandler(), MaxBackends, MyBackendId, MyDatabaseId, MyDatabaseTableSpace, MyProc, MyProcPort, NAMEDATALEN, NameStr, OidIsValid, on_shmem_exit(), PerformAuthentication(), pg_usleep(), pgstat_bestart(), pgstat_initialize(), PostAuthDelay, process_settings(), process_startup_options(), ProcSignalInit(), RecoveryInProgress(), RegisterTimeout(), RelationCacheInitialize(), RelationCacheInitializePhase2(), RelationCacheInitializePhase3(), ReservedBackends, RowExclusiveLock, SetCurrentStatementStartTimestamp(), SetDatabasePath(), SharedInvalBackendInit(), ShutdownPostgres(), ShutdownXLOG(), StartTransactionCommand(), StartupXLOG(), STATEMENT_TIMEOUT, StatementTimeoutHandler(), strlcpy(), superuser(), TemplateDbOid, ThereIsAtLeastOneRole(), ValidatePgVersion(), WARNING, XACT_READ_COMMITTED, and XactIsoLevel.

Referenced by AutoVacLauncherMain(), AutoVacWorkerMain(), BackgroundWorkerInitializeConnection(), BackgroundWorkerInitializeConnectionByOid(), BootstrapModeMain(), and PostgresMain().

561 {
562  bool bootstrap = IsBootstrapProcessingMode();
563  bool am_superuser;
564  char *fullpath;
565  char dbname[NAMEDATALEN];
566 
567  elog(DEBUG3, "InitPostgres");
568 
569  /*
570  * Add my PGPROC struct to the ProcArray.
571  *
572  * Once I have done this, I am visible to other backends!
573  */
575 
576  /*
577  * Initialize my entry in the shared-invalidation manager's array of
578  * per-backend data.
579  *
580  * Sets up MyBackendId, a unique backend identifier.
581  */
583 
584  SharedInvalBackendInit(false);
585 
586  if (MyBackendId > MaxBackends || MyBackendId <= 0)
587  elog(FATAL, "bad backend ID: %d", MyBackendId);
588 
589  /* Now that we have a BackendId, we can participate in ProcSignal */
591 
592  /*
593  * Also set up timeout handlers needed for backend operation. We need
594  * these in every case except bootstrap.
595  */
596  if (!bootstrap)
597  {
603  }
604 
605  /*
606  * bufmgr needs another initialization call too
607  */
609 
610  /*
611  * Initialize local process's access to XLOG.
612  */
613  if (IsUnderPostmaster)
614  {
615  /*
616  * The postmaster already started the XLOG machinery, but we need to
617  * call InitXLOGAccess(), if the system isn't in hot-standby mode.
618  * This is handled by calling RecoveryInProgress and ignoring the
619  * result.
620  */
621  (void) RecoveryInProgress();
622  }
623  else
624  {
625  /*
626  * We are either a bootstrap process or a standalone backend. Either
627  * way, start up the XLOG machinery, and register to have it closed
628  * down at exit.
629  */
630  StartupXLOG();
632  }
633 
634  /*
635  * Initialize the relation cache and the system catalog caches. Note that
636  * no catalog access happens here; we only set up the hashtable structure.
637  * We must do this before starting a transaction because transaction abort
638  * would try to touch these hashtables.
639  */
642  InitPlanCache();
643 
644  /* Initialize portal manager */
646 
647  /* Initialize stats collection --- must happen before first xact */
648  if (!bootstrap)
650 
651  /*
652  * Load relcache entries for the shared system catalogs. This must create
653  * at least entries for pg_database and catalogs used for authentication.
654  */
656 
657  /*
658  * Set up process-exit callback to do pre-shutdown cleanup. This is the
659  * first before_shmem_exit callback we register; thus, this will be the
660  * last thing we do before low-level modules like the buffer manager begin
661  * to close down. We need to have this in place before we begin our first
662  * transaction --- if we fail during the initialization transaction, as is
663  * entirely possible, we need the AbortTransaction call to clean up.
664  */
666 
667  /* The autovacuum launcher is done here */
669  {
670  /* report this backend in the PgBackendStatus array */
671  pgstat_bestart();
672 
673  return;
674  }
675 
676  /*
677  * Start a new transaction here before first access to db, and get a
678  * snapshot. We don't have a use for the snapshot itself, but we're
679  * interested in the secondary effect that it sets RecentGlobalXmin. (This
680  * is critical for anything that reads heap pages, because HOT may decide
681  * to prune them even if the process doesn't attempt to modify any
682  * tuples.)
683  */
684  if (!bootstrap)
685  {
686  /* statement_timestamp must be set for timeouts to work correctly */
689 
690  /*
691  * transaction_isolation will have been set to the default by the
692  * above. If the default is "serializable", and we are in hot
693  * standby, we will fail if we don't change it to something lower.
694  * Fortunately, "read committed" is plenty good enough.
695  */
697 
698  (void) GetTransactionSnapshot();
699  }
700 
701  /*
702  * Perform client authentication if necessary, then figure out our
703  * postgres user ID, and see if we are a superuser.
704  *
705  * In standalone mode and in autovacuum worker processes, we use a fixed
706  * ID, otherwise we figure it out from the authenticated user name.
707  */
708  if (bootstrap || IsAutoVacuumWorkerProcess())
709  {
711  am_superuser = true;
712  }
713  else if (!IsUnderPostmaster)
714  {
716  am_superuser = true;
717  if (!ThereIsAtLeastOneRole())
719  (errcode(ERRCODE_UNDEFINED_OBJECT),
720  errmsg("no roles are defined in this database system"),
721  errhint("You should immediately run CREATE USER \"%s\" SUPERUSER;.",
722  username != NULL ? username : "postgres")));
723  }
724  else if (IsBackgroundWorker)
725  {
726  if (username == NULL && !OidIsValid(useroid))
727  {
729  am_superuser = true;
730  }
731  else
732  {
734  am_superuser = superuser();
735  }
736  }
737  else
738  {
739  /* normal multiuser case */
740  Assert(MyProcPort != NULL);
743  am_superuser = superuser();
744  }
745 
746  /*
747  * If we're trying to shut down, only superusers can connect, and new
748  * replication connections are not allowed.
749  */
750  if ((!am_superuser || am_walsender) &&
751  MyProcPort != NULL &&
753  {
754  if (am_walsender)
755  ereport(FATAL,
756  (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
757  errmsg("new replication connections are not allowed during database shutdown")));
758  else
759  ereport(FATAL,
760  (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
761  errmsg("must be superuser to connect during database shutdown")));
762  }
763 
764  /*
765  * Binary upgrades only allowed super-user connections
766  */
767  if (IsBinaryUpgrade && !am_superuser)
768  {
769  ereport(FATAL,
770  (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
771  errmsg("must be superuser to connect in binary upgrade mode")));
772  }
773 
774  /*
775  * The last few connections slots are reserved for superusers. Although
776  * replication connections currently require superuser privileges, we
777  * don't allow them to consume the reserved slots, which are intended for
778  * interactive use.
779  */
780  if ((!am_superuser || am_walsender) &&
781  ReservedBackends > 0 &&
783  ereport(FATAL,
784  (errcode(ERRCODE_TOO_MANY_CONNECTIONS),
785  errmsg("remaining connection slots are reserved for non-replication superuser connections")));
786 
787  /* Check replication permissions needed for walsender processes. */
788  if (am_walsender)
789  {
790  Assert(!bootstrap);
791 
792  if (!superuser() && !has_rolreplication(GetUserId()))
793  ereport(FATAL,
794  (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
795  errmsg("must be superuser or replication role to start walsender")));
796  }
797 
798  /*
799  * If this is a plain walsender only supporting physical replication, we
800  * don't want to connect to any particular database. Just finish the
801  * backend startup by processing any options from the startup packet, and
802  * we're done.
803  */
805  {
806  /* process any options passed in the startup packet */
807  if (MyProcPort != NULL)
808  process_startup_options(MyProcPort, am_superuser);
809 
810  /* Apply PostAuthDelay as soon as we've read all options */
811  if (PostAuthDelay > 0)
812  pg_usleep(PostAuthDelay * 1000000L);
813 
814  /* initialize client encoding */
816 
817  /* report this backend in the PgBackendStatus array */
818  pgstat_bestart();
819 
820  /* close the transaction we started above */
822 
823  return;
824  }
825 
826  /*
827  * Set up the global variables holding database id and default tablespace.
828  * But note we won't actually try to touch the database just yet.
829  *
830  * We take a shortcut in the bootstrap case, otherwise we have to look up
831  * the db's entry in pg_database.
832  */
833  if (bootstrap)
834  {
837  }
838  else if (in_dbname != NULL)
839  {
840  HeapTuple tuple;
841  Form_pg_database dbform;
842 
843  tuple = GetDatabaseTuple(in_dbname);
844  if (!HeapTupleIsValid(tuple))
845  ereport(FATAL,
846  (errcode(ERRCODE_UNDEFINED_DATABASE),
847  errmsg("database \"%s\" does not exist", in_dbname)));
848  dbform = (Form_pg_database) GETSTRUCT(tuple);
849  MyDatabaseId = HeapTupleGetOid(tuple);
850  MyDatabaseTableSpace = dbform->dattablespace;
851  /* take database name from the caller, just for paranoia */
852  strlcpy(dbname, in_dbname, sizeof(dbname));
853  }
854  else if (OidIsValid(dboid))
855  {
856  /* caller specified database by OID */
857  HeapTuple tuple;
858  Form_pg_database dbform;
859 
860  tuple = GetDatabaseTupleByOid(dboid);
861  if (!HeapTupleIsValid(tuple))
862  ereport(FATAL,
863  (errcode(ERRCODE_UNDEFINED_DATABASE),
864  errmsg("database %u does not exist", dboid)));
865  dbform = (Form_pg_database) GETSTRUCT(tuple);
866  MyDatabaseId = HeapTupleGetOid(tuple);
867  MyDatabaseTableSpace = dbform->dattablespace;
868  Assert(MyDatabaseId == dboid);
869  strlcpy(dbname, NameStr(dbform->datname), sizeof(dbname));
870  /* pass the database name back to the caller */
871  if (out_dbname)
872  strcpy(out_dbname, dbname);
873  }
874  else
875  {
876  /*
877  * If this is a background worker not bound to any particular
878  * database, we're done now. Everything that follows only makes sense
879  * if we are bound to a specific database. We do need to close the
880  * transaction we started before returning.
881  */
882  if (!bootstrap)
883  {
884  pgstat_bestart();
886  }
887  return;
888  }
889 
890  /*
891  * Now, take a writer's lock on the database we are trying to connect to.
892  * If there is a concurrently running DROP DATABASE on that database, this
893  * will block us until it finishes (and has committed its update of
894  * pg_database).
895  *
896  * Note that the lock is not held long, only until the end of this startup
897  * transaction. This is OK since we will advertise our use of the
898  * database in the ProcArray before dropping the lock (in fact, that's the
899  * next thing to do). Anyone trying a DROP DATABASE after this point will
900  * see us in the array once they have the lock. Ordering is important for
901  * this because we don't want to advertise ourselves as being in this
902  * database until we have the lock; otherwise we create what amounts to a
903  * deadlock with CountOtherDBBackends().
904  *
905  * Note: use of RowExclusiveLock here is reasonable because we envision
906  * our session as being a concurrent writer of the database. If we had a
907  * way of declaring a session as being guaranteed-read-only, we could use
908  * AccessShareLock for such sessions and thereby not conflict against
909  * CREATE DATABASE.
910  */
911  if (!bootstrap)
914 
915  /*
916  * Now we can mark our PGPROC entry with the database ID.
917  *
918  * We assume this is an atomic store so no lock is needed; though actually
919  * things would work fine even if it weren't atomic. Anyone searching the
920  * ProcArray for this database's ID should hold the database lock, so they
921  * would not be executing concurrently with this store. A process looking
922  * for another database's ID could in theory see a chance match if it read
923  * a partially-updated databaseId value; but as long as all such searches
924  * wait and retry, as in CountOtherDBBackends(), they will certainly see
925  * the correct value on their next try.
926  */
928 
929  /*
930  * We established a catalog snapshot while reading pg_authid and/or
931  * pg_database; but until we have set up MyDatabaseId, we won't react to
932  * incoming sinval messages for unshared catalogs, so we won't realize it
933  * if the snapshot has been invalidated. Assume it's no good anymore.
934  */
936 
937  /*
938  * Recheck pg_database to make sure the target database hasn't gone away.
939  * If there was a concurrent DROP DATABASE, this ensures we will die
940  * cleanly without creating a mess.
941  */
942  if (!bootstrap)
943  {
944  HeapTuple tuple;
945 
946  tuple = GetDatabaseTuple(dbname);
947  if (!HeapTupleIsValid(tuple) ||
948  MyDatabaseId != HeapTupleGetOid(tuple) ||
949  MyDatabaseTableSpace != ((Form_pg_database) GETSTRUCT(tuple))->dattablespace)
950  ereport(FATAL,
951  (errcode(ERRCODE_UNDEFINED_DATABASE),
952  errmsg("database \"%s\" does not exist", dbname),
953  errdetail("It seems to have just been dropped or renamed.")));
954  }
955 
956  /*
957  * Now we should be able to access the database directory safely. Verify
958  * it's there and looks reasonable.
959  */
961 
962  if (!bootstrap)
963  {
964  if (access(fullpath, F_OK) == -1)
965  {
966  if (errno == ENOENT)
967  ereport(FATAL,
968  (errcode(ERRCODE_UNDEFINED_DATABASE),
969  errmsg("database \"%s\" does not exist",
970  dbname),
971  errdetail("The database subdirectory \"%s\" is missing.",
972  fullpath)));
973  else
974  ereport(FATAL,
976  errmsg("could not access directory \"%s\": %m",
977  fullpath)));
978  }
979 
980  ValidatePgVersion(fullpath);
981  }
982 
983  SetDatabasePath(fullpath);
984 
985  /*
986  * It's now possible to do real access to the system catalogs.
987  *
988  * Load relcache entries for the system catalogs. This must create at
989  * least the minimum set of "nailed-in" cache entries.
990  */
992 
993  /* set up ACL framework (so CheckMyDatabase can check permissions) */
994  initialize_acl();
995 
996  /*
997  * Re-read the pg_database row for our database, check permissions and set
998  * up database-specific GUC settings. We can't do this until all the
999  * database-access infrastructure is up. (Also, it wants to know if the
1000  * user is a superuser, so the above stuff has to happen first.)
1001  */
1002  if (!bootstrap)
1003  CheckMyDatabase(dbname, am_superuser);
1004 
1005  /*
1006  * Now process any command-line switches and any additional GUC variable
1007  * settings passed in the startup packet. We couldn't do this before
1008  * because we didn't know if client is a superuser.
1009  */
1010  if (MyProcPort != NULL)
1011  process_startup_options(MyProcPort, am_superuser);
1012 
1013  /* Process pg_db_role_setting options */
1015 
1016  /* Apply PostAuthDelay as soon as we've read all options */
1017  if (PostAuthDelay > 0)
1018  pg_usleep(PostAuthDelay * 1000000L);
1019 
1020  /*
1021  * Initialize various default states that can't be set up until we've
1022  * selected the active user and gotten the right GUC settings.
1023  */
1024 
1025  /* set default namespace search path */
1027 
1028  /* initialize client encoding */
1030 
1031  /* Initialize this backend's session state. */
1033 
1034  /* report this backend in the PgBackendStatus array */
1035  if (!bootstrap)
1036  pgstat_bestart();
1037 
1038  /* close the transaction we started above */
1039  if (!bootstrap)
1041 }
int errhint(const char *fmt,...)
Definition: elog.c:987
BackendId MyBackendId
Definition: globals.c:73
#define GETSTRUCT(TUP)
Definition: htup_details.h:656
struct Port * MyProcPort
Definition: globals.c:41
CAC_state canAcceptConnections
Definition: libpq-be.h:129
void SharedInvalBackendInit(bool sendOnly)
Definition: sinvaladt.c:258
#define DEBUG3
Definition: elog.h:23
Oid GetUserId(void)
Definition: miscinit.c:284
FormData_pg_database * Form_pg_database
Definition: pg_database.h:57
PGPROC * MyProc
Definition: proc.c:67
static HeapTuple GetDatabaseTuple(const char *dbname)
Definition: postinit.c:95
#define DatabaseRelationId
Definition: pg_database.h:29
void CommitTransactionCommand(void)
Definition: xact.c:2744
void InitializeSession(void)
Definition: session.c:54
void ValidatePgVersion(const char *path)
Definition: miscinit.c:1358
void RelationCacheInitializePhase2(void)
Definition: relcache.c:3576
static void PerformAuthentication(Port *port)
Definition: postinit.c:184
static void LockTimeoutHandler(void)
Definition: postinit.c:1186
int errcode(int sqlerrcode)
Definition: elog.c:575
bool superuser(void)
Definition: superuser.c:47
static void CheckMyDatabase(const char *name, bool am_superuser)
Definition: postinit.c:287
void initialize_acl(void)
Definition: acl.c:4611
bool RecoveryInProgress(void)
Definition: xlog.c:7954
Snapshot GetTransactionSnapshot(void)
Definition: snapmgr.c:304
#define OidIsValid(objectId)
Definition: c.h:532
Oid GetSessionUserId(void)
Definition: miscinit.c:318
bool HaveNFreeProcs(int n)
Definition: proc.c:646
bool IsBinaryUpgrade
Definition: globals.c:102
Oid MyDatabaseTableSpace
Definition: globals.c:79
bool IsBackgroundWorker
Definition: globals.c:103
void RelationCacheInitializePhase3(void)
Definition: relcache.c:3635
#define NAMEDATALEN
bool am_walsender
Definition: walsender.c:114
void pg_usleep(long microsec)
Definition: signal.c:53
int ReservedBackends
Definition: postmaster.c:211
#define FATAL
Definition: elog.h:52
void InitializeSearchPath(void)
Definition: namespace.c:4110
int MaxBackends
Definition: globals.c:126
#define TemplateDbOid
Definition: pg_database.h:80
void on_shmem_exit(pg_on_exit_callback function, Datum arg)
Definition: ipc.c:348
bool IsUnderPostmaster
Definition: globals.c:101
#define RowExclusiveLock
Definition: lockdefs.h:38
#define DEFAULTTABLESPACE_OID
Definition: pg_tablespace.h:63
int errdetail(const char *fmt,...)
Definition: elog.c:873
int errcode_for_file_access(void)
Definition: elog.c:598
static void IdleInTransactionSessionTimeoutHandler(void)
Definition: postinit.c:1196
void before_shmem_exit(pg_on_exit_callback function, Datum arg)
Definition: ipc.c:320
Oid databaseId
Definition: proc.h:114
void pgstat_initialize(void)
Definition: pgstat.c:2745
static bool ThereIsAtLeastOneRole(void)
Definition: postinit.c:1207
void StartupXLOG(void)
Definition: xlog.c:6274
bool IsAutoVacuumWorkerProcess(void)
Definition: autovacuum.c:3256
#define ereport(elevel, rest)
Definition: elog.h:122
void InvalidateCatalogSnapshot(void)
Definition: snapmgr.c:510
char * GetDatabasePath(Oid dbNode, Oid spcNode)
Definition: relpath.c:108
void SetDatabasePath(const char *path)
Definition: miscinit.c:83
#define WARNING
Definition: elog.h:40
void ShutdownXLOG(int code, Datum arg)
Definition: xlog.c:8405
static HeapTuple GetDatabaseTupleByOid(Oid dboid)
Definition: postinit.c:138
#define InvalidBackendId
Definition: backendid.h:23
bool am_db_walsender
Definition: walsender.c:117
Oid MyDatabaseId
Definition: globals.c:77
int PostAuthDelay
Definition: postgres.c:99
void LockSharedObject(Oid classid, Oid objid, uint16 objsubid, LOCKMODE lockmode)
Definition: lmgr.c:871
void EnablePortalManager(void)
Definition: portalmem.c:103
static void ShutdownPostgres(int code, Datum arg)
Definition: postinit.c:1147
static char * username
Definition: initdb.c:132
size_t strlcpy(char *dst, const char *src, size_t siz)
Definition: strlcpy.c:45
TimeoutId RegisterTimeout(TimeoutId id, timeout_handler_proc handler)
Definition: timeout.c:373
bool IsAutoVacuumLauncherProcess(void)
Definition: autovacuum.c:3250
#define HeapTupleIsValid(tuple)
Definition: htup.h:77
#define Assert(condition)
Definition: c.h:681
void InitializeSessionUserIdStandalone(void)
Definition: miscinit.c:579
void StartTransactionCommand(void)
Definition: xact.c:2673
#define XACT_READ_COMMITTED
Definition: xact.h:29
void InitializeSessionUserId(const char *rolename, Oid roleid)
Definition: miscinit.c:483
char * dbname
Definition: streamutil.c:42
static void process_startup_options(Port *port, bool am_superuser)
Definition: postinit.c:1048
int XactIsoLevel
Definition: xact.c:74
bool has_rolreplication(Oid roleid)
Definition: miscinit.c:465
void InitializeClientEncoding(void)
Definition: mbutils.c:282
void InitPlanCache(void)
Definition: plancache.c:116
void InitProcessPhase2(void)
Definition: proc.c:456
#define IsBootstrapProcessingMode()
Definition: miscadmin.h:367
void RelationCacheInitialize(void)
Definition: relcache.c:3539
void ProcSignalInit(int pss_idx)
Definition: procsignal.c:105
void InitCatalogCache(void)
Definition: syscache.c:998
static void StatementTimeoutHandler(void)
Definition: postinit.c:1164
void SetCurrentStatementStartTimestamp(void)
Definition: xact.c:733
int errmsg(const char *fmt,...)
Definition: elog.c:797
void pgstat_bestart(void)
Definition: pgstat.c:2785
#define NameStr(name)
Definition: c.h:493
static void process_settings(Oid databaseid, Oid roleid)
Definition: postinit.c:1113
void CheckDeadLockAlert(void)
Definition: proc.c:1752
void InitBufferPoolBackend(void)
Definition: bufmgr.c:2461
#define elog
Definition: elog.h:219
#define HeapTupleGetOid(tuple)
Definition: htup_details.h:695
void InitPostmasterChild ( void  )

Definition at line 176 of file miscinit.c.

References elog, FATAL, InitializeLatchSupport(), InitLatch(), IsUnderPostmaster, LocalLatchData, MyLatch, MyProcPid, MyStartTime, and on_exit_reset().

Referenced by BackendStartup(), do_start_bgworker(), pgarch_start(), pgstat_start(), StartAutoVacLauncher(), StartAutoVacWorker(), StartChildProcess(), and SysLogger_Start().

177 {
178  IsUnderPostmaster = true; /* we are a postmaster subprocess now */
179 
180  MyProcPid = getpid(); /* reset MyProcPid */
181 
182  MyStartTime = time(NULL); /* set our start time in case we call elog */
183 
184  /*
185  * make sure stderr is in binary mode before anything can possibly be
186  * written to it, in case it's actually the syslogger pipe, so the pipe
187  * chunking protocol isn't disturbed. Non-logpipe data gets translated on
188  * redirection (e.g. via pg_ctl -l) anyway.
189  */
190 #ifdef WIN32
191  _setmode(fileno(stderr), _O_BINARY);
192 #endif
193 
194  /* We don't want the postmaster's proc_exit() handlers */
195  on_exit_reset();
196 
197  /* Initialize process-local latch support */
201 
202  /*
203  * If possible, make this process a group leader, so that the postmaster
204  * can signal any child processes too. Not all processes will have
205  * children, but for consistency we make all postmaster child processes do
206  * this.
207  */
208 #ifdef HAVE_SETSID
209  if (setsid() < 0)
210  elog(FATAL, "setsid() failed: %m");
211 #endif
212 }
int MyProcPid
Definition: globals.c:39
pg_time_t MyStartTime
Definition: globals.c:40
void on_exit_reset(void)
Definition: ipc.c:396
static Latch LocalLatchData
Definition: miscinit.c:62
#define FATAL
Definition: elog.h:52
bool IsUnderPostmaster
Definition: globals.c:101
void InitializeLatchSupport(void)
Definition: latch.c:147
void InitLatch(volatile Latch *latch)
Definition: latch.c:220
struct Latch * MyLatch
Definition: globals.c:52
#define elog
Definition: elog.h:219
void InitStandaloneProcess ( const char *  argv0)

Definition at line 220 of file miscinit.c.

References Assert, elog, FATAL, find_my_exec(), get_pkglib_path(), InitializeLatchSupport(), InitLatch(), IsPostmasterEnvironment, LocalLatchData, my_exec_path, MyLatch, MyProcPid, MyStartTime, and pkglib_path.

Referenced by AuxiliaryProcessMain(), and PostgresMain().

221 {
223 
224  MyProcPid = getpid(); /* reset MyProcPid */
225 
226  MyStartTime = time(NULL); /* set our start time in case we call elog */
227 
228  /* Initialize process-local latch support */
232 
233  /* Compute paths, no postmaster to inherit from */
234  if (my_exec_path[0] == '\0')
235  {
236  if (find_my_exec(argv0, my_exec_path) < 0)
237  elog(FATAL, "%s: could not locate my own executable path",
238  argv0);
239  }
240 
241  if (pkglib_path[0] == '\0')
243 }
bool IsPostmasterEnvironment
Definition: globals.c:100
static char * argv0
Definition: pg_ctl.c:101
int MyProcPid
Definition: globals.c:39
pg_time_t MyStartTime
Definition: globals.c:40
void get_pkglib_path(const char *my_exec_path, char *ret_path)
Definition: path.c:758
static Latch LocalLatchData
Definition: miscinit.c:62
#define FATAL
Definition: elog.h:52
int find_my_exec(const char *argv0, char *retpath)
Definition: exec.c:119
char my_exec_path[MAXPGPATH]
Definition: globals.c:64
void InitializeLatchSupport(void)
Definition: latch.c:147
#define Assert(condition)
Definition: c.h:681
void InitLatch(volatile Latch *latch)
Definition: latch.c:220
struct Latch * MyLatch
Definition: globals.c:52
#define elog
Definition: elog.h:219
char pkglib_path[MAXPGPATH]
Definition: globals.c:65
bool InLocalUserIdChange ( void  )

Definition at line 407 of file miscinit.c.

References SECURITY_LOCAL_USERID_CHANGE, and SecurityRestrictionContext.

Referenced by GetUserIdAndContext(), is_admin_of_role(), and set_config_option().

408 {
410 }
static int SecurityRestrictionContext
Definition: miscinit.c:165
#define SECURITY_LOCAL_USERID_CHANGE
Definition: miscadmin.h:293
bool InNoForceRLSOperation ( void  )

Definition at line 425 of file miscinit.c.

References SECURITY_NOFORCE_RLS, and SecurityRestrictionContext.

Referenced by check_enable_rls().

426 {
428 }
static int SecurityRestrictionContext
Definition: miscinit.c:165
#define SECURITY_NOFORCE_RLS
Definition: miscadmin.h:295
bool InSecurityRestrictedOperation ( void  )

Definition at line 416 of file miscinit.c.

References SECURITY_RESTRICTED_OPERATION, and SecurityRestrictionContext.

Referenced by CheckRestrictedOperation(), DefineRelation(), is_admin_of_role(), set_config_option(), and SetUserIdAndContext().

417 {
419 }
#define SECURITY_RESTRICTED_OPERATION
Definition: miscadmin.h:294
static int SecurityRestrictionContext
Definition: miscinit.c:165
void pg_bindtextdomain ( const char *  domain)

Definition at line 1511 of file miscinit.c.

References get_locale_path(), MAXPGPATH, and my_exec_path.

Referenced by _PG_init().

1512 {
1513 #ifdef ENABLE_NLS
1514  if (my_exec_path[0] != '\0')
1515  {
1516  char locale_path[MAXPGPATH];
1517 
1518  get_locale_path(my_exec_path, locale_path);
1519  bindtextdomain(domain, locale_path);
1520  pg_bind_textdomain_codeset(domain);
1521  }
1522 #endif
1523 }
#define MAXPGPATH
char my_exec_path[MAXPGPATH]
Definition: globals.c:64
void get_locale_path(const char *my_exec_path, char *ret_path)
Definition: path.c:767
void pg_split_opts ( char **  argv,
int *  argcp,
const char *  optstr 
)

Definition at line 437 of file postinit.c.

References appendStringInfoChar(), StringInfoData::data, initStringInfo(), pfree(), pstrdup(), and resetStringInfo().

Referenced by BackendRun(), and process_startup_options().

438 {
439  StringInfoData s;
440 
441  initStringInfo(&s);
442 
443  while (*optstr)
444  {
445  bool last_was_escape = false;
446 
447  resetStringInfo(&s);
448 
449  /* skip over leading space */
450  while (isspace((unsigned char) *optstr))
451  optstr++;
452 
453  if (*optstr == '\0')
454  break;
455 
456  /*
457  * Parse a single option, stopping at the first space, unless it's
458  * escaped.
459  */
460  while (*optstr)
461  {
462  if (isspace((unsigned char) *optstr) && !last_was_escape)
463  break;
464 
465  if (!last_was_escape && *optstr == '\\')
466  last_was_escape = true;
467  else
468  {
469  last_was_escape = false;
470  appendStringInfoChar(&s, *optstr);
471  }
472 
473  optstr++;
474  }
475 
476  /* now store the option in the next argv[] position */
477  argv[(*argcp)++] = pstrdup(s.data);
478  }
479 
480  pfree(s.data);
481 }
char * pstrdup(const char *in)
Definition: mcxt.c:1076
void pfree(void *pointer)
Definition: mcxt.c:949
void resetStringInfo(StringInfo str)
Definition: stringinfo.c:62
void appendStringInfoChar(StringInfo str, char ch)
Definition: stringinfo.c:169
void initStringInfo(StringInfo str)
Definition: stringinfo.c:46
void PostgresSigHupHandler ( SIGNAL_ARGS  )

Definition at line 2723 of file postgres.c.

References ConfigReloadPending, MyLatch, and SetLatch().

Referenced by PostgresMain(), and WalSndSignals().

2724 {
2725  int save_errno = errno;
2726 
2727  ConfigReloadPending = true;
2728  SetLatch(MyLatch);
2729 
2730  errno = save_errno;
2731 }
volatile sig_atomic_t ConfigReloadPending
Definition: globals.c:34
void SetLatch(volatile Latch *latch)
Definition: latch.c:414
struct Latch * MyLatch
Definition: globals.c:52
void PreventCommandDuringRecovery ( const char *  cmdname)

Definition at line 273 of file utility.c.

References ereport, errcode(), errmsg(), ERROR, and RecoveryInProgress().

Referenced by LockTableCommand(), pg_notify(), standard_ProcessUtility(), and txid_current().

274 {
275  if (RecoveryInProgress())
276  ereport(ERROR,
277  (errcode(ERRCODE_READ_ONLY_SQL_TRANSACTION),
278  /* translator: %s is name of a SQL command, eg CREATE */
279  errmsg("cannot execute %s during recovery",
280  cmdname)));
281 }
int errcode(int sqlerrcode)
Definition: elog.c:575
bool RecoveryInProgress(void)
Definition: xlog.c:7954
#define ERROR
Definition: elog.h:43
#define ereport(elevel, rest)
Definition: elog.h:122
int errmsg(const char *fmt,...)
Definition: elog.c:797
void PreventCommandIfParallelMode ( const char *  cmdname)

Definition at line 254 of file utility.c.

References ereport, errcode(), errmsg(), ERROR, and IsInParallelMode().

Referenced by _SPI_execute_plan(), check_xact_readonly(), do_setval(), DoCopy(), ExecCheckXactReadOnly(), init_execution_state(), nextval_internal(), and SPI_cursor_open_internal().

255 {
256  if (IsInParallelMode())
257  ereport(ERROR,
258  (errcode(ERRCODE_INVALID_TRANSACTION_STATE),
259  /* translator: %s is name of a SQL command, eg CREATE */
260  errmsg("cannot execute %s during a parallel operation",
261  cmdname)));
262 }
int errcode(int sqlerrcode)
Definition: elog.c:575
bool IsInParallelMode(void)
Definition: xact.c:906
#define ERROR
Definition: elog.h:43
#define ereport(elevel, rest)
Definition: elog.h:122
int errmsg(const char *fmt,...)
Definition: elog.c:797
void PreventCommandIfReadOnly ( const char *  cmdname)

Definition at line 236 of file utility.c.

References ereport, errcode(), errmsg(), ERROR, and XactReadOnly.

Referenced by check_xact_readonly(), do_setval(), DoCopy(), ExecCheckXactReadOnly(), and nextval_internal().

237 {
238  if (XactReadOnly)
239  ereport(ERROR,
240  (errcode(ERRCODE_READ_ONLY_SQL_TRANSACTION),
241  /* translator: %s is name of a SQL command, eg CREATE */
242  errmsg("cannot execute %s in a read-only transaction",
243  cmdname)));
244 }
int errcode(int sqlerrcode)
Definition: elog.c:575
#define ERROR
Definition: elog.h:43
#define ereport(elevel, rest)
Definition: elog.h:122
bool XactReadOnly
Definition: xact.c:77
int errmsg(const char *fmt,...)
Definition: elog.c:797
void process_session_preload_libraries ( void  )

Definition at line 1500 of file miscinit.c.

References load_libraries(), local_preload_libraries_string, and session_preload_libraries_string.

Referenced by PostgresMain().

1501 {
1503  "session_preload_libraries",
1504  false);
1506  "local_preload_libraries",
1507  true);
1508 }
static void load_libraries(const char *libraries, const char *gucname, bool restricted)
Definition: miscinit.c:1435
char * local_preload_libraries_string
Definition: miscinit.c:1423
char * session_preload_libraries_string
Definition: miscinit.c:1421
void process_shared_preload_libraries ( void  )

Definition at line 1487 of file miscinit.c.

References load_libraries(), process_shared_preload_libraries_in_progress, and shared_preload_libraries_string.

Referenced by PostmasterMain().

1488 {
1491  "shared_preload_libraries",
1492  false);
1494 }
bool process_shared_preload_libraries_in_progress
Definition: miscinit.c:1426
char * shared_preload_libraries_string
Definition: miscinit.c:1422
static void load_libraries(const char *libraries, const char *gucname, bool restricted)
Definition: miscinit.c:1435
void ProcessInterrupts ( void  )

Definition at line 2860 of file postgres.c.

References Assert, ClientAuthInProgress, ClientConnectionLost, CritSectionCount, DEBUG1, DestNone, DestRemote, DoingCommandRead, ereport, errcode(), errdetail_recovery_conflict(), errhint(), errmsg(), ERROR, FATAL, get_timeout_finish_time(), get_timeout_indicator(), HandleParallelMessages(), IdleInTransactionSessionTimeout, IdleInTransactionSessionTimeoutPending, InterruptHoldoffCount, InterruptPending, IsAutoVacuumWorkerProcess(), IsLogicalLauncher(), IsLogicalWorker(), LOCK_TIMEOUT, LockErrorCleanup(), ParallelMessagePending, pgstat_report_recovery_conflict(), proc_exit(), ProcDiePending, PROCSIG_RECOVERY_CONFLICT_DATABASE, QueryCancelHoldoffCount, QueryCancelPending, RecoveryConflictPending, RecoveryConflictReason, RecoveryConflictRetryable, STATEMENT_TIMEOUT, and whereToSendOutput.

Referenced by die().

2861 {
2862  /* OK to accept any interrupts now? */
2863  if (InterruptHoldoffCount != 0 || CritSectionCount != 0)
2864  return;
2865  InterruptPending = false;
2866 
2867  if (ProcDiePending)
2868  {
2869  ProcDiePending = false;
2870  QueryCancelPending = false; /* ProcDie trumps QueryCancel */
2871  LockErrorCleanup();
2872  /* As in quickdie, don't risk sending to client during auth */
2876  ereport(FATAL,
2877  (errcode(ERRCODE_QUERY_CANCELED),
2878  errmsg("canceling authentication due to timeout")));
2879  else if (IsAutoVacuumWorkerProcess())
2880  ereport(FATAL,
2881  (errcode(ERRCODE_ADMIN_SHUTDOWN),
2882  errmsg("terminating autovacuum process due to administrator command")));
2883  else if (IsLogicalWorker())
2884  ereport(FATAL,
2885  (errcode(ERRCODE_ADMIN_SHUTDOWN),
2886  errmsg("terminating logical replication worker due to administrator command")));
2887  else if (IsLogicalLauncher())
2888  {
2889  ereport(DEBUG1,
2890  (errmsg("logical replication launcher shutting down")));
2891 
2892  /*
2893  * The logical replication launcher can be stopped at any time.
2894  * Use exit status 1 so the background worker is restarted.
2895  */
2896  proc_exit(1);
2897  }
2899  {
2901  ereport(FATAL,
2902  (errcode(ERRCODE_T_R_SERIALIZATION_FAILURE),
2903  errmsg("terminating connection due to conflict with recovery"),
2905  }
2906  else if (RecoveryConflictPending)
2907  {
2908  /* Currently there is only one non-retryable recovery conflict */
2911  ereport(FATAL,
2912  (errcode(ERRCODE_DATABASE_DROPPED),
2913  errmsg("terminating connection due to conflict with recovery"),
2915  }
2916  else
2917  ereport(FATAL,
2918  (errcode(ERRCODE_ADMIN_SHUTDOWN),
2919  errmsg("terminating connection due to administrator command")));
2920  }
2922  {
2923  QueryCancelPending = false; /* lost connection trumps QueryCancel */
2924  LockErrorCleanup();
2925  /* don't send to client, we already know the connection to be dead. */
2927  ereport(FATAL,
2928  (errcode(ERRCODE_CONNECTION_FAILURE),
2929  errmsg("connection to client lost")));
2930  }
2931 
2932  /*
2933  * If a recovery conflict happens while we are waiting for input from the
2934  * client, the client is presumably just sitting idle in a transaction,
2935  * preventing recovery from making progress. Terminate the connection to
2936  * dislodge it.
2937  */
2939  {
2940  QueryCancelPending = false; /* this trumps QueryCancel */
2941  RecoveryConflictPending = false;
2942  LockErrorCleanup();
2944  ereport(FATAL,
2945  (errcode(ERRCODE_T_R_SERIALIZATION_FAILURE),
2946  errmsg("terminating connection due to conflict with recovery"),
2948  errhint("In a moment you should be able to reconnect to the"
2949  " database and repeat your command.")));
2950  }
2951 
2952  /*
2953  * Don't allow query cancel interrupts while reading input from the
2954  * client, because we might lose sync in the FE/BE protocol. (Die
2955  * interrupts are OK, because we won't read any further messages from
2956  * the client in that case.)
2957  */
2959  {
2960  /*
2961  * Re-arm InterruptPending so that we process the cancel request
2962  * as soon as we're done reading the message.
2963  */
2964  InterruptPending = true;
2965  }
2966  else if (QueryCancelPending)
2967  {
2968  bool lock_timeout_occurred;
2969  bool stmt_timeout_occurred;
2970 
2971  QueryCancelPending = false;
2972 
2973  /*
2974  * If LOCK_TIMEOUT and STATEMENT_TIMEOUT indicators are both set, we
2975  * need to clear both, so always fetch both.
2976  */
2977  lock_timeout_occurred = get_timeout_indicator(LOCK_TIMEOUT, true);
2978  stmt_timeout_occurred = get_timeout_indicator(STATEMENT_TIMEOUT, true);
2979 
2980  /*
2981  * If both were set, we want to report whichever timeout completed
2982  * earlier; this ensures consistent behavior if the machine is slow
2983  * enough that the second timeout triggers before we get here. A tie
2984  * is arbitrarily broken in favor of reporting a lock timeout.
2985  */
2986  if (lock_timeout_occurred && stmt_timeout_occurred &&
2988  lock_timeout_occurred = false; /* report stmt timeout */
2989 
2990  if (lock_timeout_occurred)
2991  {
2992  LockErrorCleanup();
2993  ereport(ERROR,
2994  (errcode(ERRCODE_LOCK_NOT_AVAILABLE),
2995  errmsg("canceling statement due to lock timeout")));
2996  }
2997  if (stmt_timeout_occurred)
2998  {
2999  LockErrorCleanup();
3000  ereport(ERROR,
3001  (errcode(ERRCODE_QUERY_CANCELED),
3002  errmsg("canceling statement due to statement timeout")));
3003  }
3005  {
3006  LockErrorCleanup();
3007  ereport(ERROR,
3008  (errcode(ERRCODE_QUERY_CANCELED),
3009  errmsg("canceling autovacuum task")));
3010  }
3012  {
3013  RecoveryConflictPending = false;
3014  LockErrorCleanup();
3016  ereport(ERROR,
3017  (errcode(ERRCODE_T_R_SERIALIZATION_FAILURE),
3018  errmsg("canceling statement due to conflict with recovery"),
3020  }
3021 
3022  /*
3023  * If we are reading a command from the client, just ignore the cancel
3024  * request --- sending an extra error message won't accomplish
3025  * anything. Otherwise, go ahead and throw the error.
3026  */
3027  if (!DoingCommandRead)
3028  {
3029  LockErrorCleanup();
3030  ereport(ERROR,
3031  (errcode(ERRCODE_QUERY_CANCELED),
3032  errmsg("canceling statement due to user request")));
3033  }
3034  }
3035 
3037  {
3038  /* Has the timeout setting changed since last we looked? */
3040  ereport(FATAL,
3041  (errcode(ERRCODE_IDLE_IN_TRANSACTION_SESSION_TIMEOUT),
3042  errmsg("terminating connection due to idle-in-transaction timeout")));
3043  else
3045 
3046  }
3047 
3050 }
volatile uint32 InterruptHoldoffCount
Definition: globals.c:35
TimestampTz get_timeout_finish_time(TimeoutId id)
Definition: timeout.c:667
#define DEBUG1
Definition: elog.h:25
int errhint(const char *fmt,...)
Definition: elog.c:987
void pgstat_report_recovery_conflict(int reason)
Definition: pgstat.c:1486
volatile bool IdleInTransactionSessionTimeoutPending
Definition: globals.c:33
volatile uint32 QueryCancelHoldoffCount
Definition: globals.c:36
void proc_exit(int code)
Definition: ipc.c:99
int errcode(int sqlerrcode)
Definition: elog.c:575
volatile bool QueryCancelPending
Definition: globals.c:30
bool IsLogicalWorker(void)
Definition: worker.c:1656
volatile bool ClientConnectionLost
Definition: globals.c:32
volatile bool ParallelMessagePending
Definition: parallel.c:101
bool ClientAuthInProgress
Definition: postmaster.c:349
#define ERROR
Definition: elog.h:43
int IdleInTransactionSessionTimeout
Definition: proc.c:63
#define FATAL
Definition: elog.h:52
void HandleParallelMessages(void)
Definition: parallel.c:722
Definition: dest.h:88
volatile uint32 CritSectionCount
Definition: globals.c:37
bool IsAutoVacuumWorkerProcess(void)
Definition: autovacuum.c:3256
#define ereport(elevel, rest)
Definition: elog.h:122
void LockErrorCleanup(void)
Definition: proc.c:686
static ProcSignalReason RecoveryConflictReason
Definition: postgres.c:166
static bool RecoveryConflictPending
Definition: postgres.c:164
static bool RecoveryConflictRetryable
Definition: postgres.c:165
bool get_timeout_indicator(TimeoutId id, bool reset_indicator)
Definition: timeout.c:633
static int errdetail_recovery_conflict(void)
Definition: postgres.c:2283
volatile bool InterruptPending
Definition: globals.c:29
#define Assert(condition)
Definition: c.h:681
static bool DoingCommandRead
Definition: postgres.c:137
volatile bool ProcDiePending
Definition: globals.c:31
int errmsg(const char *fmt,...)
Definition: elog.c:797
bool IsLogicalLauncher(void)
Definition: launcher.c:1005
CommandDest whereToSendOutput
Definition: postgres.c:88
bool RecheckDataDirLockFile ( void  )

Definition at line 1286 of file miscinit.c.

References buffer, close, DIRECTORY_LOCK_FILE, ereport, errcode_for_file_access(), errmsg(), fd(), LOG, PG_BINARY, pgstat_report_wait_end(), pgstat_report_wait_start(), read, and WAIT_EVENT_LOCK_FILE_RECHECKDATADIR_READ.

Referenced by ServerLoop().

1287 {
1288  int fd;
1289  int len;
1290  long file_pid;
1291  char buffer[BLCKSZ];
1292 
1293  fd = open(DIRECTORY_LOCK_FILE, O_RDWR | PG_BINARY, 0);
1294  if (fd < 0)
1295  {
1296  /*
1297  * There are many foreseeable false-positive error conditions. For
1298  * safety, fail only on enumerated clearly-something-is-wrong
1299  * conditions.
1300  */
1301  switch (errno)
1302  {
1303  case ENOENT:
1304  case ENOTDIR:
1305  /* disaster */
1306  ereport(LOG,
1308  errmsg("could not open file \"%s\": %m",
1310  return false;
1311  default:
1312  /* non-fatal, at least for now */
1313  ereport(LOG,
1315  errmsg("could not open file \"%s\": %m; continuing anyway",
1317  return true;
1318  }
1319  }
1321  len = read(fd, buffer, sizeof(buffer) - 1);
1323  if (len < 0)
1324  {
1325  ereport(LOG,
1327  errmsg("could not read from file \"%s\": %m",
1329  close(fd);
1330  return true; /* treat read failure as nonfatal */
1331  }
1332  buffer[len] = '\0';
1333  close(fd);
1334  file_pid = atol(buffer);
1335  if (file_pid == getpid())
1336  return true; /* all is well */
1337 
1338  /* Trouble: someone's overwritten the lock file */
1339  ereport(LOG,
1340  (errmsg("lock file \"%s\" contains wrong PID: %ld instead of %ld",
1341  DIRECTORY_LOCK_FILE, file_pid, (long) getpid())));
1342  return false;
1343 }
#define DIRECTORY_LOCK_FILE
Definition: miscinit.c:55
#define LOG
Definition: elog.h:26
static int fd(const char *x, int i)
Definition: preproc-init.c:105
#define PG_BINARY
Definition: c.h:1044
int errcode_for_file_access(void)
Definition: elog.c:598
static void pgstat_report_wait_end(void)
Definition: pgstat.h:1244
#define ereport(elevel, rest)
Definition: elog.h:122
WalTimeSample buffer[LAG_TRACKER_BUFFER_SIZE]
Definition: walsender.c:214
static void pgstat_report_wait_start(uint32 wait_event_info)
Definition: pgstat.h:1220
int errmsg(const char *fmt,...)
Definition: elog.c:797
#define close(a)
Definition: win32.h:12
#define read(a, b, c)
Definition: win32.h:13
void restore_stack_base ( pg_stack_base_t  base)

Definition at line 3128 of file postgres.c.

References stack_base_ptr.

3129 {
3130 #if defined(__ia64__) || defined(__ia64)
3131  stack_base_ptr = base.stack_base_ptr;
3132  register_stack_base_ptr = base.register_stack_base_ptr;
3133 #else
3134  stack_base_ptr = base;
3135 #endif
3136 }
char * stack_base_ptr
Definition: postgres.c:117
pg_stack_base_t set_stack_base ( void  )

Definition at line 3097 of file postgres.c.

References stack_base_ptr.

Referenced by PostmasterMain().

3098 {
3099  char stack_base;
3100  pg_stack_base_t old;
3101 
3102 #if defined(__ia64__) || defined(__ia64)
3103  old.stack_base_ptr = stack_base_ptr;
3104  old.register_stack_base_ptr = register_stack_base_ptr;
3105 #else
3106  old = stack_base_ptr;
3107 #endif
3108 
3109  /* Set up reference point for stack depth checking */
3110  stack_base_ptr = &stack_base;
3111 #if defined(__ia64__) || defined(__ia64)
3112  register_stack_base_ptr = ia64_get_bsp();
3113 #endif
3114 
3115  return old;
3116 }
char * stack_base_ptr
Definition: postgres.c:117
char * pg_stack_base_t
Definition: miscadmin.h:268
void SetCurrentRoleId ( Oid  roleid,
bool  is_superuser 
)

Definition at line 657 of file miscinit.c.

References OidIsValid, PGC_INTERNAL, PGC_S_OVERRIDE, SessionUserId, SessionUserIsSuperuser, SetConfigOption(), SetOuterUserId(), and SetRoleIsActive.

Referenced by assign_role().

658 {
659  /*
660  * Get correct info if it's SET ROLE NONE
661  *
662  * If SessionUserId hasn't been set yet, just do nothing --- the eventual
663  * SetSessionUserId call will fix everything. This is needed since we
664  * will get called during GUC initialization.
665  */
666  if (!OidIsValid(roleid))
667  {
669  return;
670 
671  roleid = SessionUserId;
673 
674  SetRoleIsActive = false;
675  }
676  else
677  SetRoleIsActive = true;
678 
679  SetOuterUserId(roleid);
680 
681  SetConfigOption("is_superuser",
682  is_superuser ? "on" : "off",
684 }
static Oid SessionUserId
Definition: miscinit.c:157
static void SetOuterUserId(Oid userid)
Definition: miscinit.c:303
#define OidIsValid(objectId)
Definition: c.h:532
void SetConfigOption(const char *name, const char *value, GucContext context, GucSource source)
Definition: guc.c:6681
static bool SetRoleIsActive
Definition: miscinit.c:168
static bool SessionUserIsSuperuser
Definition: miscinit.c:163
static bool is_superuser(Archive *fout)
Definition: pg_dump.c:3748
void SetDatabasePath ( const char *  path)

Definition at line 83 of file miscinit.c.

References Assert, DatabasePath, MemoryContextStrdup(), and TopMemoryContext.

Referenced by InitPostgres().

84 {
85  /* This should happen only once per process */
88 }
MemoryContext TopMemoryContext
Definition: mcxt.c:43
char * DatabasePath
Definition: globals.c:85
#define Assert(condition)
Definition: c.h:681
char * MemoryContextStrdup(MemoryContext context, const char *string)
Definition: mcxt.c:1063
void SetDataDir ( const char *  dir)

Definition at line 95 of file miscinit.c.

References AssertArg, DataDir, free, and make_absolute_path().

Referenced by SelectConfigFiles().

96 {
97  char *new;
98 
99  AssertArg(dir);
100 
101  /* If presented path is relative, convert to absolute */
102  new = make_absolute_path(dir);
103 
104  if (DataDir)
105  free(DataDir);
106  DataDir = new;
107 }
char * make_absolute_path(const char *path)
Definition: path.c:608
#define AssertArg(condition)
Definition: c.h:683
#define free(a)
Definition: header.h:65
char * DataDir
Definition: globals.c:60
void SetSessionAuthorization ( Oid  userid,
bool  is_superuser 
)

Definition at line 611 of file miscinit.c.

References AssertState, AuthenticatedUserId, AuthenticatedUserIsSuperuser, ereport, errcode(), errmsg(), ERROR, OidIsValid, PGC_INTERNAL, PGC_S_OVERRIDE, SetConfigOption(), and SetSessionUserId().

Referenced by assign_session_authorization().

612 {
613  /* Must have authenticated already, else can't make permission check */
615 
616  if (userid != AuthenticatedUserId &&
618  ereport(ERROR,
619  (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
620  errmsg("permission denied to set session authorization")));
621 
623 
624  SetConfigOption("is_superuser",
625  is_superuser ? "on" : "off",
627 }
#define AssertState(condition)
Definition: c.h:684
int errcode(int sqlerrcode)
Definition: elog.c:575
#define OidIsValid(objectId)
Definition: c.h:532
#define ERROR
Definition: elog.h:43
void SetConfigOption(const char *name, const char *value, GucContext context, GucSource source)
Definition: guc.c:6681
static bool AuthenticatedUserIsSuperuser
Definition: miscinit.c:162
#define ereport(elevel, rest)
Definition: elog.h:122
static bool is_superuser(Archive *fout)
Definition: pg_dump.c:3748
int errmsg(const char *fmt,...)
Definition: elog.c:797
static void SetSessionUserId(Oid userid, bool is_superuser)
Definition: miscinit.c:326
static Oid AuthenticatedUserId
Definition: miscinit.c:156
void SetUserIdAndContext ( Oid  userid,
bool  sec_def_context 
)

Definition at line 445 of file miscinit.c.

References CurrentUserId, ereport, errcode(), errmsg(), ERROR, InSecurityRestrictedOperation(), SECURITY_LOCAL_USERID_CHANGE, and SecurityRestrictionContext.

446 {
447  /* We throw the same error SET ROLE would. */
449  ereport(ERROR,
450  (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
451  errmsg("cannot set parameter \"%s\" within security-restricted operation",
452  "role")));
453  CurrentUserId = userid;
454  if (sec_def_context)
456  else
458 }
int errcode(int sqlerrcode)
Definition: elog.c:575
#define ERROR
Definition: elog.h:43
static int SecurityRestrictionContext
Definition: miscinit.c:165
#define ereport(elevel, rest)
Definition: elog.h:122
#define SECURITY_LOCAL_USERID_CHANGE
Definition: miscadmin.h:293
static Oid CurrentUserId
Definition: miscinit.c:159
bool InSecurityRestrictedOperation(void)
Definition: miscinit.c:416
int errmsg(const char *fmt,...)
Definition: elog.c:797
void SetUserIdAndSecContext ( Oid  userid,
int  sec_context 
)
bool stack_is_too_deep ( void  )

Definition at line 3164 of file postgres.c.

References max_stack_depth_bytes, and stack_base_ptr.

Referenced by check_stack_depth(), and rstacktoodeep().

3165 {
3166  char stack_top_loc;
3167  long stack_depth;
3168 
3169  /*
3170  * Compute distance from reference point to my local variables
3171  */
3172  stack_depth = (long) (stack_base_ptr - &stack_top_loc);
3173 
3174  /*
3175  * Take abs value, since stacks grow up on some machines, down on others
3176  */
3177  if (stack_depth < 0)
3178  stack_depth = -stack_depth;
3179 
3180  /*
3181  * Trouble?
3182  *
3183  * The test on stack_base_ptr prevents us from erroring out if called
3184  * during process setup or in a non-backend process. Logically it should
3185  * be done first, but putting it here avoids wasting cycles during normal
3186  * cases.
3187  */
3188  if (stack_depth > max_stack_depth_bytes &&
3189  stack_base_ptr != NULL)
3190  return true;
3191 
3192  /*
3193  * On IA64 there is a separate "register" stack that requires its own
3194  * independent check. For this, we have to measure the change in the
3195  * "BSP" pointer from PostgresMain to here. Logic is just as above,
3196  * except that we know IA64's register stack grows up.
3197  *
3198  * Note we assume that the same max_stack_depth applies to both stacks.
3199  */
3200 #if defined(__ia64__) || defined(__ia64)
3201  stack_depth = (long) (ia64_get_bsp() - register_stack_base_ptr);
3202 
3203  if (stack_depth > max_stack_depth_bytes &&
3204  register_stack_base_ptr != NULL)
3205  return true;
3206 #endif /* IA64 */
3207 
3208  return false;
3209 }
static long max_stack_depth_bytes
Definition: postgres.c:109
char * stack_base_ptr
Definition: postgres.c:117
bool superuser ( void  )

Definition at line 47 of file superuser.c.

References GetUserId(), and superuser_arg().

Referenced by AddRoleMems(), AlterForeignDataWrapper(), AlterForeignDataWrapperOwner_internal(), AlterForeignServerOwner_internal(), AlterFunction(), AlterObjectNamespace_internal(), AlterObjectOwner_internal(), AlterObjectRename_internal(), AlterOpFamily(), AlterPublicationOwner_internal(), AlterRole(), AlterRoleSet(), AlterSystemSetConfigFile(), AlterTypeOwner(), ATExecChangeOwner(), be_lo_export(), brin_metapage_info(), brin_page_items(), brin_page_type(), brin_revmap_data(), bt_metap(), bt_page_items(), bt_page_items_bytea(), bt_page_stats(), check_conn_params(), check_encoding_locale_matches(), check_permissions(), connect_pg_server(), CreateAccessMethod(), CreateCast(), CreateEventTrigger(), CreateForeignDataWrapper(), CreateFunction(), CreateProceduralLanguage(), CreatePublication(), CreateRole(), CreateSubscription(), CreateTableSpace(), dblink_connstr_check(), dblink_security_check(), DefineAggregate(), DefineOpClass(), DefineOpFamily(), DefineTSParser(), DefineTSTemplate(), DefineType(), DelRoleMems(), DoCopy(), DropRole(), dummy_object_relabel(), EnableDisableTrigger(), ExecSetVariableStmt(), execute_extension_script(), ExecuteDoStmt(), file_fdw_validator(), fmgr_security_definer(), fsm_page_contents(), get_raw_page_internal(), GetConfigOptionByNum(), gin_leafpage_items(), gin_metapage_info(), gin_page_opaque_info(), GUCArrayReset(), hash_bitmap_info(), hash_metapage_info(), hash_page_items(), hash_page_stats(), hash_page_type(), have_createdb_privilege(), heap_page_items(), InitPostgres(), lo_import_internal(), main(), page_checksum(), page_header(), pg_import_system_collations(), pg_logdir_ls(), pg_ls_dir(), pg_read_binary_file(), pg_read_file(), pg_relpages(), pg_relpagesbyid(), pg_signal_backend(), pg_stat_file(), pg_stat_get_wal_senders(), pgstat_get_backend_current_activity(), pgstatginindex(), pgstatindex(), pgstatindexbyid(), pgstattuple(), pgstattuple_approx(), pgstattuplebyid(), ProcedureCreate(), regress_putenv(), RemoveAccessMethodById(), RenameRole(), replorigin_check_prerequisites(), requireSuperuser(), sepgsql_restorecon(), set_config_by_name(), SetPGVariable(), ShowAllGUCConfig(), standard_ProcessUtility(), tuple_data_split(), validate_option_array_item(), and wait_pid().

48 {
49  return superuser_arg(GetUserId());
50 }
Oid GetUserId(void)
Definition: miscinit.c:284
bool superuser_arg(Oid roleid)
Definition: superuser.c:57
bool superuser_arg ( Oid  roleid)

Definition at line 57 of file superuser.c.

References AUTHOID, BOOTSTRAP_SUPERUSERID, CacheRegisterSyscacheCallback(), GETSTRUCT, HeapTupleIsValid, IsUnderPostmaster, last_roleid, last_roleid_is_super, ObjectIdGetDatum, OidIsValid, ReleaseSysCache(), roleid_callback_registered, RoleidCallback(), and SearchSysCache1().

Referenced by AddRoleMems(), AlterEventTriggerOwner_internal(), AlterForeignDataWrapperOwner_internal(), AlterPublicationOwner_internal(), AlterSubscriptionOwner_internal(), check_object_ownership(), DelRoleMems(), has_bypassrls_privilege(), has_createrole_privilege(), has_privs_of_role(), is_admin_of_role(), is_member_of_role(), LockGXact(), pg_class_aclmask(), pg_class_ownercheck(), pg_collation_ownercheck(), pg_conversion_ownercheck(), pg_database_aclmask(), pg_database_ownercheck(), pg_event_trigger_ownercheck(), pg_extension_ownercheck(), pg_foreign_data_wrapper_aclmask(), pg_foreign_data_wrapper_ownercheck(), pg_foreign_server_aclmask(), pg_foreign_server_ownercheck(), pg_language_aclmask(), pg_language_ownercheck(), pg_largeobject_aclmask_snapshot(), pg_largeobject_ownercheck(), pg_namespace_aclmask(), pg_namespace_ownercheck(), pg_opclass_ownercheck(), pg_oper_ownercheck(), pg_opfamily_ownercheck(), pg_proc_aclmask(), pg_proc_ownercheck(), pg_publication_ownercheck(), pg_signal_backend(), pg_statistics_object_ownercheck(), pg_subscription_ownercheck(), pg_tablespace_aclmask(), pg_tablespace_ownercheck(), pg_ts_config_ownercheck(), pg_ts_dict_ownercheck(), pg_type_aclmask(), pg_type_ownercheck(), select_best_grantor(), and superuser().

58 {
59  bool result;
60  HeapTuple rtup;
61 
62  /* Quick out for cache hit */
63  if (OidIsValid(last_roleid) && last_roleid == roleid)
64  return last_roleid_is_super;
65 
66  /* Special escape path in case you deleted all your users. */
67  if (!IsUnderPostmaster && roleid == BOOTSTRAP_SUPERUSERID)
68  return true;
69 
70  /* OK, look up the information in pg_authid */
71  rtup = SearchSysCache1(AUTHOID, ObjectIdGetDatum(roleid));
72  if (HeapTupleIsValid(rtup))
73  {
74  result = ((Form_pg_authid) GETSTRUCT(rtup))->rolsuper;
75  ReleaseSysCache(rtup);
76  }
77  else
78  {
79  /* Report "not superuser" for invalid roleids */
80  result = false;
81  }
82 
83  /* If first time through, set up callback for cache flushes */
85  {
88  (Datum) 0);
90  }
91 
92  /* Cache the result for next time */
93  last_roleid = roleid;
94  last_roleid_is_super = result;
95 
96  return result;
97 }
static Oid last_roleid
Definition: superuser.c:36
#define GETSTRUCT(TUP)
Definition: htup_details.h:656
#define OidIsValid(objectId)
Definition: c.h:532
static void RoleidCallback(Datum arg, int cacheid, uint32 hashvalue)
Definition: superuser.c:104
FormData_pg_authid * Form_pg_authid
Definition: pg_authid.h:72
static bool last_roleid_is_super
Definition: superuser.c:37
#define ObjectIdGetDatum(X)
Definition: postgres.h:513
bool IsUnderPostmaster
Definition: globals.c:101
HeapTuple SearchSysCache1(int cacheId, Datum key1)
Definition: syscache.c:1112
void CacheRegisterSyscacheCallback(int cacheid, SyscacheCallbackFunction func, Datum arg)
Definition: inval.c:1389
uintptr_t Datum
Definition: postgres.h:372
void ReleaseSysCache(HeapTuple tuple)
Definition: syscache.c:1160
#define HeapTupleIsValid(tuple)
Definition: htup.h:77
#define BOOTSTRAP_SUPERUSERID
Definition: pg_authid.h:102
static bool roleid_callback_registered
Definition: superuser.c:38
void SwitchBackToLocalLatch ( void  )

Definition at line 265 of file miscinit.c.

References Assert, FeBeWaitSet, LocalLatchData, ModifyWaitEvent(), MyLatch, MyProc, PGPROC::procLatch, SetLatch(), and WL_LATCH_SET.

Referenced by AuxiliaryProcKill(), and ProcKill().

266 {
268  Assert(MyProc != NULL && MyLatch == &MyProc->procLatch);
269 
271 
272  if (FeBeWaitSet)
274 
275  SetLatch(MyLatch);
276 }
PGPROC * MyProc
Definition: proc.c:67
void ModifyWaitEvent(WaitEventSet *set, int pos, uint32 events, Latch *latch)
Definition: latch.c:736
WaitEventSet * FeBeWaitSet
Definition: pqcomm.c:186
Latch procLatch
Definition: proc.h:104
static Latch LocalLatchData
Definition: miscinit.c:62
void SetLatch(volatile Latch *latch)
Definition: latch.c:414
#define Assert(condition)
Definition: c.h:681
struct Latch * MyLatch
Definition: globals.c:52
#define WL_LATCH_SET
Definition: latch.h:124
void SwitchToSharedLatch ( void  )

Definition at line 246 of file miscinit.c.

References Assert, FeBeWaitSet, ModifyWaitEvent(), MyLatch, MyProc, PGPROC::procLatch, SetLatch(), and WL_LATCH_SET.

Referenced by InitAuxiliaryProcess(), and InitProcess().

247 {
249  Assert(MyProc != NULL);
250 
252 
253  if (FeBeWaitSet)
255 
256  /*
257  * Set the shared latch as the local one might have been set. This
258  * shouldn't normally be necessary as code is supposed to check the
259  * condition before waiting for the latch, but a bit care can't hurt.
260  */
261  SetLatch(MyLatch);
262 }
PGPROC * MyProc
Definition: proc.c:67
void ModifyWaitEvent(WaitEventSet *set, int pos, uint32 events, Latch *latch)
Definition: latch.c:736
WaitEventSet * FeBeWaitSet
Definition: pqcomm.c:186
Latch procLatch
Definition: proc.h:104
static Latch LocalLatchData
Definition: miscinit.c:62
void SetLatch(volatile Latch *latch)
Definition: latch.c:414
#define Assert(condition)
Definition: c.h:681
struct Latch * MyLatch
Definition: globals.c:52
#define WL_LATCH_SET
Definition: latch.h:124
void TouchSocketLockFiles ( void  )

Definition at line 1108 of file miscinit.c.

References buffer, close, DIRECTORY_LOCK_FILE, fd(), lfirst, PG_BINARY, and read.

Referenced by ServerLoop().

1109 {
1110  ListCell *l;
1111 
1112  foreach(l, lock_files)
1113  {
1114  char *socketLockFile = (char *) lfirst(l);
1115 
1116  /* No need to touch the data directory lock file, we trust */
1117  if (strcmp(socketLockFile, DIRECTORY_LOCK_FILE) == 0)
1118  continue;
1119 
1120  /*
1121  * utime() is POSIX standard, utimes() is a common alternative; if we
1122  * have neither, fall back to actually reading the file (which only
1123  * sets the access time not mod time, but that should be enough in
1124  * most cases). In all paths, we ignore errors.
1125  */
1126 #ifdef HAVE_UTIME
1127  utime(socketLockFile, NULL);
1128 #else /* !HAVE_UTIME */
1129 #ifdef HAVE_UTIMES
1130  utimes(socketLockFile, NULL);
1131 #else /* !HAVE_UTIMES */
1132  int fd;
1133  char buffer[1];
1134 
1135  fd = open(socketLockFile, O_RDONLY | PG_BINARY, 0);
1136  if (fd >= 0)
1137  {
1138  read(fd, buffer, sizeof(buffer));
1139  close(fd);
1140  }
1141 #endif /* HAVE_UTIMES */
1142 #endif /* HAVE_UTIME */
1143  }
1144 }
static List * lock_files
Definition: miscinit.c:60
#define DIRECTORY_LOCK_FILE
Definition: miscinit.c:55
static int fd(const char *x, int i)
Definition: preproc-init.c:105
#define PG_BINARY
Definition: c.h:1044
#define lfirst(lc)
Definition: pg_list.h:106
WalTimeSample buffer[LAG_TRACKER_BUFFER_SIZE]
Definition: walsender.c:214
#define close(a)
Definition: win32.h:12
#define read(a, b, c)
Definition: win32.h:13
int trace_recovery ( int  trace_level)
void ValidatePgVersion ( const char *  path)

Definition at line 1358 of file miscinit.c.

References AllocateFile(), ereport, errcode(), errcode_for_file_access(), errdetail(), errhint(), errmsg(), FATAL, FreeFile(), MAXPGPATH, and snprintf().

Referenced by AuxiliaryProcessMain(), checkDataDir(), InitPostgres(), and PostgresMain().

1359 {
1360  char full_path[MAXPGPATH];
1361  FILE *file;
1362  int ret;
1363  long file_major;
1364  long my_major;
1365  char *endptr;
1366  char file_version_string[64];
1367  const char *my_version_string = PG_VERSION;
1368 
1369  my_major = strtol(my_version_string, &endptr, 10);
1370 
1371  snprintf(full_path, sizeof(full_path), "%s/PG_VERSION", path);
1372 
1373  file = AllocateFile(full_path, "r");
1374  if (!file)
1375  {
1376  if (errno == ENOENT)
1377  ereport(FATAL,
1378  (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
1379  errmsg("\"%s\" is not a valid data directory",
1380  path),
1381  errdetail("File \"%s\" is missing.", full_path)));
1382  else
1383  ereport(FATAL,
1385  errmsg("could not open file \"%s\": %m", full_path)));
1386  }
1387 
1388  file_version_string[0] = '\0';
1389  ret = fscanf(file, "%63s", file_version_string);
1390  file_major = strtol(file_version_string, &endptr, 10);
1391 
1392  if (ret != 1 || endptr == file_version_string)
1393  ereport(FATAL,
1394  (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
1395  errmsg("\"%s\" is not a valid data directory",
1396  path),
1397  errdetail("File \"%s\" does not contain valid data.",
1398  full_path),
1399  errhint("You might need to initdb.")));
1400 
1401  FreeFile(file);
1402 
1403  if (my_major != file_major)
1404  ereport(FATAL,
1405  (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
1406  errmsg("database files are incompatible with server"),
1407  errdetail("The data directory was initialized by PostgreSQL version %s, "
1408  "which is not compatible with this version %s.",
1409  file_version_string, my_version_string)));
1410 }
int errhint(const char *fmt,...)
Definition: elog.c:987
int errcode(int sqlerrcode)
Definition: elog.c:575
int snprintf(char *str, size_t count, const char *fmt,...) pg_attribute_printf(3
#define FATAL
Definition: elog.h:52
#define MAXPGPATH
int errdetail(const char *fmt,...)
Definition: elog.c:873
int errcode_for_file_access(void)
Definition: elog.c:598
FILE * AllocateFile(const char *name, const char *mode)
Definition: fd.c:2117
#define ereport(elevel, rest)
Definition: elog.h:122
int FreeFile(FILE *file)
Definition: fd.c:2309
int errmsg(const char *fmt,...)
Definition: elog.c:797

Variable Documentation

volatile bool ClientConnectionLost

Definition at line 32 of file globals.c.

Referenced by internal_flush(), and ProcessInterrupts().

PGDLLIMPORT volatile sig_atomic_t ConfigReloadPending
PGDLLIMPORT int DateOrder
bool ExitOnAnyError

Definition at line 105 of file globals.c.

Referenced by BackgroundWriterMain(), CheckpointerMain(), and errstart().

PGDLLIMPORT volatile bool IdleInTransactionSessionTimeoutPending

Definition at line 33 of file globals.c.

Referenced by IdleInTransactionSessionTimeoutHandler(), and ProcessInterrupts().

bool IgnoreSystemIndexes
PGDLLIMPORT volatile uint32 InterruptHoldoffCount

Definition at line 35 of file globals.c.

Referenced by errfinish(), proc_exit_prepare(), and ProcessInterrupts().

PGDLLIMPORT int IntervalStyle
PGDLLIMPORT bool IsUnderPostmaster

Definition at line 101 of file globals.c.

Referenced by _PG_init(), AutoVacuumShmemInit(), AuxiliaryProcessMain(), BackendRandomShmemInit(), BackgroundWorkerShmemInit(), bootstrap_signals(), BootstrapModeMain(), BTreeShmemInit(), CheckMyDatabase(), CheckRecoveryConsistency(), CommitTsShmemInit(), CreateLWLocks(), CreateSharedMemoryAndSemaphores(), DebugFileOpen(), dsm_attach(), dsm_create(), dsm_postmaster_startup(), EventTriggerDDLCommandEnd(), EventTriggerDDLCommandStart(), EventTriggerSQLDrop(), EventTriggerTableRewrite(), ForgetDatabaseFsyncRequests(), ForgetRelationFsyncRequests(), ForwardFsyncRequest(), GetNewMultiXactId(), GetNewTransactionId(), HandleStartupProcInterrupts(), heap_create_with_catalog(), init_ps_display(), InitCommunication(), InitializeLatchSupport(), InitializeSessionUserId(), InitializeSessionUserIdStandalone(), InitPostgres(), InitPostmasterChild(), InitPredicateLocks(), InitProcess(), LWLockAcquire(), mdinit(), MultiXactShmemInit(), OldSerXidInit(), pg_backend_random(), PGSemaphoreCreate(), PGSharedMemoryNoReAttach(), PGSharedMemoryReAttach(), pgss_shmem_startup(), PostgresMain(), process_postgres_switches(), process_settings(), ProcKill(), readRecoveryCommandFile(), register_unlink(), RegisterBackgroundWorker(), RegisterDynamicBackgroundWorker(), RequestAddinShmemSpace(), RequestNamedLWLockTranche(), SendPostmasterSignal(), set_config_option(), set_config_sourcefile(), set_ps_display(), SetMultiXactIdLimit(), SetTransactionIdLimit(), ShmemInitStruct(), SimpleLruInit(), standard_planner(), StartupXLOG(), superuser_arg(), SyncScanShmemInit(), TwoPhaseShmemInit(), verify_dictoptions(), WaitLatchOrSocket(), XLogArchiveNotify(), and XLogWrite().

char* local_preload_libraries_string

Definition at line 1423 of file miscinit.c.

Referenced by process_session_preload_libraries().

int max_parallel_workers

Definition at line 125 of file globals.c.

Referenced by RegisterDynamicBackgroundWorker().

Definition at line 57 of file miscinit.c.

AuxProcType MyAuxProcType

Definition at line 69 of file bootstrap.c.

Referenced by AuxiliaryProcessMain(), pgstat_bestart(), and pgstat_initialize().

PGDLLIMPORT Oid MyDatabaseId

Definition at line 77 of file globals.c.

Referenced by AfterTriggerSetState(), AlterDatabase(), AlterObjectRename_internal(), AlterPublicationOwner_internal(), AlterSchemaOwner_internal(), AlterSubscription(), AlterSubscriptionOwner(), analyze_rel(), asyncQueueNotificationToEntry(), asyncQueueProcessPageEntries(), AutoVacuumRequestWork(), backend_read_statsfile(), CacheInvalidateCatalog(), CacheInvalidateHeapTuple(), CacheInvalidateRelcache(), CacheInvalidateRelcacheByTuple(), CheckLogicalDecodingRequirements(), CheckMyDatabase(), checkSharedDependencies(), classIdGetDbId(), CreateDecodingContext(), CreateInitDecodingContext(), CreateProceduralLanguage(), CreatePublication(), CreateSchemaCommand(), CreateSubscription(), current_database(), database_to_xml_internal(), DeconstructQualifiedName(), do_analyze_rel(), do_autovacuum(), dropdb(), DropSubscription(), Exec_ListenPreCommit(), exec_object_restorecon(), exec_replication_command(), ExpandColumnRefStar(), ExportSnapshot(), get_subscription_oid(), GetCurrentVirtualXIDs(), GetNewRelFileNode(), GetOldestXmin(), IdentifySystem(), ImportSnapshot(), InitializeParallelDSM(), InitPostgres(), InitTempTableNamespace(), lazy_vacuum_rel(), libpqrcv_exec(), LocalExecuteInvalidationMessage(), LockDatabaseObject(), LockGXact(), logical_heap_rewrite_flush_mappings(), logical_rewrite_log_mapping(), LogLogicalMessage(), LogStandbyInvalidations(), map_sql_catalog_to_xmlschema_types(), map_sql_schema_to_xmlschema_types(), map_sql_table_to_xmlschema(), map_sql_type_to_xml_name(), movedb(), perform_relmap_update(), perform_work_item(), pg_namespace_aclmask(), pg_relation_filepath(), pgss_store(), pgstat_beshutdown_hook(), pgstat_bestart(), pgstat_fetch_stat_funcentry(), pgstat_fetch_stat_tabentry(), pgstat_report_analyze(), pgstat_report_deadlock(), pgstat_report_recovery_conflict(), pgstat_report_stat(), pgstat_report_tempfile(), pgstat_report_vacuum(), pgstat_reset_counters(), pgstat_reset_single_counter(), pgstat_send_funcstats(), pgstat_vacuum_stat(), PrepareToInvalidateCacheTuple(), PrepareTransaction(), ProcArrayInstallImportedXmin(), ProcArrayInstallRestoredXmin(), RangeVarGetAndCheckCreationNamespace(), RangeVarGetCreationNamespace(), RangeVarGetRelidExtended(), ReindexMultipleTables(), RelationInitLockInfo(), RelationInitPhysicalAddr(), RelationMapFinishBootstrap(), RenameDatabase(), RenameSchema(), ReplicationSlotCreate(), ScanPgRelation(), sepgsql_schema_post_create(), SetLocktagRelationOid(), shdepDropOwned(), shdepReassignOwned(), table_recheck_autovac(), transformColumnRef(), UnlockDatabaseObject(), UpdateLogicalMappings(), vac_truncate_clog(), vac_update_datfrozenxid(), vacuum_rel(), and XactLogCommitRecord().

PGDLLIMPORT struct Latch* MyLatch

Definition at line 52 of file globals.c.

Referenced by ApplyLauncherMain(), ArchSigHupHandler(), ArchSigTermHandler(), AutoVacLauncherMain(), av_sighup_handler(), avl_sigterm_handler(), avl_sigusr2_handler(), BackgroundWriterMain(), be_tls_open_server(), BgSigHupHandler(), CheckDeadLockAlert(), CheckpointerMain(), ChkptSigHupHandler(), ConditionVariablePrepareToSleep(), ConditionVariableSleep(), copy_read_data(), die(), gather_readnext(), handle_sig_alarm(), handle_sigterm(), HandleCatchupInterrupt(), HandleNotifyInterrupt(), HandleParallelMessageInterrupt(), IdleInTransactionSessionTimeoutHandler(), InitPostmasterChild(), InitStandaloneProcess(), libpqrcv_connect(), libpqrcv_PQexec(), logicalrep_launcher_sighup(), logicalrep_worker_sighup(), logicalrep_worker_stop(), LogicalRepApplyLoop(), mq_putmessage(), pg_sleep(), pgarch_MainLoop(), pgarch_waken(), pgarch_waken_stop(), pgfdw_get_cleanup_result(), pgfdw_get_result(), pgstat_exit(), pgstat_sighup_handler(), PgstatCollectorMain(), PostgresSigHupHandler(), pq_init(), procsignal_sigusr1_handler(), ProcSleep(), ProcWaitForSignal(), RecoveryConflictInterrupt(), ReqCheckpointHandler(), ReqShutdownHandler(), secure_read(), secure_write(), shm_mq_receive_bytes(), shm_mq_send_bytes(), shm_mq_wait_internal(), sigHupHandler(), sigUsr1Handler(), StatementCancelHandler(), SwitchBackToLocalLatch(), SwitchToSharedLatch(), SyncRepWaitForLSN(), SysLoggerMain(), test_shm_mq_pipelined(), throttle(), wait_for_relation_state_change(), wait_for_worker_state_change(), wait_for_workers_to_become_ready(), WaitForBackgroundWorkerShutdown(), WaitForBackgroundWorkerStartup(), WaitForParallelWorkersToFinish(), WaitForReplicationWorkerAttach(), WalShutdownHandler(), WalSigHupHandler(), WalSndLastCycleHandler(), WalSndLoop(), WalSndWaitForWal(), WalSndWriteData(), WalWriterMain(), worker_spi_sighup(), and worker_spi_sigterm().

PGDLLIMPORT int MyProcPid

Definition at line 39 of file globals.c.

Referenced by AddWaitEventToSet(), ApplyLauncherMain(), apw_detach_shmem(), apw_dump_now(), apw_load_buffers(), apw_start_database_worker(), apw_start_master_worker(), Async_Listen(), Async_Unlisten(), Async_UnlistenAll(), asyncQueueNotificationToEntry(), asyncQueueReadAllNotifications(), asyncQueueUnregister(), autoprewarm_main(), AutoVacLauncherMain(), BackendRun(), CheckpointerMain(), CleanupProcSignalState(), DisownLatch(), Exec_ListenPreCommit(), Exec_UnlistenAllCommit(), Exec_UnlistenCommit(), ExportSnapshot(), GetSerializableTransactionSnapshotInt(), HandleWalSndInitStopping(), InitAuxiliaryProcess(), InitializeLatchSupport(), InitializeParallelDSM(), InitLatch(), InitPostmasterChild(), InitPostmasterDeathWatchHandle(), InitProcess(), InitStandaloneProcess(), InitWalSenderSlot(), IsLogicalLauncher(), LaunchParallelWorkers(), LockBufferForCleanup(), LockTimeoutHandler(), log_line_prefix(), logicalrep_worker_launch(), OpenTemporaryFileInTablespace(), OwnLatch(), ParallelWorkerMain(), pg_backend_pid(), pgstat_bestart(), PostgresMain(), PostmasterMain(), ProcSignalInit(), ProcSleep(), PublishStartupProcessInformation(), ReplicationOriginExitCleanup(), ReplicationSlotAcquire(), ReplicationSlotCleanup(), ReplicationSlotCreate(), ReplicationSlotsDropDBSlots(), replorigin_session_setup(), ResetLatch(), ServerLoop(), set_ps_display(), SetLatch(), setup_background_workers(), SharedInvalBackendInit(), SignalBackends(), SnapBuildSerialize(), StatementTimeoutHandler(), UnlockBuffers(), WalRcvDie(), WalReceiverMain(), worker_spi_launch(), write_csvlog(), write_pipe_chunks(), and write_relcache_init_file().

PGDLLIMPORT int NBuffers

Definition at line 122 of file globals.c.

char OutputFileName[]

Definition at line 62 of file globals.c.

Referenced by AuxiliaryProcessMain(), DebugFileOpen(), and process_postgres_switches().

char pkglib_path[]

Definition at line 65 of file globals.c.

Referenced by getInstallationPaths(), InitStandaloneProcess(), and substitute_libpath_macro().

PGDLLIMPORT bool process_shared_preload_libraries_in_progress
PGDLLIMPORT volatile uint32 QueryCancelHoldoffCount

Definition at line 36 of file globals.c.

Referenced by errfinish(), and ProcessInterrupts().

char* session_preload_libraries_string

Definition at line 1421 of file miscinit.c.

Referenced by process_session_preload_libraries().

char* shared_preload_libraries_string

Definition at line 1422 of file miscinit.c.

Referenced by process_shared_preload_libraries().

int trace_recovery_messages

Definition at line 455 of file guc.c.

Referenced by StartupXLOG(), and trace_recovery().

bool VacuumCostActive
int VacuumCostBalance
int VacuumCostLimit
int VacuumCostPageDirty

Definition at line 130 of file globals.c.

Referenced by MarkBufferDirty(), and MarkBufferDirtyHint().

int VacuumCostPageHit

Definition at line 128 of file globals.c.

Referenced by ReadBuffer_common().

int VacuumCostPageMiss

Definition at line 129 of file globals.c.

Referenced by ReadBuffer_common().

int VacuumPageDirty

Definition at line 136 of file globals.c.

Referenced by lazy_vacuum_rel(), MarkBufferDirty(), MarkBufferDirtyHint(), and vacuum().

int VacuumPageHit

Definition at line 134 of file globals.c.

Referenced by lazy_vacuum_rel(), ReadBuffer_common(), and vacuum().

int VacuumPageMiss

Definition at line 135 of file globals.c.

Referenced by lazy_vacuum_rel(), ReadBuffer_common(), and vacuum().

PGDLLIMPORT int work_mem

Definition at line 113 of file globals.c.

Referenced by _bt_spoolinit(), begin_partition(), brin_page_items(), BuildTupleHashTable(), choose_hashed_setop(), collectMatchBitmap(), connectby(), consider_groupingsets_paths(), cost_material(), cost_rescan(), create_distinct_paths(), create_gather_merge_path(), create_grouping_paths(), create_groupingsets_path(), create_merge_append_path(), create_sort_path(), create_unique_path(), crosstab(), dblink_get_notify(), deflist_to_tuplestore(), each_worker(), each_worker_jsonb(), elements_worker(), elements_worker_jsonb(), exec_init_tuple_store(), ExecChooseHashTableSize(), ExecHashTableCreate(), ExecInitCteScan(), ExecInitRecursiveUnion(), ExecMakeTableFunctionResult(), ExecMaterial(), ExecRecursiveUnion(), ExecSort(), final_cost_hashjoin(), final_cost_mergejoin(), fmgr_sql(), get_crosstab_tuplestore(), GetCurrentFDWTuplestore(), ginInsertCleanup(), initial_cost_mergejoin(), initialize_aggregate(), initialize_phase(), label_sort_with_costsize(), libpqrcv_processTuples(), MakeTransitionCaptureState(), materializeQueryResult(), materializeResult(), MultiExecBitmapIndexScan(), MultiExecBitmapOr(), ordered_set_startup(), pg_available_extension_versions(), pg_available_extensions(), pg_config(), pg_cursor(), pg_event_trigger_ddl_commands(), pg_event_trigger_dropped_objects(), pg_extension_update_paths(), pg_get_replication_slots(), pg_hba_file_rules(), pg_logical_slot_get_changes_guts(), pg_prepared_statement(), pg_show_replication_origin_status(), pg_stat_get_activity(), pg_stat_get_progress_info(), pg_stat_get_subscription(), pg_stat_get_wal_senders(), pg_stat_statements_internal(), pg_stop_backup_v2(), plperl_return_next_internal(), pltcl_init_tuple_store(), populate_recordset_worker(), PortalCreateHoldStore(), show_all_file_settings(), storeRow(), subplan_is_hashable(), tfuncFetchRows(), and xpath_table().