mirror of
https://git.postgresql.org/git/postgresql.git
synced 2024-08-25 08:47:19 +02:00
* Store two past checkpoint locations, not just one, in pg_control. On startup, we fall back to the older checkpoint if the newer one is unreadable. Also, a physical copy of the newest checkpoint record is kept in pg_control for possible use in disaster recovery (ie, complete loss of pg_xlog). Also add a version number for pg_control itself. Remove archdir from pg_control; it ought to be a GUC parameter, not a special case (not that it's implemented yet anyway). * Suppress successive checkpoint records when nothing has been entered in the WAL log since the last one. This is not so much to avoid I/O as to make it actually useful to keep track of the last two checkpoints. If the things are right next to each other then there's not a lot of redundancy gained... * Change CRC scheme to a true 64-bit CRC, not a pair of 32-bit CRCs on alternate bytes. Polynomial borrowed from ECMA DLT1 standard. * Fix XLOG record length handling so that it will work at BLCKSZ = 32k. * Change XID allocation to work more like OID allocation. (This is of dubious necessity, but I think it's a good idea anyway.) * Fix a number of minor bugs, such as off-by-one logic for XLOG file wraparound at the 4 gig mark. * Add documentation and clean up some coding infelicities; move file format declarations out to include files where planned contrib utilities can get at them. * Checkpoint will now occur every CHECKPOINT_SEGMENTS log segments or every CHECKPOINT_TIMEOUT seconds, whichever comes first. It is also possible to force a checkpoint by sending SIGUSR1 to the postmaster (undocumented feature...) * Defend against kill -9 postmaster by storing shmem block's key and ID in postmaster.pid lockfile, and checking at startup to ensure that no processes are still connected to old shmem block (if it still exists). * Switch backends to accept SIGQUIT rather than SIGUSR1 for emergency stop, for symmetry with postmaster and xlog utilities. Clean up signal handling in bootstrap.c so that xlog utilities launched by postmaster will react to signals better. * Standalone bootstrap now grabs lockfile in target directory, as added insurance against running it in parallel with live postmaster.
297 lines
9.8 KiB
C
297 lines
9.8 KiB
C
/*-------------------------------------------------------------------------
|
|
*
|
|
* miscadmin.h
|
|
* this file contains general postgres administration and initialization
|
|
* stuff that used to be spread out between the following files:
|
|
* globals.h global variables
|
|
* pdir.h directory path crud
|
|
* pinit.h postgres initialization
|
|
* pmod.h processing modes
|
|
*
|
|
*
|
|
* Portions Copyright (c) 1996-2001, PostgreSQL Global Development Group
|
|
* Portions Copyright (c) 1994, Regents of the University of California
|
|
*
|
|
* $Id: miscadmin.h,v 1.82 2001/03/13 01:17:06 tgl Exp $
|
|
*
|
|
* NOTES
|
|
* some of the information in this file should be moved to
|
|
* other files.
|
|
*
|
|
*-------------------------------------------------------------------------
|
|
*/
|
|
#ifndef MISCADMIN_H
|
|
#define MISCADMIN_H
|
|
|
|
#include "storage/ipc.h"
|
|
|
|
/*****************************************************************************
|
|
* System interrupt and critical section handling
|
|
*
|
|
* There are two types of interrupts that a running backend needs to accept
|
|
* without messing up its state: QueryCancel (SIGINT) and ProcDie (SIGTERM).
|
|
* In both cases, we need to be able to clean up the current transaction
|
|
* gracefully, so we can't respond to the interrupt instantaneously ---
|
|
* there's no guarantee that internal data structures would be self-consistent
|
|
* if the code is interrupted at an arbitrary instant. Instead, the signal
|
|
* handlers set flags that are checked periodically during execution.
|
|
*
|
|
* The CHECK_FOR_INTERRUPTS() macro is called at strategically located spots
|
|
* where it is normally safe to accept a cancel or die interrupt. In some
|
|
* cases, we invoke CHECK_FOR_INTERRUPTS() inside low-level subroutines that
|
|
* might sometimes be called in contexts that do *not* want to allow a cancel
|
|
* or die interrupt. The HOLD_INTERRUPTS() and RESUME_INTERRUPTS() macros
|
|
* allow code to ensure that no cancel or die interrupt will be accepted,
|
|
* even if CHECK_FOR_INTERRUPTS() gets called in a subroutine. The interrupt
|
|
* will be held off until the last matching RESUME_INTERRUPTS() occurs.
|
|
*
|
|
* Special mechanisms are used to let an interrupt be accepted when we are
|
|
* waiting for a lock or spinlock, and when we are waiting for command input
|
|
* (but, of course, only if the interrupt holdoff counter is zero). See the
|
|
* related code for details.
|
|
*
|
|
* A related, but conceptually distinct, mechanism is the "critical section"
|
|
* mechanism. A critical section not only holds off cancel/die interrupts,
|
|
* but causes any elog(ERROR) or elog(FATAL) to become elog(STOP) --- that is,
|
|
* a system-wide reset is forced. Needless to say, only really *critical*
|
|
* code should be marked as a critical section! Currently, this mechanism
|
|
* is only used for XLOG-related code.
|
|
*
|
|
*****************************************************************************/
|
|
|
|
/* in globals.c */
|
|
/* these are marked volatile because they are set by signal handlers: */
|
|
extern volatile bool InterruptPending;
|
|
extern volatile bool QueryCancelPending;
|
|
extern volatile bool ProcDiePending;
|
|
/* these are marked volatile because they are examined by signal handlers: */
|
|
extern volatile bool ImmediateInterruptOK;
|
|
extern volatile uint32 InterruptHoldoffCount;
|
|
extern volatile uint32 CritSectionCount;
|
|
|
|
/* in postgres.c */
|
|
extern void ProcessInterrupts(void);
|
|
|
|
#define CHECK_FOR_INTERRUPTS() \
|
|
do { \
|
|
if (InterruptPending) \
|
|
ProcessInterrupts(); \
|
|
} while(0)
|
|
|
|
#define HOLD_INTERRUPTS() (InterruptHoldoffCount++)
|
|
|
|
#define RESUME_INTERRUPTS() \
|
|
do { \
|
|
Assert(InterruptHoldoffCount > 0); \
|
|
InterruptHoldoffCount--; \
|
|
if (InterruptPending) \
|
|
ProcessInterrupts(); \
|
|
} while(0)
|
|
|
|
#define START_CRIT_SECTION() (CritSectionCount++)
|
|
|
|
#define END_CRIT_SECTION() \
|
|
do { \
|
|
Assert(CritSectionCount > 0); \
|
|
CritSectionCount--; \
|
|
if (InterruptPending) \
|
|
ProcessInterrupts(); \
|
|
} while(0)
|
|
|
|
|
|
/*****************************************************************************
|
|
* globals.h -- *
|
|
*****************************************************************************/
|
|
|
|
/*
|
|
* from postmaster/postmaster.c
|
|
*/
|
|
extern int PostmasterMain(int argc, char *argv[]);
|
|
|
|
/*
|
|
* from utils/init/globals.c
|
|
*/
|
|
extern bool Noversion;
|
|
extern bool Quiet;
|
|
extern char *DataDir;
|
|
|
|
extern int MyProcPid;
|
|
extern struct Port *MyProcPort;
|
|
extern long MyCancelKey;
|
|
|
|
extern char OutputFileName[];
|
|
|
|
/*
|
|
* done in storage/backendid.h for now.
|
|
*
|
|
* extern BackendId MyBackendId;
|
|
*/
|
|
extern Oid MyDatabaseId;
|
|
|
|
extern bool IsUnderPostmaster;
|
|
|
|
extern int DebugLvl;
|
|
|
|
/* Date/Time Configuration
|
|
*
|
|
* Constants to pass info from runtime environment:
|
|
* USE_POSTGRES_DATES specifies traditional postgres format for output.
|
|
* USE_ISO_DATES specifies ISO-compliant format for output.
|
|
* USE_SQL_DATES specified Oracle/Ingres-compliant format for output.
|
|
* USE_GERMAN_DATES specifies German-style dd.mm/yyyy date format.
|
|
*
|
|
* DateStyle specifies preference for date formatting for output.
|
|
* EuroDates if client prefers dates interpreted and written w/European conventions.
|
|
*
|
|
* HasCTZSet if client timezone is specified by client.
|
|
* CDayLight is the apparent daylight savings time status.
|
|
* CTimeZone is the timezone offset in seconds.
|
|
* CTZName is the timezone label.
|
|
*/
|
|
|
|
#define MAXTZLEN 10 /* max TZ name len, not counting tr. null */
|
|
|
|
#define USE_POSTGRES_DATES 0
|
|
#define USE_ISO_DATES 1
|
|
#define USE_SQL_DATES 2
|
|
#define USE_GERMAN_DATES 3
|
|
|
|
extern int DateStyle;
|
|
extern bool EuroDates;
|
|
extern bool HasCTZSet;
|
|
extern bool CDayLight;
|
|
extern int CTimeZone;
|
|
extern char CTZName[];
|
|
|
|
extern char FloatFormat[];
|
|
extern char DateFormat[];
|
|
|
|
extern bool enableFsync;
|
|
extern bool allowSystemTableMods;
|
|
extern int SortMem;
|
|
|
|
/* a few postmaster startup options are exported here so the
|
|
configuration file processor has access to them */
|
|
|
|
extern bool NetServer;
|
|
extern bool EnableSSL;
|
|
extern bool SilentMode;
|
|
extern int MaxBackends;
|
|
extern int NBuffers;
|
|
extern int PostPortNumber;
|
|
extern int Unix_socket_permissions;
|
|
extern char *Unix_socket_group;
|
|
extern char *UnixSocketDir;
|
|
extern char *VirtualHost;
|
|
|
|
|
|
/*****************************************************************************
|
|
* pdir.h -- *
|
|
* POSTGRES directory path definitions. *
|
|
*****************************************************************************/
|
|
|
|
extern char *DatabaseName;
|
|
extern char *DatabasePath;
|
|
|
|
/* in utils/misc/database.c */
|
|
extern void GetRawDatabaseInfo(const char *name, Oid *db_id, char *path);
|
|
extern char *ExpandDatabasePath(const char *path);
|
|
|
|
/* now in utils/init/miscinit.c */
|
|
extern void SetDatabaseName(const char *name);
|
|
extern void SetDatabasePath(const char *path);
|
|
|
|
extern char *GetUserName(Oid userid);
|
|
|
|
extern Oid GetUserId(void);
|
|
extern void SetUserId(Oid userid);
|
|
extern Oid GetSessionUserId(void);
|
|
extern void SetSessionUserId(Oid userid);
|
|
extern void SetSessionUserIdFromUserName(const char *username);
|
|
|
|
extern void SetDataDir(const char *dir);
|
|
|
|
extern int FindExec(char *full_path, const char *argv0,
|
|
const char *binary_name);
|
|
extern int CheckPathAccess(char *path, char *name, int open_mode);
|
|
|
|
#ifdef CYR_RECODE
|
|
extern void GetCharSetByHost(char *TableName, int host, const char *DataDir);
|
|
extern void SetCharSet(void);
|
|
extern char *convertstr(unsigned char *buff, int len, int dest);
|
|
#endif
|
|
|
|
/*****************************************************************************
|
|
* pmod.h -- *
|
|
* POSTGRES processing mode definitions. *
|
|
*****************************************************************************/
|
|
/*
|
|
* Description:
|
|
* There are three processing modes in POSTGRES. They are
|
|
* BootstrapProcessing or "bootstrap," InitProcessing or
|
|
* "initialization," and NormalProcessing or "normal."
|
|
*
|
|
* The first two processing modes are used during special times. When the
|
|
* system state indicates bootstrap processing, transactions are all given
|
|
* transaction id "one" and are consequently guaranteed to commit. This mode
|
|
* is used during the initial generation of template databases.
|
|
*
|
|
* Initialization mode: used while starting a backend, until all normal
|
|
* initialization is complete. Some code behaves differently when executed
|
|
* in this mode to enable system bootstrapping.
|
|
*
|
|
* If a POSTGRES binary is in normal mode, then all code may be executed
|
|
* normally.
|
|
*/
|
|
|
|
typedef enum ProcessingMode
|
|
{
|
|
BootstrapProcessing, /* bootstrap creation of template database */
|
|
InitProcessing, /* initializing system */
|
|
NormalProcessing /* normal processing */
|
|
} ProcessingMode;
|
|
|
|
|
|
/*****************************************************************************
|
|
* pinit.h -- *
|
|
* POSTGRES initialization and cleanup definitions. *
|
|
*****************************************************************************/
|
|
|
|
/* in utils/init/postinit.c */
|
|
extern int lockingOff;
|
|
|
|
extern void InitPostgres(const char *dbname, const char *username);
|
|
extern void BaseInit(void);
|
|
|
|
/* processing mode support stuff */
|
|
extern ProcessingMode Mode;
|
|
|
|
#define IsBootstrapProcessingMode() ((bool)(Mode == BootstrapProcessing))
|
|
#define IsInitProcessingMode() ((bool)(Mode == InitProcessing))
|
|
#define IsNormalProcessingMode() ((bool)(Mode == NormalProcessing))
|
|
|
|
#define SetProcessingMode(mode) \
|
|
do { \
|
|
AssertArg((mode) == BootstrapProcessing || \
|
|
(mode) == InitProcessing || \
|
|
(mode) == NormalProcessing); \
|
|
Mode = (mode); \
|
|
} while(0)
|
|
|
|
#define GetProcessingMode() Mode
|
|
|
|
extern bool CreateDataDirLockFile(const char *datadir, bool amPostmaster);
|
|
extern bool CreateSocketLockFile(const char *socketfile, bool amPostmaster);
|
|
extern void TouchSocketLockFile(void);
|
|
extern void RecordSharedMemoryInLockFile(IpcMemoryKey shmKey,
|
|
IpcMemoryId shmId);
|
|
|
|
extern void ValidatePgVersion(const char *path);
|
|
|
|
/* these externs do not belong here... */
|
|
extern void IgnoreSystemIndexes(bool mode);
|
|
extern bool IsIgnoringSystemIndexes(void);
|
|
extern bool IsCacheInitialized(void);
|
|
|
|
#endif /* MISCADMIN_H */
|