aboutsummaryrefslogtreecommitdiff
path: root/src/backend
diff options
context:
space:
mode:
Diffstat (limited to 'src/backend')
-rw-r--r--src/backend/replication/slot.c29
1 files changed, 23 insertions, 6 deletions
diff --git a/src/backend/replication/slot.c b/src/backend/replication/slot.c
index 84270c493a5..d089085b491 100644
--- a/src/backend/replication/slot.c
+++ b/src/backend/replication/slot.c
@@ -2521,12 +2521,29 @@ RestoreSlotFromDisk(const char *name)
* NB: Changing the requirements here also requires adapting
* CheckSlotRequirements() and CheckLogicalDecodingRequirements().
*/
- if (cp.slotdata.database != InvalidOid && wal_level < WAL_LEVEL_LOGICAL)
- ereport(FATAL,
- (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
- errmsg("logical replication slot \"%s\" exists, but \"wal_level\" < \"logical\"",
- NameStr(cp.slotdata.name)),
- errhint("Change \"wal_level\" to be \"logical\" or higher.")));
+ if (cp.slotdata.database != InvalidOid)
+ {
+ if (wal_level < WAL_LEVEL_LOGICAL)
+ ereport(FATAL,
+ (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
+ errmsg("logical replication slot \"%s\" exists, but \"wal_level\" < \"logical\"",
+ NameStr(cp.slotdata.name)),
+ errhint("Change \"wal_level\" to be \"logical\" or higher.")));
+
+ /*
+ * In standby mode, the hot standby must be enabled. This check is
+ * necessary to ensure logical slots are invalidated when they become
+ * incompatible due to insufficient wal_level. Otherwise, if the
+ * primary reduces wal_level < logical while hot standby is disabled,
+ * logical slots would remain valid even after promotion.
+ */
+ if (StandbyMode && !EnableHotStandby)
+ ereport(FATAL,
+ (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
+ errmsg("logical replication slot \"%s\" exists on the standby, but \"hot_standby\" = \"off\"",
+ NameStr(cp.slotdata.name)),
+ errhint("Change \"hot_standby\" to be \"on\".")));
+ }
else if (wal_level < WAL_LEVEL_REPLICA)
ereport(FATAL,
(errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),