Re: [HACKERS] logical decoding of two-phase transactions - Mailing list pgsql-hackers

From Ajin Cherian
Subject Re: [HACKERS] logical decoding of two-phase transactions
Date
Msg-id CAFPTHDabJ6fo9P7F-_z4oqVjvDXiUG2d4a8DKO+tAzRkbr1Rbg@mail.gmail.com
Whole thread Raw
In response to Re: [HACKERS] logical decoding of two-phase transactions  (Peter Smith <smithpb2250@gmail.com>)
List pgsql-hackers
On Thu, Oct 29, 2020 at 11:48 AM Peter Smith <smithpb2250@gmail.com> wrote:
>
> Hi Ajin.
>
> Looking at v13 patches again I found a couple more review comments:
>
> ===
>
> (1) COMMENT
> File: src/backend/replication/logical/proto.c
> Function: logicalrep_write_prepare
> + if (rbtxn_commit_prepared(txn))
> + flags = LOGICALREP_IS_COMMIT_PREPARED;
> + else if (rbtxn_rollback_prepared(txn))
> + flags = LOGICALREP_IS_ROLLBACK_PREPARED;
> + else
> + flags = LOGICALREP_IS_PREPARE;
> +
> + /* Make sure exactly one of the expected flags is set. */
> + if (!PrepareFlagsAreValid(flags))
> + elog(ERROR, "unrecognized flags %u in prepare message", flags);
>
> Since those flags are directly assigned, I think the subsequent if
> (!PrepareFlagsAreValid(flags)) check is redundant.
>
> ===
>

Updated this.

> (2) COMMENT
> File: src/backend/replication/logical/proto.c
> Function: logicalrep_write_stream_prepare
> +/*
> + * Write STREAM PREPARE to the output stream.
> + * (For stream PREPARE, stream COMMIT PREPARED, stream ROLLBACK PREPARED)
> + */
>
> I think the function comment is outdated because IIUC the stream
> COMMIT PREPARED and stream ROLLBACK PREPARED are not being handled by
> the function logicalrep_write_prepare. SInce this approach seems
> counter-intuitive there needs to be an improved function comment to
> explain what is going on.
>
> ===
>
> (3) COMMENT
> File: src/backend/replication/logical/proto.c
> Function: logicalrep_read_stream_prepare
> +/*
> + * Read STREAM PREPARE from the output stream.
> + * (For stream PREPARE, stream COMMIT PREPARED, stream ROLLBACK PREPARED)
> + */
>
> This is the same as the previous review comment. The function comment
> needs to explain the new handling for stream COMMIT PREPARED and
> stream ROLLBACK PREPARED.
>
> ===

I think that these functions only writing/reading STREAM PREPARE as
the name suggests is more intuitive. Maybe the usage of flags is more
confusing. More below.

>
> (4) COMMENT
> File: src/backend/replication/logical/proto.c
> Function: logicalrep_read_stream_prepare
> +TransactionId
> +logicalrep_read_stream_prepare(StringInfo in, LogicalRepPrepareData
> *prepare_data)
> +{
> + TransactionId xid;
> + uint8 flags;
> +
> + xid = pq_getmsgint(in, 4);
> +
> + /* read flags */
> + flags = pq_getmsgbyte(in);
> +
> + if (!PrepareFlagsAreValid(flags))
> + elog(ERROR, "unrecognized flags %u in prepare message", flags);
>
> I think the logicalrep_write_stream_prepare now can only assign the
> flags = LOGICALREP_IS_PREPARE. So that means the check here for bad
> flags should be changed to match.
> BEFORE: if (!PrepareFlagsAreValid(flags))
> AFTER: if (flags != LOGICALREP_IS_PREPARE)
>
> ===

Updated.

>
> (5) COMMENT
> General
> Since the COMMENTs (2), (3) and (4) are all caused by the refactoring
> that was done for removal of the commit/rollback stream callbacks. I
> do wonder if it might have worked out better just to leave the
> logicalrep_read/write_stream_prepared as it was instead of mixing up
> stream/no-stream handling. A check for stream/no-stream could possibly
> have been made higher up.
>
> For example:
> static void
> pgoutput_commit_prepared_txn(LogicalDecodingContext *ctx, ReorderBufferTXN *txn,
>                              XLogRecPtr prepare_lsn)
> {
>     OutputPluginUpdateProgress(ctx);
>
>     OutputPluginPrepareWrite(ctx, true);
> if (ctx->streaming)
> logicalrep_write_stream_prepare(ctx->out, txn, prepare_lsn);
> else
> logicalrep_write_prepare(ctx->out, txn, prepare_lsn);
>     OutputPluginWrite(ctx, true);
> }
>
> ===

I think I'll keep this as such for now. Amit was talking about
considering removal of flags to overload PREPARE with COMMIT PREPARED
and ROLLBACK PREPARED. Separate functions for each.
Will wait if Amit thinks that is the way to go.

I've also added a new test case for test_decoding for streaming 2PC.
Removed function ReorderBufferTxnIsPrepared as it was never called
thanks to Peter's coverage report. And added stream_prepare to the
list of callbacks that would
enable two-phase commits.

regards,
Ajin Cherian
Fujitsu Australia

Attachment

pgsql-hackers by date:

Previous
From: Laurenz Albe
Date:
Subject: Re: Disable WAL logging to speed up data loading
Next
From: Georgios Kokolatos
Date:
Subject: Re: New default role- 'pg_read_all_data'