On 14.09.22 07:25, Michael Paquier wrote:
     removed or recycled until they are archived. If WAL archiving cannot keep 
up
-   with the pace that WAL is generated, or if 
<varname>archive_command</varname>
+   with the pace that WAL is generated, or if 
<varname>archive_library</varname>
     fails repeatedly, old WAL files will accumulate in 
<filename>pg_wal</filename>

with

     removed or recycled until they are archived. If WAL archiving cannot keep 
up
     with the pace that WAL is generated, or if 
<varname>archive_command</varname>
     with the pace that WAL is generated, or if 
<varname>archive_command</varname>
     or <varname>archive_library</varname>
     fail repeatedly, old WAL files will accumulate in 
<filename>pg_wal</filename>

Yep.  Some references to archive_library have been changed by 31e121
to do exactly that.  There seem to be more spots in need of an
update.

I don't see anything in 31e121 about that.

Here is a patch that addresses this.
From 51512cd9cb59d169b041d10d62fc6a282011675c Mon Sep 17 00:00:00 2001
From: Peter Eisentraut <pe...@eisentraut.org>
Date: Wed, 14 Sep 2022 21:26:10 +0200
Subject: [PATCH] Restore archive_command documentation

Commit 5ef1eefd76f404ddc59b885d50340e602b70f05f, which added
archive_library, purged most mentions of archive_command from the
documentation.  This is inappropriate, since archive_command is still
a feature in use and users will want to see information about it.

This restores all the removed mentions and rephrases things so that
archive_command and archive_library are presented as alternatives of
each other.
---
 doc/src/sgml/backup.sgml            | 50 +++++++++++++++++--------
 doc/src/sgml/config.sgml            | 58 +++++++++++++++--------------
 doc/src/sgml/high-availability.sgml |  6 +--
 doc/src/sgml/ref/pg_receivewal.sgml |  7 +++-
 doc/src/sgml/wal.sgml               |  3 +-
 5 files changed, 76 insertions(+), 48 deletions(-)

diff --git a/doc/src/sgml/backup.sgml b/doc/src/sgml/backup.sgml
index dee59bb422..a6d7105836 100644
--- a/doc/src/sgml/backup.sgml
+++ b/doc/src/sgml/backup.sgml
@@ -593,7 +593,7 @@ <title>Setting Up WAL Archiving</title>
     provide the database administrator with flexibility,
     <productname>PostgreSQL</productname> tries not to make any assumptions 
about how
     the archiving will be done.  Instead, 
<productname>PostgreSQL</productname> lets
-    the administrator specify an archive library to be executed to copy a
+    the administrator specify a shell command or an archive library to be 
executed to copy a
     completed segment file to wherever it needs to go.  This could be as simple
     as a shell command that uses <literal>cp</literal>, or it could invoke a
     complex C function &mdash; it's all up to you.
@@ -603,13 +603,15 @@ <title>Setting Up WAL Archiving</title>
     To enable WAL archiving, set the <xref linkend="guc-wal-level"/>
     configuration parameter to <literal>replica</literal> or higher,
     <xref linkend="guc-archive-mode"/> to <literal>on</literal>,
-    and specify the library to use in the <xref
+    specify the shell command to use in the <xref
+    linkend="guc-archive-command"/> configuration parameter
+    or specify the library to use in the <xref
     linkend="guc-archive-library"/> configuration parameter.  In practice
     these settings will always be placed in the
     <filename>postgresql.conf</filename> file.
-    One simple way to archive is to set <varname>archive_library</varname> to
-    an empty string and to specify a shell command in
-    <xref linkend="guc-archive-command"/>.
+   </para>
+
+   <para>
     In <varname>archive_command</varname>,
     <literal>%p</literal> is replaced by the path name of the file to
     archive, while <literal>%f</literal> is replaced by only the file name.
@@ -633,6 +635,24 @@ <title>Setting Up WAL Archiving</title>
     A similar command will be generated for each new file to be archived.
    </para>
 
+   <para>
+    It is important that the archive command return zero exit status if and
+    only if it succeeds.  Upon getting a zero result,
+    <productname>PostgreSQL</productname> will assume that the file has been
+    successfully archived, and will remove or recycle it.  However, a nonzero
+    status tells <productname>PostgreSQL</productname> that the file was not 
archived;
+    it will try again periodically until it succeeds.
+   </para>
+
+   <para>
+    When the archive command is terminated by a signal (other than
+    <systemitem>SIGTERM</systemitem> that is used as part of a server
+    shutdown) or an error by the shell with an exit status greater than
+    125 (such as command not found), the archiver process aborts and gets
+    restarted by the postmaster. In such cases, the failure is
+    not reported in <xref linkend="pg-stat-archiver-view"/>.
+   </para>
+
    <para>
     Another way to archive is to use a custom archive module as the
     <varname>archive_library</varname>.  Since such modules are written in
