]> granicus.if.org Git - postgresql/blob - src/include/miscadmin.h
Centralize definition of integer limits.
[postgresql] / src / include / miscadmin.h
1 /*-------------------------------------------------------------------------
2  *
3  * miscadmin.h
4  *        This file contains general postgres administration and initialization
5  *        stuff that used to be spread out between the following files:
6  *              globals.h                                               global variables
7  *              pdir.h                                                  directory path crud
8  *              pinit.h                                                 postgres initialization
9  *              pmod.h                                                  processing modes
10  *        Over time, this has also become the preferred place for widely known
11  *        resource-limitation stuff, such as work_mem and check_stack_depth().
12  *
13  * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group
14  * Portions Copyright (c) 1994, Regents of the University of California
15  *
16  * src/include/miscadmin.h
17  *
18  * NOTES
19  *        some of the information in this file should be moved to other files.
20  *
21  *-------------------------------------------------------------------------
22  */
23 #ifndef MISCADMIN_H
24 #define MISCADMIN_H
25
26 #include "pgtime.h"                             /* for pg_time_t */
27
28
29 #define PG_BACKEND_VERSIONSTR "postgres (PostgreSQL) " PG_VERSION "\n"
30
31 #define InvalidPid                              (-1)
32
33
34 /*****************************************************************************
35  *        System interrupt and critical section handling
36  *
37  * There are two types of interrupts that a running backend needs to accept
38  * without messing up its state: QueryCancel (SIGINT) and ProcDie (SIGTERM).
39  * In both cases, we need to be able to clean up the current transaction
40  * gracefully, so we can't respond to the interrupt instantaneously ---
41  * there's no guarantee that internal data structures would be self-consistent
42  * if the code is interrupted at an arbitrary instant.  Instead, the signal
43  * handlers set flags that are checked periodically during execution.
44  *
45  * The CHECK_FOR_INTERRUPTS() macro is called at strategically located spots
46  * where it is normally safe to accept a cancel or die interrupt.  In some
47  * cases, we invoke CHECK_FOR_INTERRUPTS() inside low-level subroutines that
48  * might sometimes be called in contexts that do *not* want to allow a cancel
49  * or die interrupt.  The HOLD_INTERRUPTS() and RESUME_INTERRUPTS() macros
50  * allow code to ensure that no cancel or die interrupt will be accepted,
51  * even if CHECK_FOR_INTERRUPTS() gets called in a subroutine.  The interrupt
52  * will be held off until CHECK_FOR_INTERRUPTS() is done outside any
53  * HOLD_INTERRUPTS() ... RESUME_INTERRUPTS() section.
54  *
55  * There is also a mechanism to prevent query cancel interrupts, while still
56  * allowing die interrupts: HOLD_CANCEL_INTERRUPTS() and
57  * RESUME_CANCEL_INTERRUPTS().
58  *
59  * Special mechanisms are used to let an interrupt be accepted when we are
60  * waiting for a lock or when we are waiting for command input (but, of
61  * course, only if the interrupt holdoff counter is zero).  See the
62  * related code for details.
63  *
64  * A lost connection is handled similarly, although the loss of connection
65  * does not raise a signal, but is detected when we fail to write to the
66  * socket. If there was a signal for a broken connection, we could make use of
67  * it by setting ClientConnectionLost in the signal handler.
68  *
69  * A related, but conceptually distinct, mechanism is the "critical section"
70  * mechanism.  A critical section not only holds off cancel/die interrupts,
71  * but causes any ereport(ERROR) or ereport(FATAL) to become ereport(PANIC)
72  * --- that is, a system-wide reset is forced.  Needless to say, only really
73  * *critical* code should be marked as a critical section!      Currently, this
74  * mechanism is only used for XLOG-related code.
75  *
76  *****************************************************************************/
77
78 /* in globals.c */
79 /* these are marked volatile because they are set by signal handlers: */
80 extern PGDLLIMPORT volatile bool InterruptPending;
81 extern PGDLLIMPORT volatile bool QueryCancelPending;
82 extern PGDLLIMPORT volatile bool ProcDiePending;
83
84 extern volatile bool ClientConnectionLost;
85
86 /* these are marked volatile because they are examined by signal handlers: */
87 extern PGDLLIMPORT volatile uint32 InterruptHoldoffCount;
88 extern PGDLLIMPORT volatile uint32 QueryCancelHoldoffCount;
89 extern PGDLLIMPORT volatile uint32 CritSectionCount;
90
91 /* in tcop/postgres.c */
92 extern void ProcessInterrupts(void);
93
94 #ifndef WIN32
95
96 #define CHECK_FOR_INTERRUPTS() \
97 do { \
98         if (InterruptPending) \
99                 ProcessInterrupts(); \
100 } while(0)
101 #else                                                   /* WIN32 */
102
103 #define CHECK_FOR_INTERRUPTS() \
104 do { \
105         if (UNBLOCKED_SIGNAL_QUEUE()) \
106                 pgwin32_dispatch_queued_signals(); \
107         if (InterruptPending) \
108                 ProcessInterrupts(); \
109 } while(0)
110 #endif   /* WIN32 */
111
112
113 #define HOLD_INTERRUPTS()  (InterruptHoldoffCount++)
114
115 #define RESUME_INTERRUPTS() \
116 do { \
117         Assert(InterruptHoldoffCount > 0); \
118         InterruptHoldoffCount--; \
119 } while(0)
120
121 #define HOLD_CANCEL_INTERRUPTS()  (QueryCancelHoldoffCount++)
122
123 #define RESUME_CANCEL_INTERRUPTS() \
124 do { \
125         Assert(QueryCancelHoldoffCount > 0); \
126         QueryCancelHoldoffCount--; \
127 } while(0)
128
129 #define START_CRIT_SECTION()  (CritSectionCount++)
130
131 #define END_CRIT_SECTION() \
132 do { \
133         Assert(CritSectionCount > 0); \
134         CritSectionCount--; \
135 } while(0)
136
137
138 /*****************************************************************************
139  *        globals.h --                                                                                                                   *
140  *****************************************************************************/
141
142 /*
143  * from utils/init/globals.c
144  */
145 extern pid_t PostmasterPid;
146 extern bool IsPostmasterEnvironment;
147 extern PGDLLIMPORT bool IsUnderPostmaster;
148 extern bool IsBackgroundWorker;
149 extern PGDLLIMPORT bool IsBinaryUpgrade;
150
151 extern bool ExitOnAnyError;
152
153 extern PGDLLIMPORT char *DataDir;
154
155 extern PGDLLIMPORT int NBuffers;
156 extern int      MaxBackends;
157 extern int      MaxConnections;
158 extern int      max_worker_processes;
159
160 extern PGDLLIMPORT int MyProcPid;
161 extern PGDLLIMPORT pg_time_t MyStartTime;
162 extern PGDLLIMPORT struct Port *MyProcPort;
163 extern PGDLLIMPORT struct Latch *MyLatch;
164 extern long MyCancelKey;
165 extern int      MyPMChildSlot;
166
167 extern char OutputFileName[];
168 extern PGDLLIMPORT char my_exec_path[];
169 extern char pkglib_path[];
170
171 #ifdef EXEC_BACKEND
172 extern char postgres_exec_path[];
173 #endif
174
175 /*
176  * done in storage/backendid.h for now.
177  *
178  * extern BackendId    MyBackendId;
179  */
180 extern PGDLLIMPORT Oid MyDatabaseId;
181
182 extern PGDLLIMPORT Oid MyDatabaseTableSpace;
183
184 /*
185  * Date/Time Configuration
186  *
187  * DateStyle defines the output formatting choice for date/time types:
188  *      USE_POSTGRES_DATES specifies traditional Postgres format
189  *      USE_ISO_DATES specifies ISO-compliant format
190  *      USE_SQL_DATES specifies Oracle/Ingres-compliant format
191  *      USE_GERMAN_DATES specifies German-style dd.mm/yyyy
192  *
193  * DateOrder defines the field order to be assumed when reading an
194  * ambiguous date (anything not in YYYY-MM-DD format, with a four-digit
195  * year field first, is taken to be ambiguous):
196  *      DATEORDER_YMD specifies field order yy-mm-dd
197  *      DATEORDER_DMY specifies field order dd-mm-yy ("European" convention)
198  *      DATEORDER_MDY specifies field order mm-dd-yy ("US" convention)
199  *
200  * In the Postgres and SQL DateStyles, DateOrder also selects output field
201  * order: day comes before month in DMY style, else month comes before day.
202  *
203  * The user-visible "DateStyle" run-time parameter subsumes both of these.
204  */
205
206 /* valid DateStyle values */
207 #define USE_POSTGRES_DATES              0
208 #define USE_ISO_DATES                   1
209 #define USE_SQL_DATES                   2
210 #define USE_GERMAN_DATES                3
211 #define USE_XSD_DATES                   4
212
213 /* valid DateOrder values */
214 #define DATEORDER_YMD                   0
215 #define DATEORDER_DMY                   1
216 #define DATEORDER_MDY                   2
217
218 extern PGDLLIMPORT int DateStyle;
219 extern PGDLLIMPORT int DateOrder;
220
221 /*
222  * IntervalStyles
223  *       INTSTYLE_POSTGRES                         Like Postgres < 8.4 when DateStyle = 'iso'
224  *       INTSTYLE_POSTGRES_VERBOSE         Like Postgres < 8.4 when DateStyle != 'iso'
225  *       INTSTYLE_SQL_STANDARD             SQL standard interval literals
226  *       INTSTYLE_ISO_8601                         ISO-8601-basic formatted intervals
227  */
228 #define INTSTYLE_POSTGRES                       0
229 #define INTSTYLE_POSTGRES_VERBOSE       1
230 #define INTSTYLE_SQL_STANDARD           2
231 #define INTSTYLE_ISO_8601                       3
232
233 extern PGDLLIMPORT int IntervalStyle;
234
235 #define MAXTZLEN                10              /* max TZ name len, not counting tr. null */
236
237 extern bool enableFsync;
238 extern bool allowSystemTableMods;
239 extern PGDLLIMPORT int work_mem;
240 extern PGDLLIMPORT int maintenance_work_mem;
241
242 extern int      VacuumCostPageHit;
243 extern int      VacuumCostPageMiss;
244 extern int      VacuumCostPageDirty;
245 extern int      VacuumCostLimit;
246 extern int      VacuumCostDelay;
247
248 extern int      VacuumPageHit;
249 extern int      VacuumPageMiss;
250 extern int      VacuumPageDirty;
251
252 extern int      VacuumCostBalance;
253 extern bool VacuumCostActive;
254
255
256 /* in tcop/postgres.c */
257
258 #if defined(__ia64__) || defined(__ia64)
259 typedef struct
260 {
261         char       *stack_base_ptr;
262         char       *register_stack_base_ptr;
263 } pg_stack_base_t;
264 #else
265 typedef char *pg_stack_base_t;
266 #endif
267
268 extern pg_stack_base_t set_stack_base(void);
269 extern void restore_stack_base(pg_stack_base_t base);
270 extern void check_stack_depth(void);
271
272 /* in tcop/utility.c */
273 extern void PreventCommandIfReadOnly(const char *cmdname);
274 extern void PreventCommandDuringRecovery(const char *cmdname);
275
276 /* in utils/misc/guc.c */
277 extern int      trace_recovery_messages;
278 extern int      trace_recovery(int trace_level);
279
280 /*****************************************************************************
281  *        pdir.h --                                                                                                                              *
282  *                      POSTGRES directory path definitions.                             *
283  *****************************************************************************/
284
285 /* flags to be OR'd to form sec_context */
286 #define SECURITY_LOCAL_USERID_CHANGE    0x0001
287 #define SECURITY_RESTRICTED_OPERATION   0x0002
288 #define SECURITY_ROW_LEVEL_DISABLED             0x0004
289
290 extern char *DatabasePath;
291
292 /* now in utils/init/miscinit.c */
293 extern void InitPostmasterChild(void);
294 extern void InitStandaloneProcess(const char *argv0);
295
296 extern void SetDatabasePath(const char *path);
297
298 extern char *GetUserNameFromId(Oid roleid);
299 extern Oid      GetUserId(void);
300 extern Oid      GetOuterUserId(void);
301 extern Oid      GetSessionUserId(void);
302 extern Oid      GetAuthenticatedUserId(void);
303 extern void GetUserIdAndSecContext(Oid *userid, int *sec_context);
304 extern void SetUserIdAndSecContext(Oid userid, int sec_context);
305 extern bool InLocalUserIdChange(void);
306 extern bool InSecurityRestrictedOperation(void);
307 extern void GetUserIdAndContext(Oid *userid, bool *sec_def_context);
308 extern void SetUserIdAndContext(Oid userid, bool sec_def_context);
309 extern void InitializeSessionUserId(const char *rolename, Oid useroid);
310 extern void InitializeSessionUserIdStandalone(void);
311 extern void SetSessionAuthorization(Oid userid, bool is_superuser);
312 extern Oid      GetCurrentRoleId(void);
313 extern void SetCurrentRoleId(Oid roleid, bool is_superuser);
314
315 extern void SetDataDir(const char *dir);
316 extern void ChangeToDataDir(void);
317
318 extern void SwitchToSharedLatch(void);
319 extern void SwitchBackToLocalLatch(void);
320
321 /* in utils/misc/superuser.c */
322 extern bool superuser(void);    /* current user is superuser */
323 extern bool superuser_arg(Oid roleid);  /* given user is superuser */
324
325
326 /*****************************************************************************
327  *        pmod.h --                                                                                                                              *
328  *                      POSTGRES processing mode definitions.                            *
329  *****************************************************************************/
330
331 /*
332  * Description:
333  *              There are three processing modes in POSTGRES.  They are
334  * BootstrapProcessing or "bootstrap," InitProcessing or
335  * "initialization," and NormalProcessing or "normal."
336  *
337  * The first two processing modes are used during special times. When the
338  * system state indicates bootstrap processing, transactions are all given
339  * transaction id "one" and are consequently guaranteed to commit. This mode
340  * is used during the initial generation of template databases.
341  *
342  * Initialization mode: used while starting a backend, until all normal
343  * initialization is complete.  Some code behaves differently when executed
344  * in this mode to enable system bootstrapping.
345  *
346  * If a POSTGRES backend process is in normal mode, then all code may be
347  * executed normally.
348  */
349
350 typedef enum ProcessingMode
351 {
352         BootstrapProcessing,            /* bootstrap creation of template database */
353         InitProcessing,                         /* initializing system */
354         NormalProcessing                        /* normal processing */
355 } ProcessingMode;
356
357 extern ProcessingMode Mode;
358
359 #define IsBootstrapProcessingMode() (Mode == BootstrapProcessing)
360 #define IsInitProcessingMode()          (Mode == InitProcessing)
361 #define IsNormalProcessingMode()        (Mode == NormalProcessing)
362
363 #define GetProcessingMode() Mode
364
365 #define SetProcessingMode(mode) \
366         do { \
367                 AssertArg((mode) == BootstrapProcessing || \
368                                   (mode) == InitProcessing || \
369                                   (mode) == NormalProcessing); \
370                 Mode = (mode); \
371         } while(0)
372
373
374 /*
375  * Auxiliary-process type identifiers.  These used to be in bootstrap.h
376  * but it seems saner to have them here, with the ProcessingMode stuff.
377  * The MyAuxProcType global is defined and set in bootstrap.c.
378  */
379
380 typedef enum
381 {
382         NotAnAuxProcess = -1,
383         CheckerProcess = 0,
384         BootstrapProcess,
385         StartupProcess,
386         BgWriterProcess,
387         CheckpointerProcess,
388         WalWriterProcess,
389         WalReceiverProcess,
390
391         NUM_AUXPROCTYPES                        /* Must be last! */
392 } AuxProcType;
393
394 extern AuxProcType MyAuxProcType;
395
396 #define AmBootstrapProcess()            (MyAuxProcType == BootstrapProcess)
397 #define AmStartupProcess()                      (MyAuxProcType == StartupProcess)
398 #define AmBackgroundWriterProcess() (MyAuxProcType == BgWriterProcess)
399 #define AmCheckpointerProcess()         (MyAuxProcType == CheckpointerProcess)
400 #define AmWalWriterProcess()            (MyAuxProcType == WalWriterProcess)
401 #define AmWalReceiverProcess()          (MyAuxProcType == WalReceiverProcess)
402
403
404 /*****************************************************************************
405  *        pinit.h --                                                                                                                     *
406  *                      POSTGRES initialization and cleanup definitions.                 *
407  *****************************************************************************/
408
409 /* in utils/init/postinit.c */
410 extern void pg_split_opts(char **argv, int *argcp, char *optstr);
411 extern void InitializeMaxBackends(void);
412 extern void InitPostgres(const char *in_dbname, Oid dboid, const char *username,
413                          Oid useroid, char *out_dbname);
414 extern void BaseInit(void);
415
416 /* in utils/init/miscinit.c */
417 extern bool IgnoreSystemIndexes;
418 extern PGDLLIMPORT bool process_shared_preload_libraries_in_progress;
419 extern char *session_preload_libraries_string;
420 extern char *shared_preload_libraries_string;
421 extern char *local_preload_libraries_string;
422
423 /*
424  * As of 9.1, the contents of the data-directory lock file are:
425  *
426  * line #
427  *              1       postmaster PID (or negative of a standalone backend's PID)
428  *              2       data directory path
429  *              3       postmaster start timestamp (time_t representation)
430  *              4       port number
431  *              5       first Unix socket directory path (empty if none)
432  *              6       first listen_address (IP address or "*"; empty if no TCP port)
433  *              7       shared memory key (not present on Windows)
434  *
435  * Lines 6 and up are added via AddToDataDirLockFile() after initial file
436  * creation.
437  *
438  * The socket lock file, if used, has the same contents as lines 1-5.
439  */
440 #define LOCK_FILE_LINE_PID                      1
441 #define LOCK_FILE_LINE_DATA_DIR         2
442 #define LOCK_FILE_LINE_START_TIME       3
443 #define LOCK_FILE_LINE_PORT                     4
444 #define LOCK_FILE_LINE_SOCKET_DIR       5
445 #define LOCK_FILE_LINE_LISTEN_ADDR      6
446 #define LOCK_FILE_LINE_SHMEM_KEY        7
447
448 extern void CreateDataDirLockFile(bool amPostmaster);
449 extern void CreateSocketLockFile(const char *socketfile, bool amPostmaster,
450                                          const char *socketDir);
451 extern void TouchSocketLockFiles(void);
452 extern void AddToDataDirLockFile(int target_line, const char *str);
453 extern void ValidatePgVersion(const char *path);
454 extern void process_shared_preload_libraries(void);
455 extern void process_session_preload_libraries(void);
456 extern void pg_bindtextdomain(const char *domain);
457 extern bool has_rolreplication(Oid roleid);
458
459 /* in access/transam/xlog.c */
460 extern bool BackupInProgress(void);
461 extern void CancelBackup(void);
462
463 #endif   /* MISCADMIN_H */