v1-0001-Avoid-unexpected-shutdown-when-sync_replication_s.patch
application/octet-stream
Filename: v1-0001-Avoid-unexpected-shutdown-when-sync_replication_s.patch
Type: application/octet-stream
Part: 0
Patch
Same data as JSON:
GET /api/v1/attachments/:id/patch
the parsed metadata as JSON — format, series position, per-file stats; never the diff bytes.
API reference →
Format: format-patch
Series: patch v1-0001
Subject: Avoid unexpected shutdown when sync_replication_slots is enabled.
| File | + | − |
|---|---|---|
| src/backend/postmaster/postmaster.c | 3 | 0 |
| src/backend/replication/logical/slotsync.c | 4 | 4 |
From 677a18132f4040cb8b9ff89cd5c62902bfced551 Mon Sep 17 00:00:00 2001
From: Fujii Masao <fujii@postgresql.org>
Date: Fri, 25 Jul 2025 02:51:45 +0900
Subject: [PATCH v1] Avoid unexpected shutdown when sync_replication_slots is
enabled.
Previously, enabling sync_replication_slots while wal_level was not set
to logical could cause the server to shut down. This was because
the postmaster performed a configuration check before launching
the slot synchronization worker and raised an ERROR if the settings
were incompatible. Since ERROR is treated as FATAL in the postmaster,
this resulted in the entire server shutting down unexpectedly.
This commit changes the postmaster to log that message with a LOG-level
instead of raising an ERROR, allowing the server to continue running
even with the misconfiguration.
Note that if this misconfiguration is detected at server startup,
the server will still shut down with a FATAL error. This behavior
remains unchanged.
Back-patch to v17, where slot synchronization was introduced.
---
src/backend/postmaster/postmaster.c | 3 +++
src/backend/replication/logical/slotsync.c | 8 ++++----
2 files changed, 7 insertions(+), 4 deletions(-)
diff --git a/src/backend/postmaster/postmaster.c b/src/backend/postmaster/postmaster.c
index cca9b946e53..d2d2f61c78f 100644
--- a/src/backend/postmaster/postmaster.c
+++ b/src/backend/postmaster/postmaster.c
@@ -854,6 +854,9 @@ PostmasterMain(int argc, char *argv[])
if (summarize_wal && wal_level == WAL_LEVEL_MINIMAL)
ereport(ERROR,
(errmsg("WAL cannot be summarized when \"wal_level\" is \"minimal\"")));
+ if (sync_replication_slots && wal_level < WAL_LEVEL_LOGICAL)
+ ereport(ERROR,
+ (errmsg("replication slot synchronization (\"sync_replication_slots\" = on) requires \"wal_level\" >= \"logical\"")));
/*
* Other one-time internal sanity checks can go here, if they are fast.
diff --git a/src/backend/replication/logical/slotsync.c b/src/backend/replication/logical/slotsync.c
index 2f0c08b8fbd..37738440113 100644
--- a/src/backend/replication/logical/slotsync.c
+++ b/src/backend/replication/logical/slotsync.c
@@ -1059,14 +1059,14 @@ ValidateSlotSyncParams(int elevel)
{
/*
* Logical slot sync/creation requires wal_level >= logical.
- *
- * Since altering the wal_level requires a server restart, so error out in
- * this case regardless of elevel provided by caller.
*/
if (wal_level < WAL_LEVEL_LOGICAL)
- ereport(ERROR,
+ {
+ ereport(elevel,
errcode(ERRCODE_INVALID_PARAMETER_VALUE),
errmsg("replication slot synchronization requires \"wal_level\" >= \"logical\""));
+ return false;
+ }
/*
* A physical replication slot(primary_slot_name) is required on the
--
2.50.1