mirror of
https://github.com/postgres/postgres.git
synced 2025-07-11 10:01:57 +03:00
Introduce wal_level GUC to explicitly control if information needed for
archival or hot standby should be WAL-logged, instead of deducing that from other options like archive_mode. This replaces recovery_connections GUC in the primary, where it now has no effect, but it's still used in the standby to enable/disable hot standby. Remove the WAL-logging of "unlogged operations", like creating an index without WAL-logging and fsyncing it at the end. Instead, we keep a copy of the wal_mode setting and the settings that affect how much shared memory a hot standby server needs to track master transactions (max_connections, max_prepared_xacts, max_locks_per_xact) in pg_control. Whenever the settings change, at server restart, write a WAL record noting the new settings and update pg_control. This allows us to notice the change in those settings in the standby at the right moment, they used to be included in checkpoint records, but that meant that a changed value was not reflected in the standby until the first checkpoint after the change. Bump PG_CONTROL_VERSION and XLOG_PAGE_MAGIC. Whack XLOG_PAGE_MAGIC back to the sequence it used to follow, before hot standby and subsequent patches changed it to 0x9003.
This commit is contained in:
@ -6,7 +6,7 @@
|
||||
* Portions Copyright (c) 1996-2010, PostgreSQL Global Development Group
|
||||
* Portions Copyright (c) 1994, Regents of the University of California
|
||||
*
|
||||
* $PostgreSQL: pgsql/src/include/access/xlog.h,v 1.109 2010/04/20 11:15:06 rhaas Exp $
|
||||
* $PostgreSQL: pgsql/src/include/access/xlog.h,v 1.110 2010/04/28 16:10:43 heikki Exp $
|
||||
*/
|
||||
#ifndef XLOG_H
|
||||
#define XLOG_H
|
||||
@ -195,24 +195,26 @@ extern int XLogArchiveTimeout;
|
||||
extern bool log_checkpoints;
|
||||
extern bool XLogRequestRecoveryConnections;
|
||||
extern int MaxStandbyDelay;
|
||||
/* WAL levels */
|
||||
typedef enum WalLevel
|
||||
{
|
||||
WAL_LEVEL_MINIMAL = 0,
|
||||
WAL_LEVEL_ARCHIVE,
|
||||
WAL_LEVEL_HOT_STANDBY
|
||||
} WalLevel;
|
||||
extern int wal_level;
|
||||
|
||||
#define XLogArchivingActive() (XLogArchiveMode)
|
||||
#define XLogArchivingActive() (XLogArchiveMode && wal_level >= WAL_LEVEL_ARCHIVE)
|
||||
#define XLogArchiveCommandSet() (XLogArchiveCommand[0] != '\0')
|
||||
|
||||
/*
|
||||
* This is in walsender.c, but declared here so that we don't need to include
|
||||
* walsender.h in all files that check XLogIsNeeded()
|
||||
* Is WAL-logging necessary for archival or log-shipping, or can we skip
|
||||
* WAL-logging if we fsync() the data before committing instead?
|
||||
*/
|
||||
extern int max_wal_senders;
|
||||
|
||||
/*
|
||||
* Is WAL-logging necessary? We need to log an XLOG record iff either
|
||||
* WAL archiving is enabled or XLOG streaming is allowed.
|
||||
*/
|
||||
#define XLogIsNeeded() (XLogArchivingActive() || (max_wal_senders > 0))
|
||||
#define XLogIsNeeded() (wal_level >= WAL_LEVEL_ARCHIVE)
|
||||
|
||||
/* Do we need to WAL-log information required only for Hot Standby? */
|
||||
#define XLogStandbyInfoActive() (XLogRequestRecoveryConnections && XLogIsNeeded())
|
||||
#define XLogStandbyInfoActive() (wal_level >= WAL_LEVEL_HOT_STANDBY)
|
||||
|
||||
#ifdef WAL_DEBUG
|
||||
extern bool XLOG_DEBUG;
|
||||
@ -293,7 +295,6 @@ extern void InitXLOGAccess(void);
|
||||
extern void CreateCheckPoint(int flags);
|
||||
extern bool CreateRestartPoint(int flags);
|
||||
extern void XLogPutNextOid(Oid nextOid);
|
||||
extern void XLogReportUnloggedStatement(char *reason);
|
||||
extern XLogRecPtr GetRedoRecPtr(void);
|
||||
extern XLogRecPtr GetInsertRecPtr(void);
|
||||
extern XLogRecPtr GetWriteRecPtr(void);
|
||||
|
Reference in New Issue
Block a user