Remove promote_trigger_file.
authorThomas Munro <tmunro@postgresql.org>
Mon, 28 Nov 2022 22:28:08 +0000 (11:28 +1300)
committerThomas Munro <tmunro@postgresql.org>
Mon, 28 Nov 2022 23:08:38 +0000 (12:08 +1300)
Previously, an idle startup (recovery) process would wake up every 5
seconds to have a chance to poll for promote_trigger_file, even if that
GUC was not configured.  That promotion triggering mechanism was
effectively superseded by pg_ctl promote and pg_promote() a long time
ago.  There probably aren't many users left and it's very easy to change
to the modern mechanisms, so we agreed to remove the feature.

This is part of a campaign to reduce wakeups on idle systems.

Author: Simon Riggs <simon.riggs@enterprisedb.com>
Reviewed-by: Bharath Rupireddy <bharath.rupireddyforpostgres@gmail.com>
Reviewed-by: Robert Haas <robertmhaas@gmail.com>
Reviewed-by: Thomas Munro <thomas.munro@gmail.com>
Reviewed-by: Tom Lane <tgl@sss.pgh.pa.us>
Reviewed-by: Ian Lawrence Barwick <barwick@gmail.com>
Discussion: https://postgr.es/m/CANbhV-FsjnzVOQGBpQ589%3DnWuL1Ex0Ykn74Nh1hEjp2usZSR5g%40mail.gmail.com

doc/src/sgml/appendix-obsolete-recovery-config.sgml
doc/src/sgml/config.sgml
doc/src/sgml/high-availability.sgml
src/backend/access/transam/xlogrecovery.c
src/backend/utils/misc/guc_tables.c
src/backend/utils/misc/postgresql.conf.sample
src/include/access/xlogrecovery.h

index 1cf491311403cce2e3ee6b2dbbdbc055a9a49d89..a57084ad43f476e4522491b88d9cbeb3c8fd15de 100644 (file)
    </para>
 
    <para>
-    The
-    <literal>trigger_file</literal>
-    <indexterm>
-     <primary>trigger_file</primary>
-     <see>promote_trigger_file</see>
-    </indexterm>
-    setting has been renamed to
-    <xref linkend="guc-promote-trigger-file"/>.
+    PostgreSQL 15 and below had a setting
+    <literal>promote_trigger_file</literal>, or
+    <literal>trigger_file</literal> before 12.
+    Use <command>pg_ctl promote</command> or call
+    <function>pg_promote()</function> to promote a standby instead.
    </para>
 
    <para>
index 9fd2075b1eb7cc53bed81866e78db0d6bfba9d2c..82df89b1a9e1815efff0f79f9736a0ca80212b37 100644 (file)
@@ -4610,24 +4610,6 @@ ANY <replaceable class="parameter">num_sync</replaceable> ( <replaceable class="
         </listitem>
        </varlistentry>
 
-       <varlistentry id="guc-promote-trigger-file" xreflabel="promote_trigger_file">
-        <term><varname>promote_trigger_file</varname> (<type>string</type>)
-        <indexterm>
-          <primary><varname>promote_trigger_file</varname> configuration parameter</primary>
-        </indexterm>
-        </term>
-        <listitem>
-         <para>
-          Specifies a trigger file whose presence ends recovery in the
-          standby.  Even if this value is not set, you can still promote
-          the standby using <command>pg_ctl promote</command> or calling
-          <function>pg_promote()</function>.
-          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-hot-standby" xreflabel="hot_standby">
       <term><varname>hot_standby</varname> (<type>boolean</type>)
       <indexterm>
index b2b31293972d691c94e85cb0e63e21c9ef39fce3..f18060752871a8caaf48d4fe4939c42d6161c76b 100644 (file)
@@ -653,11 +653,10 @@ protocol to make nodes agree on a serializable transactional order.
 
    <para>
     Standby mode is exited and the server switches to normal operation
-    when <command>pg_ctl promote</command> is run,
-    <function>pg_promote()</function> is called, or a trigger file is found
-    (<varname>promote_trigger_file</varname>). Before failover,
-    any WAL immediately available in the archive or in <filename>pg_wal</filename> will be
-    restored, but no attempt is made to connect to the primary.
+    when <command>pg_ctl promote</command> is run, or
+    <function>pg_promote()</function> is called. Before failover,
+    any WAL immediately available in the archive or in <filename>pg_wal</filename>
+    will be restored, but no attempt is made to connect to the primary.
    </para>
   </sect2>
 
@@ -1483,15 +1482,10 @@ synchronous_standby_names = 'ANY 2 (s1, s2, s3)'
 
    <para>
     To trigger failover of a log-shipping standby server, run
-    <command>pg_ctl promote</command>, call <function>pg_promote()</function>,
-    or create a trigger file with the file name and path specified by the
-    <varname>promote_trigger_file</varname>. If you're planning to use
-    <command>pg_ctl promote</command> or to call
-    <function>pg_promote()</function> to fail over,
-    <varname>promote_trigger_file</varname> is not required. If you're
-    setting up the reporting servers that are only used to offload read-only
-    queries from the primary, not for high availability purposes, you don't
-    need to promote it.
+    <command>pg_ctl promote</command> or call <function>pg_promote()</function>.
+    If you're setting up reporting servers that are only used to offload
+    read-only queries from the primary, not for high availability purposes,
+    you don't need to promote.
    </para>
   </sect1>
 
index cb07694aea652da1b63922bb90585ce4d36c7cc0..ffdb55fd3941852edb698737c630158fada0817e 100644 (file)
@@ -95,7 +95,6 @@ int           recovery_min_apply_delay = 0;
 /* options formerly taken from recovery.conf for XLOG streaming */
 char      *PrimaryConnInfo = NULL;
 char      *PrimarySlotName = NULL;
-char      *PromoteTriggerFile = NULL;
 bool       wal_receiver_create_temp_slot = false;
 
 /*
@@ -318,8 +317,8 @@ typedef struct XLogRecoveryCtlData
 
    /*
     * recoveryWakeupLatch is used to wake up the startup process to continue
-    * WAL replay, if it is waiting for WAL to arrive or failover trigger file
-    * to appear.
+    * WAL replay, if it is waiting for WAL to arrive or promotion to be
+    * requested.
     *
     * Note that the startup process also uses another latch, its procLatch,
     * to wait for recovery conflict. If we get rid of recoveryWakeupLatch for
@@ -2906,10 +2905,7 @@ recoveryApplyDelay(XLogReaderState *record)
    {
        ResetLatch(&XLogRecoveryCtl->recoveryWakeupLatch);
 
-       /*
-        * This might change recovery_min_apply_delay or the trigger file's
-        * location.
-        */
+       /* This might change recovery_min_apply_delay. */
        HandleStartupProcInterrupts();
 
        if (CheckForStandbyTrigger())
@@ -3155,8 +3151,8 @@ ReadRecord(XLogPrefetcher *xlogprefetcher, int emode,
  * as for waiting for the requested WAL record to arrive in standby mode.
  *
  * 'emode' specifies the log level used for reporting "file not found" or
- * "end of WAL" situations in archive recovery, or in standby mode when a
- * trigger file is found. If set to WARNING or below, XLogPageRead() returns
+ * "end of WAL" situations in archive recovery, or in standby mode when
+ * promotion is triggered. If set to WARNING or below, XLogPageRead() returns
  * XLREAD_FAIL in those situations, on higher log levels the ereport() won't
  * return.
  *
@@ -3424,7 +3420,7 @@ WaitForWALToBecomeAvailable(XLogRecPtr RecPtr, bool randAccess,
     *
     * 1. Read from either archive or pg_wal (XLOG_FROM_ARCHIVE), or just
     *    pg_wal (XLOG_FROM_PG_WAL)
-    * 2. Check trigger file
+    * 2. Check for promotion trigger request
     * 3. Read from primary server via walreceiver (XLOG_FROM_STREAM)
     * 4. Rescan timelines
     * 5. Sleep wal_retrieve_retry_interval milliseconds, and loop back to 1.
@@ -3481,10 +3477,10 @@ WaitForWALToBecomeAvailable(XLogRecPtr RecPtr, bool randAccess,
                case XLOG_FROM_PG_WAL:
 
                    /*
-                    * Check to see if the trigger file exists. Note that we
-                    * do this only after failure, so when you create the
-                    * trigger file, we still finish replaying as much as we
-                    * can from archive and pg_wal before failover.
+                    * Check to see if promotion is requested. Note that we do
+                    * this only after failure, so when you promote, we still
+                    * finish replaying as much as we can from archive and
+                    * pg_wal before failover.
                     */
                    if (StandbyMode && CheckForStandbyTrigger())
                    {
@@ -3840,14 +3836,13 @@ WaitForWALToBecomeAvailable(XLogRecPtr RecPtr, bool randAccess,
                    XLogPrefetcherComputeStats(xlogprefetcher);
 
                    /*
-                    * Wait for more WAL to arrive. Time out after 5 seconds
-                    * to react to a trigger file promptly and to check if the
-                    * WAL receiver is still active.
+                    * Wait for more WAL to arrive, when we will be woken
+                    * immediately by the WAL receiver.
                     */
                    (void) WaitLatch(&XLogRecoveryCtl->recoveryWakeupLatch,
-                                    WL_LATCH_SET | WL_TIMEOUT |
-                                    WL_EXIT_ON_PM_DEATH,
-                                    5000L, WAIT_EVENT_RECOVERY_WAL_STREAM);
+                                    WL_LATCH_SET | WL_EXIT_ON_PM_DEATH,
+                                    -1L,
+                                    WAIT_EVENT_RECOVERY_WAL_STREAM);
                    ResetLatch(&XLogRecoveryCtl->recoveryWakeupLatch);
                    break;
                }
@@ -4294,14 +4289,11 @@ SetPromoteIsTriggered(void)
 }
 
 /*
- * Check to see whether the user-specified trigger file exists and whether a
- * promote request has arrived.  If either condition holds, return true.
+ * Check whether a promote request has arrived.
  */
 static bool
 CheckForStandbyTrigger(void)
 {
-   struct stat stat_buf;
-
    if (LocalPromoteIsTriggered)
        return true;
 
@@ -4314,23 +4306,6 @@ CheckForStandbyTrigger(void)
        return true;
    }
 
-   if (PromoteTriggerFile == NULL || strcmp(PromoteTriggerFile, "") == 0)
-       return false;
-
-   if (stat(PromoteTriggerFile, &stat_buf) == 0)
-   {
-       ereport(LOG,
-               (errmsg("promote trigger file found: %s", PromoteTriggerFile)));
-       unlink(PromoteTriggerFile);
-       SetPromoteIsTriggered();
-       return true;
-   }
-   else if (errno != ENOENT)
-       ereport(ERROR,
-               (errcode_for_file_access(),
-                errmsg("could not stat promote trigger file \"%s\": %m",
-                       PromoteTriggerFile)));
-
    return false;
 }
 
index 349dd6a5379d41779b5e2c49626f4c037fa66994..1bf14eec661418e079c42392f1743c615d290bd8 100644 (file)
@@ -3819,16 +3819,6 @@ struct config_string ConfigureNamesString[] =
        check_recovery_target_lsn, assign_recovery_target_lsn, NULL
    },
 
-   {
-       {"promote_trigger_file", PGC_SIGHUP, REPLICATION_STANDBY,
-           gettext_noop("Specifies a file name whose presence ends recovery in the standby."),
-           NULL
-       },
-       &PromoteTriggerFile,
-       "",
-       NULL, NULL, NULL
-   },
-
    {
        {"primary_conninfo", PGC_SIGHUP, REPLICATION_STANDBY,
            gettext_noop("Sets the connection string to be used to connect to the sending server."),
index 868d21c351e819a3a6f8b3904a67e5819f2d587b..043864597f86240bc86172e0714ab8340732b1e9 100644 (file)
 
 #primary_conninfo = ''         # connection string to sending server
 #primary_slot_name = ''            # replication slot on sending server
-#promote_trigger_file = ''     # file name whose presence ends recovery
 #hot_standby = on          # "off" disallows queries during recovery
                    # (change requires restart)
 #max_standby_archive_delay = 30s   # max delay before canceling queries
index 0e3e246bd2ce304a1a4179eb50be5c3ebe3fd08a..f3398425d8709d7a0ddcab6def99e62233c8a513 100644 (file)
@@ -65,7 +65,6 @@ extern PGDLLIMPORT TimestampTz recoveryTargetTime;
 extern PGDLLIMPORT const char *recoveryTargetName;
 extern PGDLLIMPORT XLogRecPtr recoveryTargetLSN;
 extern PGDLLIMPORT RecoveryTargetType recoveryTarget;
-extern PGDLLIMPORT char *PromoteTriggerFile;
 extern PGDLLIMPORT bool wal_receiver_create_temp_slot;
 extern PGDLLIMPORT RecoveryTargetTimeLineGoal recoveryTargetTimeLineGoal;
 extern PGDLLIMPORT TimeLineID recoveryTargetTLIRequested;