Re: [HACKERS] logical decoding of two-phase transactions - Mailing list pgsql-hackers
From | Amit Kapila |
---|---|
Subject | Re: [HACKERS] logical decoding of two-phase transactions |
Date | |
Msg-id | CAA4eK1+LvkeX=B3xon7RcBwD4CVaFSryPj3pTBAALrDxQVPDwA@mail.gmail.com Whole thread Raw |
In response to | Re: [HACKERS] logical decoding of two-phase transactions (Peter Smith <smithpb2250@gmail.com>) |
Responses |
Re: [HACKERS] logical decoding of two-phase transactions
|
List | pgsql-hackers |
On Wed, Feb 10, 2021 at 3:59 PM Peter Smith <smithpb2250@gmail.com> wrote: > > PSA the new patch set v38*. > > This patch set has been rebased to use the most recent tablesync patch > from other thread [1] > (i.e. notice that v38-0001 is an exact copy of that thread's tablesync > patch v31) > I see one problem which might lead to the skip of prepared xacts for some of the subscriptions. The problem is that we skip the prepared xacts based on GID and the same prepared transaction arrives on the subscriber for different subscriptions. And even if we wouldn't have skipped the prepared xact, it would have lead to an error "transaction identifier "p1" is already in use". See the scenario below: On Publisher: =========== CREATE TABLE mytbl1(id SERIAL PRIMARY KEY, somedata int, text varchar(120)); CREATE TABLE mytbl2(id SERIAL PRIMARY KEY, somedata int, text varchar(120)); postgres=# BEGIN; BEGIN postgres=*# INSERT INTO mytbl1(somedata, text) VALUES (1, 1); INSERT 0 1 postgres=*# INSERT INTO mytbl1(somedata, text) VALUES (1, 2); INSERT 0 1 postgres=*# COMMIT; COMMIT postgres=# BEGIN; BEGIN postgres=*# INSERT INTO mytbl2(somedata, text) VALUES (1, 1); INSERT 0 1 postgres=*# INSERT INTO mytbl2(somedata, text) VALUES (1, 2); INSERT 0 1 postgres=*# Commit; COMMIT postgres=# CREATE PUBLICATION mypub1 FOR TABLE mytbl1; CREATE PUBLICATION postgres=# CREATE PUBLICATION mypub2 FOR TABLE mytbl2; CREATE PUBLICATION On Subscriber: ============ CREATE TABLE mytbl1(id SERIAL PRIMARY KEY, somedata int, text varchar(120)); CREATE TABLE mytbl2(id SERIAL PRIMARY KEY, somedata int, text varchar(120)); postgres=# CREATE SUBSCRIPTION mysub1 postgres-# CONNECTION 'host=localhost port=5432 dbname=postgres' postgres-# PUBLICATION mypub1; NOTICE: created replication slot "mysub1" on publisher CREATE SUBSCRIPTION postgres=# CREATE SUBSCRIPTION mysub2 postgres-# CONNECTION 'host=localhost port=5432 dbname=postgres' postgres-# PUBLICATION mypub2; NOTICE: created replication slot "mysub2" on publisher CREATE SUBSCRIPTION On Publisher: ============ postgres=# Begin; BEGIN postgres=*# INSERT INTO mytbl1(somedata, text) VALUES (1, 3); INSERT 0 1 postgres=*# INSERT INTO mytbl2(somedata, text) VALUES (1, 3); INSERT 0 1 postgres=*# Prepare Transaction 'myprep1'; After this step, wait for few seconds and then perform Commit Prepared 'myprep1'; on Publisher and you will notice following error in the subscriber log: "ERROR: prepared transaction with identifier "myprep1" does not exist" One idea to avoid this is that we use subscription_id along with GID on subscription for prepared xacts. Let me know if you have any better ideas to handle this? Few other minor comments on v38-0004-Add-support-for-apply-at-prepare-time-to-built-i: ====================================================================== 1. - * Mark the prepared transaction as valid. As soon as xact.c marks - * MyProc as not running our XID (which it will do immediately after - * this function returns), others can commit/rollback the xact. + * Mark the prepared transaction as valid. As soon as xact.c marks MyProc + * as not running our XID (which it will do immediately after this + * function returns), others can commit/rollback the xact. Why this change in this patch? Is it due to pgindent? If so, you need to exclude this change? 2. @@ -78,7 +78,7 @@ logicalrep_write_commit(StringInfo out, ReorderBufferTXN *txn, pq_sendbyte(out, LOGICAL_REP_MSG_COMMIT); - /* send the flags field (unused for now) */ + /* send the flags field */ pq_sendbyte(out, flags); Is there a reason to change the above comment? -- With Regards, Amit Kapila.
pgsql-hackers by date: