Re: AlterSubscription_refresh "wrconn" wrong variable?

Japin Li <japinli@hotmail.com>

From: Japin Li <japinli@hotmail.com>
To: Peter Smith <smithpb2250@gmail.com>
Cc: Tom Lane <tgl@sss.pgh.pa.us>, Bharath Rupireddy <bharath.rupireddyforpostgres@gmail.com>, PostgreSQL Hackers <pgsql-hackers@lists.postgresql.org>
Date: 2021-05-06T09:42:31Z
Lists: pgsql-hackers
On Thu, 06 May 2021 at 17:30, Peter Smith <smithpb2250@gmail.com> wrote:
> On Thu, May 6, 2021 at 7:18 PM Japin Li <japinli@hotmail.com> wrote:
>>
>>
>> On Thu, 06 May 2021 at 17:08, Peter Smith <smithpb2250@gmail.com> wrote:
>> > On Wed, May 5, 2021 at 12:35 PM Tom Lane <tgl@sss.pgh.pa.us> wrote:
>> >>
>> >> Peter Smith <smithpb2250@gmail.com> writes:
>> >> > This patch replaces the global "wrconn" in AlterSubscription_refresh with a local variable of the same name, making it consistent with other functions in subscriptioncmds.c (e.g. DropSubscription).
>> >> > The global wrconn is only meant to be used for logical apply/tablesync worker.
>> >> > Using the global/incorrect wrconn in AlterSubscription_refresh doesn't normally cause any problems, but harm is still posslble if the apply worker ever manages to do a subscription refresh. e.g. see [1]
>> >>
>> >> Hm.  I would actually place the blame for this on whoever thought
>> >> it was okay to name a global variable something as generic as
>> >> "wrconn".   Let's rename that while we're at it, say to something
>> >> like "tablesync_wrconn" (feel free to bikeshed).
>> >
>> > PSA v3 of the patch. Same as before, but now also renames the global
>> > variable from "wrconn" to "lrep_worker_wrconn".
>> >
>>
>> Thanks for updating patch. I'm confused why we move the walrcv_connect() out of
>> PG_TRY() block?
>> +       /* Try to connect to the publisher. */
>> +       wrconn = walrcv_connect(sub->conninfo, true, sub->name, &err);
>> +       if (!wrconn)
>> +               ereport(ERROR,
>> +                               (errmsg("could not connect to the publisher: %s", err)));
>> +
>>         PG_TRY();
>>         {
>> -               /* Try to connect to the publisher. */
>> -               wrconn = walrcv_connect(sub->conninfo, true, sub->name, &err);
>> -               if (!wrconn)
>> -                       ereport(ERROR,
>> -                                       (errmsg("could not connect to the publisher: %s", err)));
>> -
>>                 /* Get the table list from publisher. */
>>                 pubrel_names = fetch_table_list(wrconn, sub->publications);
>
> Thanks for your review. Reason for moving that out of the PG_TRY are:
>
> a) It makes code now consistent with other functions using wrconn. See
> CreateSubscription, DropSubscription etc
>
> b) It means don't need the wrconn NULL check anymore in the PG_FINALLY
> so it simplifies the disconnect.
>

Thanks for your explanation!

-- 
Regrads,
Japin Li.
ChengDu WenWu Information Technology Co.,Ltd.



Commits

  1. Rename the logical replication global "wrconn"

  2. AlterSubscription_refresh: avoid stomping on global variable

  3. Logical replication support for initial data copy