Re: [PATCH] add concurrent_abort callback for output plugin
Markus Wanner <markus@bluegap.ch>
From: Markus Wanner <markus@bluegap.ch>
To: Ajin Cherian <itsajin@gmail.com>,
Markus Wanner <markus.wanner@enterprisedb.com>
Cc: Amit Kapila <amit.kapila16@gmail.com>,
PostgreSQL Hackers <pgsql-hackers@lists.postgresql.org>
Date: 2021-03-30T11:29:43Z
Lists: pgsql-hackers
On 30.03.21 11:12, Ajin Cherian wrote: > I found some documentation that already was talking about concurrent > aborts and updated that. Thanks. I just noticed as of PG13, concurrent_abort is part of ReorderBufferTXN, so it seems the prepare_cb (or stream_prepare_cb) can actually figure a concurrent abort happened (and the transaction may be incomplete). That's good and indeed makes an additional callback unnecessary. I recommend giving a hint to that field in the documentation as well. > diff --git a/doc/src/sgml/logicaldecoding.sgml b/doc/src/sgml/logicaldecoding.sgml > index 80eb96d..d2f8d39 100644 > --- a/doc/src/sgml/logicaldecoding.sgml > +++ b/doc/src/sgml/logicaldecoding.sgml > @@ -545,12 +545,14 @@ CREATE TABLE another_catalog_table(data text) WITH (user_catalog_table = true); > executed within that transaction. A transaction that is prepared for > a two-phase commit using <command>PREPARE TRANSACTION</command> will > also be decoded if the output plugin callbacks needed for decoding > - them are provided. It is possible that the current transaction which > + them are provided. It is possible that the current prepared transaction which > is being decoded is aborted concurrently via a <command>ROLLBACK PREPARED</command> > command. In that case, the logical decoding of this transaction will > - be aborted too. We will skip all the changes of such a transaction once > - the abort is detected and abort the transaction when we read WAL for > - <command>ROLLBACK PREPARED</command>. > + be aborted too. All the changes of such a transaction is skipped once typo: changes [..] *are* skipped, plural. > + the abort is detected and the <function>prepare_cb</function> callback is invoked. > + This could result in a prepared transaction with incomplete changes. ... "in which case the <literal>concurrent_abort</literal> field of the passed <literal>ReorderBufferTXN</literal> struct is set.", as a proposal? > + This is done so that eventually when the <command>ROLLBACK PREPARED</command> > + is decoded, there is a corresponding prepared transaction with a matching gid. > </para> > > <note> Everything else sounds good to me. Regards Markus
Commits
-
Avoid sending prepare multiple times while decoding.
- f25a4584c6f5 14.0 landed
-
Ensure to send a prepare after we detect concurrent abort during decoding.
- 4778826532a6 14.0 landed