Local visibility with logical decoding

Started by Marko Tiikkajaover 5 years ago4 messageshackers
Jump to latest
#1Marko Tiikkaja
marko@joh.to

Hi,

It appears that when logical decoding sends out the data from the output
plugin, it is not guaranteed that the decoded transaction's effects are
visible on the source server. Is this the way it's supposed to work?

If so, would doing something like this in the output plugin be reasonable?

TransactionId xid = transaction->xid;
if (transaction->is_known_as_subxact)
xid = transaction->toplevel_xid;

if (TransactionIdIsInProgress(xid))
XactLockTableWait(xid, NULL, NULL, XLTW_None);

-marko

#2Antonin Houska
ah@cybertec.at
In reply to: Marko Tiikkaja (#1)
Re: Local visibility with logical decoding

Marko Tiikkaja <marko@joh.to> wrote:

It appears that when logical decoding sends out the data from the output
plugin, it is not guaranteed that the decoded transaction's effects are
visible on the source server. Is this the way it's supposed to work?

Can you please share the test that indicates this behavior? As far as I
understand, the transaction must have been committed before the output plugin
starts to receive the changes.

--
Antonin Houska
Web: https://www.cybertec-postgresql.com

#3Marko Tiikkaja
marko@joh.to
In reply to: Antonin Houska (#2)
Re: Local visibility with logical decoding

On Mon, Jul 20, 2020 at 7:36 PM Antonin Houska <ah@cybertec.at> wrote:

Marko Tiikkaja <marko@joh.to> wrote:

It appears that when logical decoding sends out the data from the output
plugin, it is not guaranteed that the decoded transaction's effects are
visible on the source server. Is this the way it's supposed to work?

Can you please share the test that indicates this behavior? As far as I
understand, the transaction must have been committed before the output
plugin
starts to receive the changes.

I don't have a reliable test program, but you can reproduce quite easily
with test_decoding if you put a breakpoint before the SyncRepWaitForLSN()
call in src/backend/access/transam/xact.c. pg_logicalrecv will see the
changes while the session is sitting on the breakpoint, and not finishing
its commit.

-marko

#4Andres Freund
andres@anarazel.de
In reply to: Marko Tiikkaja (#1)
Re: Local visibility with logical decoding

Hi,

On 2020-07-20 17:27:30 +0300, Marko Tiikkaja wrote:

It appears that when logical decoding sends out the data from the output
plugin, it is not guaranteed that the decoded transaction's effects are
visible on the source server. Is this the way it's supposed to work?

At the moment the visibility behaviour is basically the same as crash
recovery / standbys. And they just look at the WAL...

If so, would doing something like this in the output plugin be reasonable?

TransactionId xid = transaction->xid;
if (transaction->is_known_as_subxact)
xid = transaction->toplevel_xid;

if (TransactionIdIsInProgress(xid))
XactLockTableWait(xid, NULL, NULL, XLTW_None);

I'd not be surprised if this had a potential to cause deadlocks.

Greetings,

Andres Freund