From 22f7e61a63306873211e26c7bac9c68631309aef Mon Sep 17 00:00:00 2001 From: Amit Kapila Date: Wed, 7 Feb 2024 10:04:04 +0530 Subject: [PATCH] Clean-ups for 776621a5e4 and 7329240437. Following are a few clean-ups related to failover option support in slots: 1. Improve the documentation in create_subscription.sgml. 2. Remove the spurious blank line in subscriptioncmds.c. 3. Remove the NOTICE for alter_replication_slot in subscriptioncmds.c as we would sometimes print it even when nothing has changed. One can find the change by enabling log_replication_commands on the publisher. 4. Optimize ReplicationSlotAlter() function to prevent disk flushing when the slot's data remains unchanged. Author: Hou Zhijie Reviewed-by: Amit Kapila Discussion: https://postgr.es/m/514f6f2f-6833-4539-39f1-96cd1e011f23@enterprisedb.com Discussion: https://postgr.es/m/OS0PR01MB57164904651FB588A518E98894472@OS0PR01MB5716.jpnprd01.prod.outlook.com --- doc/src/sgml/ref/create_subscription.sgml | 5 ++--- doc/src/sgml/ref/pg_dump.sgml | 4 +--- src/backend/commands/subscriptioncmds.c | 8 -------- src/backend/replication/slot.c | 14 +++++++++----- 4 files changed, 12 insertions(+), 19 deletions(-) diff --git a/doc/src/sgml/ref/create_subscription.sgml b/doc/src/sgml/ref/create_subscription.sgml index ee89ffb1d1..15794731bb 100644 --- a/doc/src/sgml/ref/create_subscription.sgml +++ b/doc/src/sgml/ref/create_subscription.sgml @@ -117,9 +117,8 @@ CREATE SUBSCRIPTION subscription_nametrue. Setting this to false will force the values of - create_slot, enabled, - copy_data, and failover - to false. + create_slot, enabled and + copy_data to false. (You cannot combine setting connect to false with setting create_slot, enabled, diff --git a/doc/src/sgml/ref/pg_dump.sgml b/doc/src/sgml/ref/pg_dump.sgml index f8ae4220e1..0caf56e0e0 100644 --- a/doc/src/sgml/ref/pg_dump.sgml +++ b/doc/src/sgml/ref/pg_dump.sgml @@ -1591,9 +1591,7 @@ CREATE DATABASE foo WITH TEMPLATE template0; information might have to be changed. If the subscription needs to be enabled for failover, - then same needs to be done by executing - - ALTER SUBSCRIPTION ... SET (failover = true) + execute ALTER SUBSCRIPTION ... SET (failover = true) after the slot has been created. It might also be appropriate to truncate the target tables before initiating a new full table copy. If users intend to copy initial data during refresh they must create the slot with diff --git a/src/backend/commands/subscriptioncmds.c b/src/backend/commands/subscriptioncmds.c index a400ba0e40..a05d69922d 100644 --- a/src/backend/commands/subscriptioncmds.c +++ b/src/backend/commands/subscriptioncmds.c @@ -73,7 +73,6 @@ #define SUBOPT_LSN 0x00004000 #define SUBOPT_ORIGIN 0x00008000 - /* check if the 'val' has 'bits' set */ #define IsSet(val, bits) (((val) & (bits)) == (bits)) @@ -852,9 +851,6 @@ CreateSubscription(ParseState *pstate, CreateSubscriptionStmt *stmt, (opts.failover || walrcv_server_version(wrconn) >= 170000)) { walrcv_alter_slot(wrconn, opts.slot_name, opts.failover); - ereport(NOTICE, - (errmsg("changed the failover state of replication slot \"%s\" on publisher to %s", - opts.slot_name, opts.failover ? "true" : "false"))); } } PG_FINALLY(); @@ -1547,10 +1543,6 @@ AlterSubscription(ParseState *pstate, AlterSubscriptionStmt *stmt, PG_TRY(); { walrcv_alter_slot(wrconn, sub->slotname, opts.failover); - - ereport(NOTICE, - (errmsg("changed the failover state of replication slot \"%s\" on publisher to %s", - sub->slotname, opts.failover ? "true" : "false"))); } PG_FINALLY(); { diff --git a/src/backend/replication/slot.c b/src/backend/replication/slot.c index 110cb59783..fd4e96c9d6 100644 --- a/src/backend/replication/slot.c +++ b/src/backend/replication/slot.c @@ -696,12 +696,16 @@ ReplicationSlotAlter(const char *name, bool failover) errmsg("cannot use %s with a physical replication slot", "ALTER_REPLICATION_SLOT")); - SpinLockAcquire(&MyReplicationSlot->mutex); - MyReplicationSlot->data.failover = failover; - SpinLockRelease(&MyReplicationSlot->mutex); + if (MyReplicationSlot->data.failover != failover) + { + SpinLockAcquire(&MyReplicationSlot->mutex); + MyReplicationSlot->data.failover = failover; + SpinLockRelease(&MyReplicationSlot->mutex); + + ReplicationSlotMarkDirty(); + ReplicationSlotSave(); + } - ReplicationSlotMarkDirty(); - ReplicationSlotSave(); ReplicationSlotRelease(); }