Skip to content

Commit 8171d2d

Browse files
committed
Fix snapshot used in logical replication index lookup
The function calls GetLatestSnapshot() to acquire a fresh snapshot, makes it active, and was meant to pass it to table_tuple_lock(), but instead called GetLatestSnapshot() again to acquire yet another snapshot. It was harmless because the heap AM and all other known table AMs ignore the 'snapshot' argument anyway, but let's be tidy. In the long run, this perhaps should be redesigned so that snapshot was not needed in the first place. The table AM API uses TID + snapshot as the unique identifier for the row version, which is questionable when the row came from an index scan with a Dirty snapshot. You might lock a different row version when you use a different snapshot in the table_tuple_lock() call (a fresh MVCC snapshot) than in the index scan (DirtySnapshot). However, in the heap AM and other AMs where the TID alone identifies the row version, it doesn't matter. So for now, just fix the obvious albeit harmless bug. This has been wrong ever since the table AM API was introduced in commit 5db6df0, so backpatch to all supported versions. Discussion: https://www.postgresql.org/message-id/83d243d6-ad8d-4307-8b51-2ee5844f6230@iki.fi Backpatch-through: 13
1 parent 778f9dd commit 8171d2d

File tree

1 file changed

+1
-1
lines changed

1 file changed

+1
-1
lines changed

src/backend/executor/execReplication.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -209,7 +209,7 @@ RelationFindReplTupleByIndex(Relation rel, Oid idxoid,
209209

210210
PushActiveSnapshot(GetLatestSnapshot());
211211

212-
res = table_tuple_lock(rel, &(outslot->tts_tid), GetLatestSnapshot(),
212+
res = table_tuple_lock(rel, &(outslot->tts_tid), GetActiveSnapshot(),
213213
outslot,
214214
GetCurrentCommandId(false),
215215
lockmode,

0 commit comments

Comments
 (0)