Hi, here are my review comments for patch v19-0002. ====== src/backend/commands/subscriptioncmds.c
CheckAlterSubOption: nitpick - tweak some comment wording ~ On Wed, Jul 17, 2024 at 3:13 PM Hayato Kuroda (Fujitsu) <kuroda.hay...@fujitsu.com> wrote: > > > 1c. > > If the error checks can be moved to be done up-front, then all the > > 'needs_update' > > can be combined. Avoiding multiple checks to 'needs_update' will make this > > function simpler. > > This style was needed to preserve error condition for failover option. Not > changed. > nitpick - Hmm. I think you might be trying to preserve the ordering of errors when that order is of no consequence. AFAICT which error comes first here is neither documented nor regression tested. e.g. reordering them gives no problem for testing, but OTOH reordering them does simplify the code. Anyway, I have modified the code in my attached nitpicks diffs to demonstrate this suggestion in case you change your mind. ~~~ AlterSubscription: nitpick - let's keep all the variables called 'update_xxx' together. nitpick - comment typo /needs/need/ nitpick - tweak some comment wording ====== src/test/subscription/t/021_twophase.pl nitpick - didn't quite understand the "Since we are..." comment. I reworded it according to what I thought was the intention. ====== Kind Regards, Peter Smith. Fujitsu Australia
diff --git a/src/backend/commands/subscriptioncmds.c b/src/backend/commands/subscriptioncmds.c index f770e9c..a826be9 100644 --- a/src/backend/commands/subscriptioncmds.c +++ b/src/backend/commands/subscriptioncmds.c @@ -1079,17 +1079,6 @@ CheckAlterSubOption(Subscription *sub, const char *option, strcmp(option, "two_phase") == 0); /* - * If the slot needs to be updated, the backend must connect to the - * publisher and request the alteration. slot_name must be required at that - * time. - */ - if (slot_needs_update && !sub->slotname) - ereport(ERROR, - (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), - errmsg("cannot set %s for a subscription that does not have a slot name", - option))); - - /* * Do not allow changing the option if the subscription is enabled. This * is because both failover and two_phase options of the slot on the * publisher cannot be modified if the slot is currently acquired by the @@ -1101,17 +1090,27 @@ CheckAlterSubOption(Subscription *sub, const char *option, errmsg("cannot set %s for enabled subscription", option))); - /* - * The changed option of the slot can't be rolled back, so disallow if we - * are in a transaction block. - */ if (slot_needs_update) { StringInfoData cmd; + /* + * If the slot needs to be updated, the backend must connect to the + * publisher and request the alteration. A slot_name is required at + * that time. + */ + if (!sub->slotname) + ereport(ERROR, + (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), + errmsg("cannot set %s for a subscription that does not have a slot name", + option))); + + /* + * The changed option of the slot can't be rolled back, so disallow if we + * are in a transaction block. + */ initStringInfo(&cmd); appendStringInfo(&cmd, "ALTER SUBSCRIPTION ... SET (%s)", option); - PreventInTransactionBlock(isTopLevel, cmd.data); pfree(cmd.data); } @@ -1132,12 +1131,12 @@ AlterSubscription(ParseState *pstate, AlterSubscriptionStmt *stmt, HeapTuple tup; Oid subid; bool update_tuple = false; + bool update_failover = false; + bool update_two_phase = false; Subscription *sub; Form_pg_subscription form; bits32 supported_opts; SubOpts opts = {0}; - bool update_failover = false; - bool update_two_phase = false; rel = table_open(SubscriptionRelationId, RowExclusiveLock); @@ -1271,7 +1270,7 @@ AlterSubscription(ParseState *pstate, AlterSubscriptionStmt *stmt, if (IsSet(opts.specified_opts, SUBOPT_FAILOVER)) { /* - * First, mark the needs to alter the replication slot. + * First, mark the need to alter the replication slot. * Failover option is controlled by both the publisher (as * a slot option) and the subscriber (as a subscription * option). @@ -1295,15 +1294,14 @@ AlterSubscription(ParseState *pstate, AlterSubscriptionStmt *stmt, * subscription option). The slot option must be altered * only when changing "true" to "false". * - * There is no need to do something remarkable regarding + * There is no need to do anything remarkable for * the "false" to "true" case; the backend process alters * subtwophase to LOGICALREP_TWOPHASE_STATE_PENDING once. * After the subscription is enabled, a new logical * replication worker requests to change the two_phase * option of its slot from pending to true when the - * initial data synchronization is done. The code path is - * the same as the case in which two_phase is initially - * set to true. + * initial data synchronization is done. That code path is + * the same as when two_phase is initially set to true. */ update_two_phase = !opts.twophase; diff --git a/src/test/subscription/t/021_twophase.pl b/src/test/subscription/t/021_twophase.pl index c8fb3b7..91e2e17 100644 --- a/src/test/subscription/t/021_twophase.pl +++ b/src/test/subscription/t/021_twophase.pl @@ -428,9 +428,8 @@ is($result, qq(0), 'should be no prepared transactions on subscriber'); ############################### # Toggle the two_phase to "true" before the COMMIT PREPARED. -# -# Since we are the special path for the case where both two_phase -# and failover are altered, it is also set to "true". +# Also, set failover to "true" to test the code path where +# both two_phase and failover are altered at the same time. ############################### $node_subscriber->safe_psql('postgres', "ALTER SUBSCRIPTION tap_sub_copy DISABLE;");