walsender-shutdown-fix.patch
application/octet-stream
Filename: walsender-shutdown-fix.patch
Type: application/octet-stream
Part: 0
Patch
Format: unified
| File | + | − |
|---|---|---|
| src/backend/replication/walsender.c | 18 | 1 |
diff --git a/src/backend/replication/walsender.c b/src/backend/replication/walsender.c
index dbb10c7b00..0fc3a14765 100644
--- a/src/backend/replication/walsender.c
+++ b/src/backend/replication/walsender.c
@@ -844,6 +844,14 @@ CreateReplicationSlot(CreateReplicationSlotCmd *cmd)
Assert(!MyReplicationSlot);
+ /*
+ * If WAL sender is shutting down, prevent CREATE_REPLICATION_SLOT as it
+ * could result in the generation of new WAL data.
+ */
+ if (walsender_ready_to_stop)
+ ereport(ERROR,
+ (errmsg("CREATE_REPLICATION_SLOT cannot be called during WAL sender shutdown")));
+
parseCreateReplSlotOptions(cmd, &reserve_wal, &snapshot_action);
/* setup state for XLogReadPage */
@@ -1019,6 +1027,14 @@ CreateReplicationSlot(CreateReplicationSlotCmd *cmd)
static void
DropReplicationSlot(DropReplicationSlotCmd *cmd)
{
+ /*
+ * If WAL sender is shutting down, prevent DROP_REPLICATION_SLOT as it
+ * could result in the generation of new WAL data.
+ */
+ if (walsender_ready_to_stop)
+ ereport(ERROR,
+ (errmsg("DROP_REPLICATION_SLOT cannot be called during WAL sender shutdown")));
+
ReplicationSlotDrop(cmd->slotname);
EndCommand("DROP_REPLICATION_SLOT", DestRemote);
}
@@ -2840,6 +2856,8 @@ WalSndLastCycleHandler(SIGNAL_ARGS)
{
int save_errno = errno;
+ walsender_ready_to_stop = true;
+
/*
* If replication has not yet started, die like with SIGTERM. If
* replication is active, only set a flag and wake up the main loop. It
@@ -2849,7 +2867,6 @@ WalSndLastCycleHandler(SIGNAL_ARGS)
if (!replication_active)
kill(MyProcPid, SIGTERM);
- walsender_ready_to_stop = true;
SetLatch(MyLatch);
errno = save_errno;