From 173b56f1ef597251fe79d8e71a0df7586ea12549 Mon Sep 17 00:00:00 2001
From: Michael Paquier
Date: Wed, 18 Oct 2023 11:24:59 +0900
Subject: Add flush option to pg_logical_emit_message()
Since its introduction, LogLogicalMessage() (via the SQL interface
pg_logical_emit_message()) has never included a call to XLogFlush(),
causing it to potentially lose messages on a crash when used in
non-transactional mode. This has come up to me as a problem while
playing with ideas to design a test suite for what has become
039_end_of_wal.pl introduced in bae868caf222 by Thomas Munro, because
there are no direct ways to force a WAL flush via SQL.
The default is false, to not flush messages and influence existing
use-cases where this function could be used. If set to true, the
message emitted is flushed before returning back to the caller, making
the message durable on crash. This new option has no effect when using
pg_logical_emit_message() in transactional mode, as the record's flush
is guaranteed by the WAL record generated by the transaction committed.
Two queries of test_decoding are tweaked to cover the new code path for
the flush.
Bump catalog version.
Author: Michael Paquier
Reviewed-by: Andres Freund, Amit Kapila, Fujii Masao, Tung Nguyen, Tomas
Vondra
Discussion: https://postgr.es/m/ZNsdThSe2qgsfs7R@paquier.xyz
---
doc/src/sgml/func.sgml | 9 +++++++--
1 file changed, 7 insertions(+), 2 deletions(-)
(limited to 'doc/src')
diff --git a/doc/src/sgml/func.sgml b/doc/src/sgml/func.sgml
index affd1254bb7..7c3e940afef 100644
--- a/doc/src/sgml/func.sgml
+++ b/doc/src/sgml/func.sgml
@@ -27740,11 +27740,11 @@ postgres=# SELECT '0/0'::pg_lsn + pd.segment_number * ps.setting::int + :offset
pg_logical_emit_message
- pg_logical_emit_message ( transactional boolean, prefix text, content text )
+ pg_logical_emit_message ( transactional boolean, prefix text, content text [, flush boolean DEFAULT false] )
pg_lsn
- pg_logical_emit_message ( transactional boolean, prefix text, content bytea )
+ pg_logical_emit_message ( transactional boolean, prefix text, content bytea [, flush boolean DEFAULT false] )
pg_lsn
@@ -27758,6 +27758,11 @@ postgres=# SELECT '0/0'::pg_lsn + pd.segment_number * ps.setting::int + :offset
recognize messages that are interesting for them.
The content parameter is the content of the
message, given either in text or binary form.
+ The flush parameter (default set to
+ false) controls if the message is immediately
+ flushed to WAL or not. flush has no effect
+ with transactional, as the message's WAL
+ record is flushed along with its transaction.
--
cgit v1.2.3