Re: Time delayed LR (WAS Re: logical replication restrictions) - Mailing list pgsql-hackers
From | Peter Smith |
---|---|
Subject | Re: Time delayed LR (WAS Re: logical replication restrictions) |
Date | |
Msg-id | CAHut+Psqx5xNmQrHcmsJ_NEsoTE+cs2tgdOGQ+89_UEzyft34A@mail.gmail.com Whole thread Raw |
In response to | RE: Time delayed LR (WAS Re: logical replication restrictions) ("Takamichi Osumi (Fujitsu)" <osumi.takamichi@fujitsu.com>) |
Responses |
Re: Time delayed LR (WAS Re: logical replication restrictions)
|
List | pgsql-hackers |
Here are my review comments for patch v26-0001. On Thu, Feb 2, 2023 at 7:18 PM Takamichi Osumi (Fujitsu) <osumi.takamichi@fujitsu.com> wrote: > > Hi, > > On Wednesday, February 1, 2023 1:37 PM Peter Smith <smithpb2250@gmail.com> wrote: > > Here are my review comments for the patch v25-0001. > Thank you for your review ! > > > 8. > > + if (IsSet(supported_opts, SUBOPT_MIN_APPLY_DELAY) && > > + opts->min_apply_delay > 0 && opts->streaming == > > + opts->LOGICALREP_STREAM_PARALLEL) > > + ereport(ERROR, > > + errcode(ERRCODE_SYNTAX_ERROR), > > > > Saying "> 0" (in the condition) is not strictly necessary here, since it is never < 0. > This check is necessary. > > For example, imagine a case when we CREATE a subscription with streaming = on > and then try to ALTER the subscription with streaming = parallel > without any settings for min_apply_delay. The ALTER command > throws an error of "min_apply_delay > 0 and streaming = parallel are > mutually exclusive options." then. > > This is because min_apply_delay is supported by ALTER command > (so the first condition becomes true) and we set > streaming = parallel (which makes the 2nd condition true). > > So, we need to check the opts's actual min_apply_delay value > to make the irrelavent case pass. I think there is some misunderstanding. I was not suggesting removing the condition -- only that I thought it could be written without the > 0 as: if (IsSet(supported_opts, SUBOPT_MIN_APPLY_DELAY) && opts->min_apply_delay && opts->streaming == LOGICALREP_STREAM_PARALLEL) ereport(ERROR, > > ~~~ > > > > 9. AlterSubscription > > > > + /* > > + * The combination of parallel streaming mode and > > + * min_apply_delay is not allowed. See > > + * parse_subscription_options for details of the reason. > > + */ > > + if (opts.streaming == LOGICALREP_STREAM_PARALLEL) if > > + ((IsSet(opts.specified_opts, SUBOPT_MIN_APPLY_DELAY) && > > opts.min_apply_delay > 0) || > > + (!IsSet(opts.specified_opts, SUBOPT_MIN_APPLY_DELAY) && > > sub->minapplydelay > 0)) > > > > Saying "> 0" (in the condition) is not strictly necessary here, since it is never < 0. > This is also necessary. > > For example, imagine a case that > there is a subscription whose min_apply_delay is 1 day. > Then, you want to try to execute ALTER SUBSCRIPTION > with (min_apply_delay = 0, streaming = parallel). > If we remove the condition of otps.min_apply_delay > 0, > then we error out in this case too. > > First we pass the first condition > of the opts.streaming == LOGICALREP_STREAM_PARALLEL, > since we use streaming option. > Then, we also set min_apply_delay in this example, > then without checking the value of min_apply_delay, > the second condition becomes true > (IsSet(opts.specified_opts, SUBOPT_MIN_APPLY_DELAY)). > > So, we need to make this case(min_apply_delay = 0) pass. > Meanwhile, checking the "sub" value is necessary for checking existing subscription value. I think there is some misunderstanding. I was not suggesting removing the condition -- only that I thought it could be written without the > 0 as:: if (opts.streaming == LOGICALREP_STREAM_PARALLEL) if ((IsSet(opts.specified_opts, SUBOPT_MIN_APPLY_DELAY) && opts.min_apply_delay) || (!IsSet(opts.specified_opts, SUBOPT_MIN_APPLY_DELAY) && sub->minapplydelay)) ereport(ERROR, > > ~~~ > > > > 10. > > + if (IsSet(opts.specified_opts, SUBOPT_MIN_APPLY_DELAY)) { > > + /* > > + * The combination of parallel streaming mode and > > + * min_apply_delay is not allowed. > > + */ > > + if (opts.min_apply_delay > 0) > > > > Saying "> 0" (in the condition) is not strictly necessary here, since it is never < 0. > This is also required to check the value equals to 0 or not. > Kindly imagine a case when we want to execute ALTER min_apply_delay from 1day > with a pair of (min_apply_delay = 0 and > streaming = parallel). If we remove this check, then this ALTER command fails > with error. Without the check, when we set min_apply_delay > and parallel streaming mode, even when making the min_apply_delay 0, > the error is invoked. > > The check for sub.stream is necessary for existing definition of target subscription. I think there is some misunderstanding. I was not suggesting removing the condition -- only that I thought it could be written without the > 0 as:: if (opts.min_apply_delay) if ((IsSet(opts.specified_opts, SUBOPT_STREAMING) && opts.streaming == LOGICALREP_STREAM_PARALLEL) || (!IsSet(opts.specified_opts, SUBOPT_STREAMING) && sub->stream == LOGICALREP_STREAM_PARALLEL)) ereport(ERROR, ------ Kind Regards, Peter Smith. Fujitsu Australia
pgsql-hackers by date: