Add FLUSH_UNLOGGED option to CHECKPOINT command.
authorNathan Bossart <[email protected]>
Fri, 11 Jul 2025 16:51:25 +0000 (11:51 -0500)
committerNathan Bossart <[email protected]>
Fri, 11 Jul 2025 16:51:25 +0000 (11:51 -0500)
This option, which is disabled by default, can be used to request
the checkpoint also flush dirty buffers of unlogged relations.  As
with the MODE option, the server may consolidate the options for
concurrently requested checkpoints.  For example, if one session
uses (FLUSH_UNLOGGED FALSE) and another uses (FLUSH_UNLOGGED TRUE),
the server may perform one checkpoint with FLUSH_UNLOGGED enabled.

Author: Christoph Berg <[email protected]>
Reviewed-by: Laurenz Albe <[email protected]>
Reviewed-by: Fujii Masao <[email protected]>
Reviewed-by: Dilip Kumar <[email protected]>
Discussion: https://postgr.es/m/aDnaKTEf-0dLiEfz%40msg.df7cb.de

doc/src/sgml/ref/checkpoint.sgml
src/backend/postmaster/checkpointer.c
src/bin/psql/tab-complete.in.c
src/test/regress/expected/stats.out
src/test/regress/sql/stats.sql

index 36a9e323f448791b7724298269de7ad530f04a2e..cd981cf2cab9fabad80129c28c92ff777a18aca9 100644 (file)
@@ -25,6 +25,7 @@ CHECKPOINT [ ( option [, ...] ) ]
 
 <phrase>where <replaceable class="parameter">option</replaceable> can be one of:</phrase>
 
+    FLUSH_UNLOGGED [ <replaceable class="parameter">boolean</replaceable> ]
     MODE { FAST | SPREAD }
 </synopsis>
  </refsynopsisdiv>
@@ -76,6 +77,17 @@ CHECKPOINT [ ( option [, ...] ) ]
   <title>Parameters</title>
 
   <variablelist>
+   <varlistentry>
+    <term><literal>FLUSH_UNLOGGED</literal></term>
+    <listitem>
+     <para>
+      Normally, <command>CHECKPOINT</command> does not flush dirty buffers of
+      unlogged relations.  This option, which is disabled by default, enables
+      flushing unlogged relations to disk.
+     </para>
+    </listitem>
+   </varlistentry>
+
    <varlistentry>
     <term><literal>MODE</literal></term>
     <listitem>
@@ -93,6 +105,20 @@ CHECKPOINT [ ( option [, ...] ) ]
      </para>
     </listitem>
    </varlistentry>
+
+   <varlistentry>
+    <term><replaceable class="parameter">boolean</replaceable></term>
+    <listitem>
+     <para>
+      Specifies whether the selected option should be turned on or off.
+      You can write <literal>TRUE</literal>, <literal>ON</literal>, or
+      <literal>1</literal> to enable the option, and <literal>FALSE</literal>,
+      <literal>OFF</literal>, or <literal>0</literal> to disable it.  The
+      <replaceable class="parameter">boolean</replaceable> value can also
+      be omitted, in which case <literal>TRUE</literal> is assumed.
+     </para>
+    </listitem>
+   </varlistentry>
   </variablelist>
  </refsect1>
 
index 9d77269a3744cfb2e9ee6206d2764956b157ff05..2809e298a44fbee1a0035b75a8c1724843853859 100644 (file)
@@ -989,6 +989,7 @@ void
 ExecCheckpoint(ParseState *pstate, CheckPointStmt *stmt)
 {
    bool        fast = true;
+   bool        unlogged = false;
 
    foreach_ptr(DefElem, opt, stmt->options)
    {
@@ -1004,6 +1005,8 @@ ExecCheckpoint(ParseState *pstate, CheckPointStmt *stmt)
                         errmsg("unrecognized MODE option \"%s\"", mode),
                         parser_errposition(pstate, opt->location)));
        }
+       else if (strcmp(opt->defname, "flush_unlogged") == 0)
+           unlogged = defGetBoolean(opt);
        else
            ereport(ERROR,
                    (errcode(ERRCODE_SYNTAX_ERROR),
@@ -1022,6 +1025,7 @@ ExecCheckpoint(ParseState *pstate, CheckPointStmt *stmt)
 
    RequestCheckpoint(CHECKPOINT_WAIT |
                      (fast ? CHECKPOINT_FAST : 0) |
+                     (unlogged ? CHECKPOINT_FLUSH_UNLOGGED : 0) |
                      (RecoveryInProgress() ? 0 : CHECKPOINT_FORCE));
 }
 
index a7db04efd93e476dc1c2faa85833bdffc10eaa4e..6872653c6c82800776e1f19cde19816f1d5d9c74 100644 (file)
@@ -3165,7 +3165,7 @@ match_previous_words(int pattern_id,
         * one word, so the above test is correct.
         */
        if (ends_with(prev_wd, '(') || ends_with(prev_wd, ','))
-           COMPLETE_WITH("MODE");
+           COMPLETE_WITH("MODE", "FLUSH_UNLOGGED");
        else if (TailMatches("MODE"))
            COMPLETE_WITH("FAST", "SPREAD");
    }
index b4df9ad596007028812e2b5a3b6d6b219add60f2..605f50703769a3e7cfaa2ef09ff5978c8c6d1728 100644 (file)
@@ -937,8 +937,8 @@ CHECKPOINT (MODE WRONG);
 ERROR:  unrecognized MODE option "wrong"
 LINE 1: CHECKPOINT (MODE WRONG);
                     ^
-CHECKPOINT (MODE FAST);
-CHECKPOINT;
+CHECKPOINT (MODE FAST, FLUSH_UNLOGGED FALSE);
+CHECKPOINT (FLUSH_UNLOGGED);
 SELECT num_requested > :rqst_ckpts_before FROM pg_stat_checkpointer;
  ?column? 
 ----------
index 0868b250a649a11878149ab498324da33f0eb8cf..54e7286634452bc853f484f970bb84dec2882ce3 100644 (file)
@@ -444,8 +444,8 @@ DROP TABLE test_stats_temp;
 -- because it would prolong the test.
 CHECKPOINT (WRONG);
 CHECKPOINT (MODE WRONG);
-CHECKPOINT (MODE FAST);
-CHECKPOINT;
+CHECKPOINT (MODE FAST, FLUSH_UNLOGGED FALSE);
+CHECKPOINT (FLUSH_UNLOGGED);
 
 SELECT num_requested > :rqst_ckpts_before FROM pg_stat_checkpointer;
 SELECT wal_bytes > :wal_bytes_before FROM pg_stat_wal;