On Fri, Sep 2, 2022 at 11:25 AM kuroda.hay...@fujitsu.com
<kuroda.hay...@fujitsu.com> wrote:
>
> Dear Horiguchi-san, Dilip,
>
> Thank you for replying!
>
> > > It seems that SnapBuildCommitTxn() is already taking care of adding
> > > the top transaction to the committed transaction if any subtransaction
> > > has the catalog changes, it has just missed setting the flag so I
> > > think just setting the flag like this should be sufficient no?
> >
> > Oops! That's right.
>
> Basically I agreed, but I was not sure the message "found top level 
> transaction..."
> should be output or not. It may be useful even if one of sub transactions 
> contains the change.
>
> How about following?
>
> diff --git a/src/backend/replication/logical/snapbuild.c 
> b/src/backend/replication/logical/snapbuild.c
> index bf72ad45ec..a630522907 100644
> --- a/src/backend/replication/logical/snapbuild.c
> +++ b/src/backend/replication/logical/snapbuild.c
> @@ -1086,8 +1086,17 @@ SnapBuildCommitTxn(SnapBuild *builder, XLogRecPtr lsn, 
> TransactionId xid,
>                 }
>         }
>
> -       /* if top-level modified catalog, it'll need a snapshot */
> -       if (SnapBuildXidHasCatalogChanges(builder, xid, xinfo))
> +       /*
> +        * if top-level or one of sub modified catalog, it'll need a snapshot.
> +        *
> +        * Normally the second check is not needed because the relation 
> between
> +        * top-sub transactions is tracked on the ReorderBuffer layer, and 
> the top
> +        * transaction is marked as containing catalog changes if its 
> children are.
> +        * But in some cases the relation may be missed, in which case only 
> the sub
> +        * transaction may be marked as containing catalog changes.
> +        */
> +       if (SnapBuildXidHasCatalogChanges(builder, xid, xinfo)
> +               || sub_needs_timetravel)
>         {
>                 elog(DEBUG2, "found top level transaction %u, with catalog 
> changes",
>                          xid);
> @@ -1095,11 +1104,6 @@ SnapBuildCommitTxn(SnapBuild *builder, XLogRecPtr lsn, 
> TransactionId xid,
>                 needs_timetravel = true;
>                 SnapBuildAddCommittedTxn(builder, xid);
>         }
> -       else if (sub_needs_timetravel)
> -       {
> -               /* track toplevel txn as well, subxact alone isn't meaningful 
> */
> -               SnapBuildAddCommittedTxn(builder, xid);
> -       }
>         else if (needs_timetravel)
>         {
>                 elog(DEBUG2, "forced transaction %u to do timetravel", xid);

Yeah, I am fine with this as well.


-- 
Regards,
Dilip Kumar
EnterpriseDB: http://www.enterprisedb.com


Reply via email to