On 1/26/16 10:56 AM, Simon Riggs wrote: > Removing one of "archive" or "hot standby" will just cause confusion and > breakage, so neither is a good choice for removal. > > What we should do is > 1. Map "archive" and "hot_standby" to one level with a new name that > indicates that it can be used for both/either backup or replication. > (My suggested name for the new level is "replica"...) > 2. Deprecate "archive" and "hot_standby" so that those will be removed > in a later release.
Updated patch to reflect these suggestions.
From a1df946bc77cb51ca149a52276175a001942d8d0 Mon Sep 17 00:00:00 2001 From: Peter Eisentraut <peter_e@gmx.net> Date: Sun, 7 Feb 2016 10:09:05 -0500 Subject: [PATCH v2] Merge wal_level "archive" and "hot_standby" into new name "replica" The distinction between "archive" and "hot_standby" existed only because at the time "hot_standby" was added, there was some uncertainty about stability. This is now a long time ago. We would like to move forward with simplifying the replication configuration, but this distinction is in the way, because a primary server cannot tell (without asking a standby or predicting the future) which one of these would be the appropriate level. Pick a new name for the combined setting to make it clearer that it covers all (non-logical) backup and replication uses. The old values are still accepted but are converted internally. --- doc/src/sgml/backup.sgml | 2 +- doc/src/sgml/config.sgml | 30 +++++++++++---------------- doc/src/sgml/high-availability.sgml | 2 +- doc/src/sgml/ref/alter_system.sgml | 2 +- doc/src/sgml/ref/pgupgrade.sgml | 2 +- src/backend/access/rmgrdesc/xlogdesc.c | 5 +++-- src/backend/access/transam/xact.c | 2 +- src/backend/access/transam/xlog.c | 20 ++++++++---------- src/backend/access/transam/xlogfuncs.c | 2 +- src/backend/postmaster/postmaster.c | 2 +- src/backend/replication/slot.c | 5 ----- src/backend/utils/misc/postgresql.conf.sample | 2 +- src/bin/pg_basebackup/t/010_pg_basebackup.pl | 2 +- src/bin/pg_controldata/pg_controldata.c | 6 ++---- src/bin/pg_rewind/RewindTest.pm | 2 +- src/include/access/xlog.h | 11 +++++----- src/include/catalog/pg_control.h | 2 +- 17 files changed, 42 insertions(+), 57 deletions(-) diff --git a/doc/src/sgml/backup.sgml b/doc/src/sgml/backup.sgml index 7413666..46017a6 100644 --- a/doc/src/sgml/backup.sgml +++ b/doc/src/sgml/backup.sgml @@ -1285,7 +1285,7 @@ <title>Standalone Hot Backups</title> If more flexibility in copying the backup files is needed, a lower level process can be used for standalone hot backups as well. To prepare for low level standalone hot backups, set <varname>wal_level</> to - <literal>archive</> or higher, <varname>archive_mode</> to + <literal>replica</> or higher, <varname>archive_mode</> to <literal>on</>, and set up an <varname>archive_command</> that performs archiving only when a <emphasis>switch file</> exists. For example: <programlisting> diff --git a/doc/src/sgml/config.sgml b/doc/src/sgml/config.sgml index 392eb70..bed7436 100644 --- a/doc/src/sgml/config.sgml +++ b/doc/src/sgml/config.sgml @@ -1971,9 +1971,9 @@ <title>Settings</title> <varname>wal_level</> determines how much information is written to the WAL. The default value is <literal>minimal</>, which writes only the information needed to recover from a crash or immediate - shutdown. <literal>archive</> adds logging required for WAL archiving; - <literal>hot_standby</> further adds information required to run - read-only queries on a standby server; and, finally + shutdown. <literal>replica</> adds logging required for WAL + archiving as well as information required to run + read-only queries on a standby server. Finally, <literal>logical</> adds information necessary to support logical decoding. Each level includes the information logged at all lower levels. This parameter can only be set at server start. @@ -1991,30 +1991,24 @@ <title>Settings</title> transaction</member> </simplelist> But minimal WAL does not contain enough information to reconstruct the - data from a base backup and the WAL logs, so <literal>archive</> or + data from a base backup and the WAL logs, so <literal>replica</> or higher must be used to enable WAL archiving (<xref linkend="guc-archive-mode">) and streaming replication. </para> <para> - In <literal>hot_standby</> level, the same information is logged as - with <literal>archive</>, plus information needed to reconstruct - the status of running transactions from the WAL. To enable read-only - queries on a standby server, <varname>wal_level</> must be set to - <literal>hot_standby</> or higher on the primary, and - <xref linkend="guc-hot-standby"> must be enabled in the standby. It is - thought that there is little measurable difference in performance - between using <literal>hot_standby</> and <literal>archive</> levels, - so feedback is welcome if any production impacts are noticeable. - </para> - <para> In <literal>logical</> level, the same information is logged as - with <literal>hot_standby</>, plus information needed to allow + with <literal>replica</>, plus information needed to allow extracting logical change sets from the WAL. Using a level of <literal>logical</> will increase the WAL volume, particularly if many tables are configured for <literal>REPLICA IDENTITY FULL</literal> and many <command>UPDATE</> and <command>DELETE</> statements are executed. </para> + <para> + In releases prior to 9.6, this parameter also allowed the + values <literal>archive</literal> and <literal>hot_standby</literal>. + These are still accepted but mapped to <literal>replica</literal>. + </para> </listitem> </varlistentry> @@ -2674,7 +2668,7 @@ <title>Sending Server(s)</title> higher than the maximum number of expected clients so disconnected clients can immediately reconnect. This parameter can only be set at server start. <varname>wal_level</> must be set to - <literal>archive</> or higher to allow connections from standby + <literal>replica</> or higher to allow connections from standby servers. </para> </listitem> @@ -2693,7 +2687,7 @@ <title>Sending Server(s)</title> can support. The default is zero. This parameter can only be set at server start. <varname>wal_level</varname> must be set - to <literal>archive</literal> or higher to allow replication slots to + to <literal>replica</literal> or higher to allow replication slots to be used. Setting it to a lower value than the number of currently existing replication slots will prevent the server from starting. </para> diff --git a/doc/src/sgml/high-availability.sgml b/doc/src/sgml/high-availability.sgml index 6cb690c..19d613e 100644 --- a/doc/src/sgml/high-availability.sgml +++ b/doc/src/sgml/high-availability.sgml @@ -1988,7 +1988,7 @@ <title>Administrator's Overview</title> Consistency information is recorded once per checkpoint on the primary. It is not possible to enable hot standby when reading WAL written during a period when <varname>wal_level</> was not set to - <literal>hot_standby</> or <literal>logical</> on the primary. Reaching + <literal>replica</> or <literal>logical</> on the primary. Reaching a consistent state can also be delayed in the presence of both of these conditions: diff --git a/doc/src/sgml/ref/alter_system.sgml b/doc/src/sgml/ref/alter_system.sgml index f6a018f..00fd8d7 100644 --- a/doc/src/sgml/ref/alter_system.sgml +++ b/doc/src/sgml/ref/alter_system.sgml @@ -108,7 +108,7 @@ <title>Examples</title> <para> Set the <literal>wal_level</>: <programlisting> -ALTER SYSTEM SET wal_level = hot_standby; +ALTER SYSTEM SET wal_level = replica; </programlisting> </para> diff --git a/doc/src/sgml/ref/pgupgrade.sgml b/doc/src/sgml/ref/pgupgrade.sgml index eb113c2..b99e546 100644 --- a/doc/src/sgml/ref/pgupgrade.sgml +++ b/doc/src/sgml/ref/pgupgrade.sgml @@ -477,7 +477,7 @@ <title>Start and stop the new master cluster</title> <para> In the new master cluster, change <varname>wal_level</> to - <literal>hot_standby</> in the <filename>postgresql.conf</> file + <literal>replica</> in the <filename>postgresql.conf</> file and then start and stop the cluster. </para> </step> diff --git a/src/backend/access/rmgrdesc/xlogdesc.c b/src/backend/access/rmgrdesc/xlogdesc.c index b694dea..1953e86 100644 --- a/src/backend/access/rmgrdesc/xlogdesc.c +++ b/src/backend/access/rmgrdesc/xlogdesc.c @@ -25,8 +25,9 @@ */ const struct config_enum_entry wal_level_options[] = { {"minimal", WAL_LEVEL_MINIMAL, false}, - {"archive", WAL_LEVEL_ARCHIVE, false}, - {"hot_standby", WAL_LEVEL_HOT_STANDBY, false}, + {"replica", WAL_LEVEL_REPLICA, false}, + {"archive", WAL_LEVEL_REPLICA, true}, /* deprecated */ + {"hot_standby", WAL_LEVEL_REPLICA, true}, /* deprecated */ {"logical", WAL_LEVEL_LOGICAL, false}, {NULL, 0, false} }; diff --git a/src/backend/access/transam/xact.c b/src/backend/access/transam/xact.c index b0d5440..1f27563 100644 --- a/src/backend/access/transam/xact.c +++ b/src/backend/access/transam/xact.c @@ -1254,7 +1254,7 @@ RecordTransactionCommit(void) * this case, but we don't currently try to do that. It would certainly * cause problems at least in Hot Standby mode, where the * KnownAssignedXids machinery requires tracking every XID assignment. It - * might be OK to skip it only when wal_level < hot_standby, but for now + * might be OK to skip it only when wal_level < replica, but for now * we don't.) * * However, if we're doing cleanup of any non-temp rels or committing any diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index a2846c4..5cee5b0 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -5836,7 +5836,7 @@ static void CheckRequiredParameterValues(void) { /* - * For archive recovery, the WAL must be generated with at least 'archive' + * For archive recovery, the WAL must be generated with at least 'replica' * wal_level. */ if (ArchiveRecoveryRequested && ControlFile->wal_level == WAL_LEVEL_MINIMAL) @@ -5847,15 +5847,15 @@ CheckRequiredParameterValues(void) } /* - * For Hot Standby, the WAL must be generated with 'hot_standby' mode, and + * For Hot Standby, the WAL must be generated with 'replica' mode, and * we must have at least as many backend slots as the primary. */ if (ArchiveRecoveryRequested && EnableHotStandby) { - if (ControlFile->wal_level < WAL_LEVEL_HOT_STANDBY) + if (ControlFile->wal_level < WAL_LEVEL_REPLICA) ereport(ERROR, - (errmsg("hot standby is not possible because wal_level was not set to \"hot_standby\" or higher on the master server"), - errhint("Either set wal_level to \"hot_standby\" on the master, or turn off hot_standby here."))); + (errmsg("hot standby is not possible because wal_level was not set to \"replica\" or higher on the master server"), + errhint("Either set wal_level to \"replica\" on the master, or turn off hot_standby here."))); /* We ignore autovacuum_max_workers when we make this test. */ RecoveryRequiresIntParameter("max_connections", @@ -9445,10 +9445,8 @@ xlog_redo(XLogReaderState *record) /* * Update minRecoveryPoint to ensure that if recovery is aborted, we * recover back up to this point before allowing hot standby again. - * This is particularly important if wal_level was set to 'archive' - * before, and is now 'hot_standby', to ensure you don't run queries - * against the WAL preceding the wal_level change. Same applies to - * decreasing max_* settings. + * This is important if the max_* settings are decreased, to ensure + * you don't run queries against the WAL preceding the change. */ minRecoveryPoint = ControlFile->minRecoveryPoint; minRecoveryPointTLI = ControlFile->minRecoveryPointTLI; @@ -9779,7 +9777,7 @@ do_pg_start_backup(const char *backupidstr, bool fast, TimeLineID *starttli_p, ereport(ERROR, (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), errmsg("WAL level not sufficient for making an online backup"), - errhint("wal_level must be set to \"archive\", \"hot_standby\", or \"logical\" at server start."))); + errhint("wal_level must be set to \"replica\" or \"logical\" at server start."))); if (strlen(backupidstr) > MAXPGPATH) ereport(ERROR, @@ -10250,7 +10248,7 @@ do_pg_stop_backup(char *labelfile, bool waitforarchive, TimeLineID *stoptli_p) ereport(ERROR, (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), errmsg("WAL level not sufficient for making an online backup"), - errhint("wal_level must be set to \"archive\", \"hot_standby\", or \"logical\" at server start."))); + errhint("wal_level must be set to \"replica\" or \"logical\" at server start."))); /* * OK to update backup counters and forcePageWrites diff --git a/src/backend/access/transam/xlogfuncs.c b/src/backend/access/transam/xlogfuncs.c index 31cbb01..9ec6b2a 100644 --- a/src/backend/access/transam/xlogfuncs.c +++ b/src/backend/access/transam/xlogfuncs.c @@ -154,7 +154,7 @@ pg_create_restore_point(PG_FUNCTION_ARGS) ereport(ERROR, (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), errmsg("WAL level not sufficient for creating a restore point"), - errhint("wal_level must be set to \"archive\", \"hot_standby\", or \"logical\" at server start."))); + errhint("wal_level must be set to \"replica\" or \"logical\" at server start."))); restore_name_str = text_to_cstring(restore_name); diff --git a/src/backend/postmaster/postmaster.c b/src/backend/postmaster/postmaster.c index b16fc28..6cf51e1 100644 --- a/src/backend/postmaster/postmaster.c +++ b/src/backend/postmaster/postmaster.c @@ -858,7 +858,7 @@ PostmasterMain(int argc, char *argv[]) (errmsg("WAL archival cannot be enabled when wal_level is \"minimal\""))); if (max_wal_senders > 0 && wal_level == WAL_LEVEL_MINIMAL) ereport(ERROR, - (errmsg("WAL streaming (max_wal_senders > 0) requires wal_level \"archive\", \"hot_standby\", or \"logical\""))); + (errmsg("WAL streaming (max_wal_senders > 0) requires wal_level \"replica\" or \"logical\""))); /* * Other one-time internal sanity checks can go here, if they are fast. diff --git a/src/backend/replication/slot.c b/src/backend/replication/slot.c index 11b44a4..5ca5e13 100644 --- a/src/backend/replication/slot.c +++ b/src/backend/replication/slot.c @@ -759,11 +759,6 @@ CheckSlotRequirements(void) ereport(ERROR, (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), (errmsg("replication slots can only be used if max_replication_slots > 0")))); - - if (wal_level < WAL_LEVEL_ARCHIVE) - ereport(ERROR, - (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), - errmsg("replication slots can only be used if wal_level >= archive"))); } /* diff --git a/src/backend/utils/misc/postgresql.conf.sample b/src/backend/utils/misc/postgresql.conf.sample index 029114f..0c2500a 100644 --- a/src/backend/utils/misc/postgresql.conf.sample +++ b/src/backend/utils/misc/postgresql.conf.sample @@ -173,7 +173,7 @@ # - Settings - -#wal_level = minimal # minimal, archive, hot_standby, or logical +#wal_level = minimal # minimal, replica, or logical # (change requires restart) #fsync = on # turns forced synchronization on or off #synchronous_commit = on # synchronization level; diff --git a/src/bin/pg_basebackup/t/010_pg_basebackup.pl b/src/bin/pg_basebackup/t/010_pg_basebackup.pl index a275077..e26b875 100644 --- a/src/bin/pg_basebackup/t/010_pg_basebackup.pl +++ b/src/bin/pg_basebackup/t/010_pg_basebackup.pl @@ -43,7 +43,7 @@ open CONF, ">>$pgdata/postgresql.conf"; print CONF "max_replication_slots = 10\n"; print CONF "max_wal_senders = 10\n"; -print CONF "wal_level = archive\n"; +print CONF "wal_level = replica\n"; close CONF; $node->restart; diff --git a/src/bin/pg_controldata/pg_controldata.c b/src/bin/pg_controldata/pg_controldata.c index e7e072f..b6b6173 100644 --- a/src/bin/pg_controldata/pg_controldata.c +++ b/src/bin/pg_controldata/pg_controldata.c @@ -75,10 +75,8 @@ wal_level_str(WalLevel wal_level) { case WAL_LEVEL_MINIMAL: return "minimal"; - case WAL_LEVEL_ARCHIVE: - return "archive"; - case WAL_LEVEL_HOT_STANDBY: - return "hot_standby"; + case WAL_LEVEL_REPLICA: + return "replica"; case WAL_LEVEL_LOGICAL: return "logical"; } diff --git a/src/bin/pg_rewind/RewindTest.pm b/src/bin/pg_rewind/RewindTest.pm index 68834cd..c740b64 100644 --- a/src/bin/pg_rewind/RewindTest.pm +++ b/src/bin/pg_rewind/RewindTest.pm @@ -122,7 +122,7 @@ sub setup_cluster # Custom parameters for master's postgresql.conf $node_master->append_conf( "postgresql.conf", qq( -wal_level = hot_standby +wal_level = replica max_wal_senders = 2 wal_keep_segments = 20 max_wal_size = 200MB diff --git a/src/include/access/xlog.h b/src/include/access/xlog.h index ecd30ce..74a1394 100644 --- a/src/include/access/xlog.h +++ b/src/include/access/xlog.h @@ -121,25 +121,24 @@ extern int XLogArchiveMode; typedef enum WalLevel { WAL_LEVEL_MINIMAL = 0, - WAL_LEVEL_ARCHIVE, - WAL_LEVEL_HOT_STANDBY, + WAL_LEVEL_REPLICA, WAL_LEVEL_LOGICAL } WalLevel; extern int wal_level; /* Is WAL archiving enabled (always or only while server is running normally)? */ #define XLogArchivingActive() \ - (XLogArchiveMode > ARCHIVE_MODE_OFF && wal_level >= WAL_LEVEL_ARCHIVE) + (AssertMacro(XLogArchiveMode == ARCHIVE_MODE_OFF || wal_level >= WAL_LEVEL_REPLICA), XLogArchiveMode > ARCHIVE_MODE_OFF) /* Is WAL archiving enabled always (even during recovery)? */ #define XLogArchivingAlways() \ - (XLogArchiveMode == ARCHIVE_MODE_ALWAYS && wal_level >= WAL_LEVEL_ARCHIVE) + (AssertMacro(XLogArchiveMode == ARCHIVE_MODE_OFF || wal_level >= WAL_LEVEL_REPLICA), XLogArchiveMode == ARCHIVE_MODE_ALWAYS) #define XLogArchiveCommandSet() (XLogArchiveCommand[0] != '\0') /* * Is WAL-logging necessary for archival or log-shipping, or can we skip * WAL-logging if we fsync() the data before committing instead? */ -#define XLogIsNeeded() (wal_level >= WAL_LEVEL_ARCHIVE) +#define XLogIsNeeded() (wal_level >= WAL_LEVEL_REPLICA) /* * Is a full-page image needed for hint bit updates? @@ -153,7 +152,7 @@ extern int wal_level; #define XLogHintBitIsNeeded() (DataChecksumsEnabled() || wal_log_hints) /* Do we need to WAL-log information required only for Hot Standby and logical replication? */ -#define XLogStandbyInfoActive() (wal_level >= WAL_LEVEL_HOT_STANDBY) +#define XLogStandbyInfoActive() (wal_level >= WAL_LEVEL_REPLICA) /* Do we need to WAL-log information required only for logical replication? */ #define XLogLogicalInfoActive() (wal_level >= WAL_LEVEL_LOGICAL) diff --git a/src/include/catalog/pg_control.h b/src/include/catalog/pg_control.h index 86fbdce..7ba396d 100644 --- a/src/include/catalog/pg_control.h +++ b/src/include/catalog/pg_control.h @@ -54,7 +54,7 @@ typedef struct CheckPoint /* * Oldest XID still running. This is only needed to initialize hot standby * mode from an online checkpoint, so we only bother calculating this for - * online checkpoints and only when wal_level is hot_standby. Otherwise + * online checkpoints and only when wal_level is replica. Otherwise * it's set to InvalidTransactionId. */ TransactionId oldestActiveXid; -- 2.7.1
-- Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-hackers