@@ -678,7 +698,7 @@ <title>Setting Up WAL Archiving</title>
    </para>
 
    <para>
-    The archive library should generally be designed to refuse to overwrite
+    Archive commands and libraries should generally be designed to refuse to 
overwrite
     any pre-existing archive file.  This is an important safety feature to
     preserve the integrity of your archive in case of administrator error
     (such as sending the output of two different servers to the same archive
@@ -686,9 +706,9 @@ <title>Setting Up WAL Archiving</title>
    </para>
 
    <para>
-    It is advisable to test your proposed archive library to ensure that it
+    It is advisable to test your proposed archive command or library to ensure 
that it
     indeed does not overwrite an existing file, <emphasis>and that it returns
-    <literal>false</literal> in this case</emphasis>.
+    nonzero status or <literal>false</literal>, respectively, in this 
case</emphasis>.
     The example command above for Unix ensures this by including a separate
     <command>test</command> step.  On some Unix platforms, 
<command>cp</command> has
     switches such as <option>-i</option> that can be used to do the same thing
@@ -700,7 +720,7 @@ <title>Setting Up WAL Archiving</title>
 
    <para>
     While designing your archiving setup, consider what will happen if
-    the archive library fails repeatedly because some aspect requires
+    the archive command or library fails repeatedly because some aspect 
requires
     operator intervention or the archive runs out of space. For example, this
     could occur if you write to tape without an autochanger; when the tape
     fills, nothing further can be archived until the tape is swapped.
@@ -715,7 +735,7 @@ <title>Setting Up WAL Archiving</title>
    </para>
 
    <para>
-    The speed of the archive library is unimportant as long as it can keep up
+    The speed of the archive command or library is unimportant as long as it 
can keep up
     with the average rate at which your server generates WAL data.  Normal
     operation continues even if the archiving process falls a little behind.
     If archiving falls significantly behind, this will increase the amount of
@@ -727,7 +747,7 @@ <title>Setting Up WAL Archiving</title>
    </para>
 
    <para>
-    In writing your archive library, you should assume that the file names to
+    In writing your archive command or library, you should assume that the 
file names to
     be archived can be up to 64 characters long and can contain any
     combination of ASCII letters, digits, and dots.  It is not necessary to
     preserve the original relative path but it is necessary to preserve the 
file
@@ -748,7 +768,7 @@ <title>Setting Up WAL Archiving</title>
    </para>
 
    <para>
-    The archive function is only invoked on completed WAL segments.  Hence,
+    The archive command or function is only invoked on completed WAL segments. 
 Hence,
     if your server generates only little WAL traffic (or has slack periods
     where it does so), there could be a long delay between the completion
     of a transaction and its safe recording in archive storage.  To put
@@ -777,7 +797,7 @@ <title>Setting Up WAL Archiving</title>
     turned on during execution of one of these statements, WAL would not
     contain enough information for archive recovery.  (Crash recovery is
     unaffected.)  For this reason, <varname>wal_level</varname> can only be 
changed at
-    server start.  However, <varname>archive_library</varname> can be changed 
with a
+    server start.  However, <varname>archive_command</varname> and 
<varname>archive_library</varname> can be changed with a
     configuration file reload.  If you are archiving via shell and wish to
     temporarily stop archiving,
     one way to do it is to set <varname>archive_command</varname> to the empty
@@ -947,12 +967,12 @@ <title>Making a Base Backup Using the Low Level 
API</title>
      On a standby, <varname>archive_mode</varname> must be 
<literal>always</literal> in order
      for <function>pg_backup_stop</function> to wait.
      Archiving of these files happens automatically since you have
-     already configured <varname>archive_library</varname> or
+     already configured <varname>archive_command</varname> or 
<varname>archive_library</varname> or
      <varname>archive_command</varname>.
      In most cases this happens quickly, but you are advised to monitor your
      archive system to ensure there are no delays.
      If the archive process has fallen behind because of failures of the
-     archive library or archive command, it will keep retrying
+     archive command or library, it will keep retrying
      until the archive succeeds and the backup is complete.
      If you wish to place a time limit on the execution of
      <function>pg_backup_stop</function>, set an appropriate
diff --git a/doc/src/sgml/config.sgml b/doc/src/sgml/config.sgml
index 5aac7110b1..09c7a6116a 100644
--- a/doc/src/sgml/config.sgml
+++ b/doc/src/sgml/config.sgml
@@ -3496,7 +3496,7 @@ <title>Checkpoints</title>
         Maximum size to let the WAL grow during automatic
         checkpoints. This is a soft limit; WAL size can exceed
         <varname>max_wal_size</varname> under special circumstances, such as
-        heavy load, a failing <varname>archive_library</varname>, or a high
+        heavy load, a failing <varname>archive_command</varname> or 
<varname>archive_library</varname>, or a high
         <varname>wal_keep_size</varname> setting.
         If this value is specified without units, it is taken as megabytes.
         The default is 1 GB.
@@ -3545,6 +3545,7 @@ <title>Archiving</title>
        <para>
         When <varname>archive_mode</varname> is enabled, completed WAL segments
         are sent to archive storage by setting
+        <xref linkend="guc-archive-command"/> or
         <xref linkend="guc-archive-library"/>. In addition to 
<literal>off</literal>,
         to disable, there are two modes: <literal>on</literal>, and
         <literal>always</literal>. During normal operation, there is no
@@ -3555,6 +3556,9 @@ <title>Archiving</title>
         <xref linkend="continuous-archiving-in-standby"/> for details.
        </para>
        <para>
+        <varname>archive_mode</varname> and <varname>archive_command</varname> 
are
+        separate variables so that <varname>archive_command</varname> can be
+        changed without leaving archiving mode.
         This parameter can only be set at server start.
         <varname>archive_mode</varname> cannot be enabled when
         <varname>wal_level</varname> is set to <literal>minimal</literal>.
@@ -3562,28 +3566,6 @@ <title>Archiving</title>
       </listitem>
      </varlistentry>
 
-     <varlistentry id="guc-archive-library" xreflabel="archive_library">
-      <term><varname>archive_library</varname> (<type>string</type>)
-      <indexterm>
-       <primary><varname>archive_library</varname> configuration 
parameter</primary>
-      </indexterm>
-      </term>
-      <listitem>
-       <para>
-        The library to use for archiving completed WAL file segments.  If set 
to
-        an empty string (the default), archiving via shell is enabled, and
-        <xref linkend="guc-archive-command"/> is used.  Otherwise, the 
specified
-        shared library is used for archiving.  For more information, see
-        <xref linkend="backup-archiving-wal"/> and
-        <xref linkend="archive-modules"/>.
-       </para>
-       <para>
-        This parameter can only be set in the
-        <filename>postgresql.conf</filename> file or on the server command 
line.
-       </para>
-      </listitem>
-     </varlistentry>
-
      <varlistentry id="guc-archive-command" xreflabel="archive_command">
       <term><varname>archive_command</varname> (<type>string</type>)
       <indexterm>
@@ -3607,10 +3589,10 @@ <title>Archiving</title>
         This parameter can only be set in the 
<filename>postgresql.conf</filename>
         file or on the server command line.  It is ignored unless
         <varname>archive_mode</varname> was enabled at server start and
-        <varname>archive_library</varname> specifies to archive via shell 
command.
+        <varname>archive_library</varname> is set to an empty string.
         If <varname>archive_command</varname> is an empty string (the default) 
while
-        <varname>archive_mode</varname> is enabled and 
<varname>archive_library</varname>
-        specifies archiving via shell, WAL archiving is temporarily
+        <varname>archive_mode</varname> is enabled (and 
<varname>archive_library</varname>
+        is set to an empty string), WAL archiving is temporarily
         disabled, but the server continues to accumulate WAL segment files in
         the expectation that a command will soon be provided.  Setting
         <varname>archive_command</varname> to a command that does nothing but
@@ -3622,6 +3604,28 @@ <title>Archiving</title>
       </listitem>
      </varlistentry>
 
+     <varlistentry id="guc-archive-library" xreflabel="archive_library">
+      <term><varname>archive_library</varname> (<type>string</type>)
+      <indexterm>
+       <primary><varname>archive_library</varname> configuration 
parameter</primary>
+      </indexterm>
+      </term>
+      <listitem>
+       <para>
+        The library to use for archiving completed WAL file segments.  If set 
to
+        an empty string (the default), archiving via shell is enabled, and
+        <xref linkend="guc-archive-command"/> is used.  Otherwise, the 
specified
+        shared library is used for archiving.  For more information, see
+        <xref linkend="backup-archiving-wal"/> and
+        <xref linkend="archive-modules"/>.
+       </para>
+       <para>
+        This parameter can only be set in the
+        <filename>postgresql.conf</filename> file or on the server command 
line.
+       </para>
+      </listitem>
+     </varlistentry>
+
      <varlistentry id="guc-archive-timeout" xreflabel="archive_timeout">
       <term><varname>archive_timeout</varname> (<type>integer</type>)
       <indexterm>
@@ -3630,7 +3634,7 @@ <title>Archiving</title>
       </term>
       <listitem>
        <para>
-        The <xref linkend="guc-archive-library"/> is only invoked for
+        The <xref linkend="guc-archive-command"/> or <xref 
linkend="guc-archive-library"/> is only invoked for
         completed WAL segments. Hence, if your server generates little WAL
         traffic (or has slack periods where it does so), there could be a
         long delay between the completion of a transaction and its safe
diff --git a/doc/src/sgml/high-availability.sgml 
b/doc/src/sgml/high-availability.sgml
index 3df4cda716..b2b3129397 100644
--- a/doc/src/sgml/high-availability.sgml
+++ b/doc/src/sgml/high-availability.sgml
@@ -935,7 +935,7 @@ <title>Replication Slots</title>
     In lieu of using replication slots, it is possible to prevent the removal
     of old WAL segments using <xref linkend="guc-wal-keep-size"/>, or by
     storing the segments in an archive using
-    <xref linkend="guc-archive-library"/>.
+    <xref linkend="guc-archive-command"/> or <xref 
linkend="guc-archive-library"/>.
     However, these methods often result in retaining more WAL segments than
     required, whereas replication slots retain only the number of segments
     known to be needed.  On the other hand, replication slots can retain so
@@ -1386,10 +1386,10 @@ <title>Continuous Archiving in Standby</title>
      to <literal>always</literal>, and the standby will call the archive
      command for every WAL segment it receives, whether it's by restoring
      from the archive or by streaming replication. The shared archive can
-     be handled similarly, but the <varname>archive_library</varname> must
+     be handled similarly, but the <varname>archive_command</varname> or 
<varname>archive_library</varname> must
      test if the file being archived exists already, and if the existing file
      has identical contents. This requires more care in the
-     <varname>archive_library</varname>, as it must
+     <varname>archive_command</varname> or <varname>archive_library</varname>, 
as it must
      be careful to not overwrite an existing file with different contents,
      but return success if the exactly same file is archived twice. And
      all that must be done free of race conditions, if two servers attempt
diff --git a/doc/src/sgml/ref/pg_receivewal.sgml 
b/doc/src/sgml/ref/pg_receivewal.sgml
index 4fe9e1a874..7138a8e3f6 100644
--- a/doc/src/sgml/ref/pg_receivewal.sgml
+++ b/doc/src/sgml/ref/pg_receivewal.sgml
@@ -40,7 +40,8 @@ <title>Description</title>
   <para>
    <application>pg_receivewal</application> streams the write-ahead
    log in real time as it's being generated on the server, and does not wait
-   for segments to complete like <xref linkend="guc-archive-library"/> does.
+   for segments to complete like <xref linkend="guc-archive-command"/> and
+   <xref linkend="guc-archive-library"/> does.
    For this reason, it is not necessary to set
    <xref linkend="guc-archive-timeout"/> when using
     <application>pg_receivewal</application>.
@@ -486,11 +487,13 @@ <title>Notes</title>
 
   <para>
    When using <application>pg_receivewal</application> instead of
+   <xref linkend="guc-archive-command"/> or
    <xref linkend="guc-archive-library"/> as the main WAL backup method, it is
    strongly recommended to use replication slots.  Otherwise, the server is
    free to recycle or remove write-ahead log files before they are backed up,
    because it does not have any information, either
-   from <xref linkend="guc-archive-library"/> or the replication slots, about
+   from <xref linkend="guc-archive-command"/> or
+   <xref linkend="guc-archive-library"/> or the replication slots, about
    how far the WAL stream has been archived.  Note, however, that a
    replication slot will fill up the server's disk space if the receiver does
    not keep up with fetching the WAL data.
diff --git a/doc/src/sgml/wal.sgml b/doc/src/sgml/wal.sgml
index 4b6ef283c1..27fb020a06 100644
--- a/doc/src/sgml/wal.sgml
+++ b/doc/src/sgml/wal.sgml
@@ -636,7 +636,8 @@ <title><acronym>WAL</acronym> Configuration</title>
    WAL files plus one additional WAL file are
    kept at all times. Also, if WAL archiving is used, old segments cannot be
    removed or recycled until they are archived. If WAL archiving cannot keep up
-   with the pace that WAL is generated, or if 
<varname>archive_library</varname>
+   with the pace that WAL is generated, or if 
<varname>archive_command</varname>
+   or <varname>archive_library</varname>
    fails repeatedly, old WAL files will accumulate in 
<filename>pg_wal</filename>
    until the situation is resolved. A slow or failed standby server that
    uses a replication slot will have the same effect (see
-- 
2.37.3

Reply via email to