Bruce Momjian <br...@momjian.us> wrote: > On Wed, May 30, 2018 at 09:28:54AM -0400, Alvaro Herrera wrote: > > On 2018-May-30, Antonin Houska wrote: > > > > > In the header comment, SnapBuildInitialSnapshot() claims to set > > > snapshot->satisfies to the HeapTupleSatisfiesMVCC test function, and > > > indeed it > > > converts the "xid" array to match its semantics (i.e. the xid items > > > eventually > > > represent running transactions as opposed to the committed ones). However > > > the > > > test function remains HeapTupleSatisfiesHistoricMVCC as set by > > > SnapBuildBuildSnapshot(). > > > > Interesting. While this sounds like an oversight that should have > > horrible consequences, it's seems not to because the current callers > > don't seem to care about the ->satisfies function. Are you able to come > > up with some scenario in which it causes an actual problem? > > Uh, are we going to fix this anyway? Seems we should.
Sorry, I forgot. Patch is below and I'm going to add an entry to the next CF. -- Antonin Houska Cybertec Schönig & Schönig GmbH Gröhrmühlgasse 26, A-2700 Wiener Neustadt Web: https://www.cybertec-postgresql.com
diff --git a/src/backend/replication/logical/snapbuild.c b/src/backend/replication/logical/snapbuild.c index 2f185f7823..3394abb602 100644 --- a/src/backend/replication/logical/snapbuild.c +++ b/src/backend/replication/logical/snapbuild.c @@ -615,6 +615,8 @@ SnapBuildInitialSnapshot(SnapBuild *builder) TransactionIdAdvance(xid); } + /* And of course, adjust snapshot type accordingly. */ + snap->snapshot_type = SNAPSHOT_MVCC; snap->xcnt = newxcnt; snap->xip = newxip; diff --git a/src/backend/utils/time/snapmgr.c b/src/backend/utils/time/snapmgr.c index 6e02585e10..bc0166cc6f 100644 --- a/src/backend/utils/time/snapmgr.c +++ b/src/backend/utils/time/snapmgr.c @@ -1502,6 +1502,13 @@ ImportSnapshot(const char *idstr) */ memset(&snapshot, 0, sizeof(snapshot)); + /* + * Do not rely on the fact that SNAPSHOT_MVCC is zero. (The core code + * currently does not use this field of imported snapshot, but let's keep + * things consistent.) + */ + snapshot.snapshot_type = SNAPSHOT_MVCC; + parseVxidFromText("vxid:", &filebuf, path, &src_vxid); src_pid = parseIntFromText("pid:", &filebuf, path); /* we abuse parseXidFromText a bit here ... */