RE: Added schema level support for publication.

From: "houzj(dot)fnst(at)fujitsu(dot)com" <houzj(dot)fnst(at)fujitsu(dot)com>
To: vignesh C <vignesh21(at)gmail(dot)com>
Cc: Rahila Syed <rahilasyed90(at)gmail(dot)com>, PostgreSQL Hackers <pgsql-hackers(at)lists(dot)postgresql(dot)org>, Ajin Cherian <itsajin(at)gmail(dot)com>, "tanghy(dot)fnst(at)fujitsu(dot)com" <tanghy(dot)fnst(at)fujitsu(dot)com>
Subject: RE: Added schema level support for publication.
Date: 2021-07-09 03:28:30
Message-ID: OS0PR01MB5716076A004ADA6207C9A81794189@OS0PR01MB5716.jpnprd01.prod.outlook.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-hackers

On Thursday, July 8, 2021 11:47 AM houzj(dot)fnst(at)fujitsu(dot)com <houzj(dot)fnst(at)fujitsu(dot)com> wrote
> On Wednesday, June 30, 2021 7:43 PM vignesh C <vignesh21(at)gmail(dot)com>
> wrote:
> > Thanks for reporting this issue, the attached v9 patch fixes this issue. This also
> fixes the other issue you reported at [1].
>
> Hi,
>
> I had a look at the patch, please consider following comments.

Some more commets.

Currently, postgres caches publication actions info in the
RelationData::rd_pubactions, but after applying the patch, it seems
rd_pubactions is not initialized when using schema level publication.

It cound result in some unexpected behaviour when checking if command can be
executed with current replica identity.

----
CheckCmdReplicaIdentity
...
pubactions = GetRelationPublicationActions(rel);
if (cmd == CMD_UPDATE && pubactions->pubupdate)
ereport(ERROR,
(errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
errmsg("cannot update table \"%s\" because it does not have a replica identity and publishes updates",
RelationGetRelationName(rel)),
errhint("To enable updating the table, set REPLICA IDENTITY using ALTER TABLE.")));
----
Based on the above code, we access rd_pubactions from relcache in function
GetRelationPublicationActions(), if we don't have correct publication
information, we won't get the error in publication, instead we could lead to
the failure in subscription side.

To fix, I think (1) the patch can modify the function
GetRelationPublicationActions() to get the schema level publication related to
the relation, then merge the publication action to the rd_pubactions.

In addition, (2) it seems we also need to add the relcache invalidation code
about schema level publication when alter publication options.

I attached a rough code diff about (1) and (2), the diff is based on the v9 patchset.
I hope it can help fix the above issues.

Best regards,
Hou zhijie

Attachment Content-Type Size
fix_patch application/octet-stream 5.5 KB

In response to

Responses

Browse pgsql-hackers by date

  From Date Subject
Next Message Alexey Lesovsky 2021-07-09 03:32:19 Re: Skipping logical replication transactions on subscriber side
Previous Message Quan Zongliang 2021-07-09 03:11:46 Re: bugfix: when the blocksize is 32k, the function page_header of pageinspect returns negative numbers.