summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNathan Bossart2025-07-11 16:51:25 +0000
committerNathan Bossart2025-07-11 16:51:25 +0000
commit8d33fbacbac93ed70757ea47cd8a4b4fae61528a (patch)
tree686537ac3a6740bca6b7739ec0de78d30a6c13c4
parent2f698d7f4b7b4c49c3649b2fcc063eb66f9d2e6c (diff)
Add FLUSH_UNLOGGED option to CHECKPOINT command.
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
-rw-r--r--doc/src/sgml/ref/checkpoint.sgml26
-rw-r--r--src/backend/postmaster/checkpointer.c4
-rw-r--r--src/bin/psql/tab-complete.in.c2
-rw-r--r--src/test/regress/expected/stats.out4
-rw-r--r--src/test/regress/sql/stats.sql4
5 files changed, 35 insertions, 5 deletions
diff --git a/doc/src/sgml/ref/checkpoint.sgml b/doc/src/sgml/ref/checkpoint.sgml
index 36a9e323f44..cd981cf2cab 100644
--- a/doc/src/sgml/ref/checkpoint.sgml
+++ b/doc/src/sgml/ref/checkpoint.sgml
@@ -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>
@@ -77,6 +78,17 @@ CHECKPOINT [ ( option [, ...] ) ]
<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>
<para>
@@ -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>
diff --git a/src/backend/postmaster/checkpointer.c b/src/backend/postmaster/checkpointer.c
index 9d77269a374..2809e298a44 100644
--- a/src/backend/postmaster/checkpointer.c
+++ b/src/backend/postmaster/checkpointer.c
@@ -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));
}
diff --git a/src/bin/psql/tab-complete.in.c b/src/bin/psql/tab-complete.in.c
index a7db04efd93..6872653c6c8 100644
--- a/src/bin/psql/tab-complete.in.c
+++ b/src/bin/psql/tab-complete.in.c
@@ -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");
}
diff --git a/src/test/regress/expected/stats.out b/src/test/regress/expected/stats.out
index b4df9ad5960..605f5070376 100644
--- a/src/test/regress/expected/stats.out
+++ b/src/test/regress/expected/stats.out
@@ -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?
----------
diff --git a/src/test/regress/sql/stats.sql b/src/test/regress/sql/stats.sql
index 0868b250a64..54e72866344 100644
--- a/src/test/regress/sql/stats.sql
+++ b/src/test/regress/sql/stats.sql
@@ -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;