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.
Advertising
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