Re: logical streaming of xacts via test_decoding is broken - Mailing list pgsql-hackers

From Dilip Kumar
Subject Re: logical streaming of xacts via test_decoding is broken
Date
Msg-id CAFiTN-v0a_e49Lou+AbnvDp9-Vi50=z3fg8aMkH-zVPfwiwGRA@mail.gmail.com
Whole thread Raw
In response to Re: logical streaming of xacts via test_decoding is broken  (Dilip Kumar <dilipbalaut@gmail.com>)
Responses Re: logical streaming of xacts via test_decoding is broken  (Amit Kapila <amit.kapila16@gmail.com>)
List pgsql-hackers
On Mon, Nov 9, 2020 at 1:34 PM Dilip Kumar <dilipbalaut@gmail.com> wrote:
>
> On Mon, Nov 9, 2020 at 11:31 AM Amit Kapila <amit.kapila16@gmail.com> wrote:
> >
> > On Mon, Nov 9, 2020 at 11:21 AM Dilip Kumar <dilipbalaut@gmail.com> wrote:
> > >
> > > On Mon, Nov 9, 2020 at 11:04 AM Dilip Kumar <dilipbalaut@gmail.com> wrote:
> > > >
> > > > On Mon, Nov 9, 2020 at 11:00 AM Amit Kapila <amit.kapila16@gmail.com> wrote:
> > > > >
> > > > > Michael reported a BF failure [1] related to one of the logical
> > > > > streaming test case and I've analyzed the issue. As responded on
> > > > > pgsql-committers [2], the issue here is that the streaming
> > > > > transactions can be interleaved and because we are maintaining whether
> > > > > xact_wrote_changes at the LogicalDecodingContext level, one of later
> > > > > transaction can overwrite the flag for previously streaming
> > > > > transaction. I think it is logical to have this flag at each
> > > > > transaction level (aka in ReorderBufferTxn), however till now it was
> > > > > fine because the changes of each transaction are decoded at one-shot
> > > > > which will be no longer true. We can keep a output_plugin_private data
> > > > > pointer in ReorderBufferTxn which will be used by test_decoding module
> > > > > to keep this and any other such flags in future. We need to set this
> > > > > flag at begin_cb and stream_start_cb APIs and then reset/remove it at
> > > > > stream_commit_cb, stream_abort_cb and stream_stop_cb APIs.
> > >
> > > So IIUC, we need to keep 'output_plugin_private' in
> > > LogicalDecodingContext as well as in ReorderBufferTxn,  So the
> > > output_plugin_private in the ReorderBufferTxn will currently just keep
> > > one flag xact_wrote_changes and the remaining things will still be
> > > maintained in output_plugin_private of the LogicalDecodingContext.  Is
> > > my understanding correct?
> > >
> >
> > Yes. But keep it as void * so that we can add more things later if required.
>
> Yeah, that makes sense to me.

I have made some POC changes and analyzed this further,  I think that
for the streaming transaction we need 2 flags
1) xact_wrote_changes 2) stream_wrote_changes

So basically, if the stream didn't make any changes we can skip the
stream start and stream stop message for the empty stream, but if any
of the streams has made any change then we need to emit the
transaction commit message.  But if we want to avoid tracking the
changes per stream then maybe once we set the xact_wrote_changes to
true once for the txn then we better emit the message for all the
stream without tracking whether the stream is empty or not.  What is
your thought on this?

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



pgsql-hackers by date:

Previous
From: Seino Yuki
Date:
Subject: Re: [PATCH] Add features to pg_stat_statements
Next
From: Kyotaro Horiguchi
Date:
Subject: Re: Protect syscache from bloating with negative cache entries