Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 0b3859f

Browse files
committed
Fix HeapTupleSatisfiesVacuum on aborted updater xacts
By using only the macro that checks infomask bits HEAP_XMAX_IS_LOCKED_ONLY to verify whether a multixact is not an updater, and not the full HeapTupleHeaderIsOnlyLocked, it would come to the wrong result in case of a multixact containing an aborted update; therefore returning the wrong result code. This would cause predicate.c to break completely (as in bug report #8273 from David Leverton), and certain index builds would misbehave. As far as I can tell, other callers of the bogus routine would make harmless mistakes or not be affected by the difference at all; so this was a pretty narrow case. Also, no other user of the HEAP_XMAX_IS_LOCKED_ONLY macro is as careless; they all check specifically for the HEAP_XMAX_IS_MULTI case, and they all verify whether the updater is InvalidXid before concluding that it's a valid updater. So there doesn't seem to be any similar bug.
1 parent a9f8fe0 commit 0b3859f

File tree

1 file changed

+3
-1
lines changed

1 file changed

+3
-1
lines changed

src/backend/utils/time/tqual.c

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1287,7 +1287,9 @@ HeapTupleSatisfiesVacuum(HeapTupleHeader tuple, TransactionId OldestXmin,
12871287
{
12881288
if (tuple->t_infomask & HEAP_XMAX_INVALID) /* xid invalid */
12891289
return HEAPTUPLE_INSERT_IN_PROGRESS;
1290-
if (HEAP_XMAX_IS_LOCKED_ONLY(tuple->t_infomask))
1290+
/* only locked? run infomask-only check first, for performance */
1291+
if (HEAP_XMAX_IS_LOCKED_ONLY(tuple->t_infomask) ||
1292+
HeapTupleHeaderIsOnlyLocked(tuple))
12911293
return HEAPTUPLE_INSERT_IN_PROGRESS;
12921294
/* inserted and then deleted by same xact */
12931295
return HEAPTUPLE_DELETE_IN_PROGRESS;

0 commit comments

Comments
 (0)