Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
Skip to content

Commit 74ebba8

Browse files
committed
Redefine HEAP_XMAX_IS_LOCKED_ONLY
Tuples marked SELECT FOR UPDATE in a cluster that's later processed by pg_upgrade would have a different infomask bit pattern than those produced by 9.3dev; that bit pattern was being seen as "dead" by HEAD (because they would fail the "is this tuple locked" test, and so the visibility rules would thing they're updated, even though there's no HEAP_UPDATED version of them). In other words, some rows could silently disappear after pg_upgrade. With this new definition, those tuples become visible again. This is breakage resulting from my commit 0ac5ad5.
1 parent 34da700 commit 74ebba8

File tree

1 file changed

+8
-3
lines changed

1 file changed

+8
-3
lines changed

src/include/access/htup_details.h

+8-3
Original file line numberDiff line numberDiff line change
@@ -189,14 +189,19 @@ struct HeapTupleHeaderData
189189
#define HEAP_XACT_MASK 0xFFF0 /* visibility-related bits */
190190

191191
/*
192-
* A tuple is only locked (i.e. not updated by its Xmax) if it the
193-
* HEAP_XMAX_LOCK_ONLY bit is set.
192+
* A tuple is only locked (i.e. not updated by its Xmax) if the
193+
* HEAP_XMAX_LOCK_ONLY bit is set; or, for pg_upgrade's sake, if the Xmax is
194+
* not a multi and the EXCL_LOCK bit is set.
194195
*
195196
* See also HeapTupleHeaderIsOnlyLocked, which also checks for a possible
196197
* aborted updater transaction.
198+
*
199+
* Beware of multiple evaluations of the argument.
197200
*/
198201
#define HEAP_XMAX_IS_LOCKED_ONLY(infomask) \
199-
((infomask) & HEAP_XMAX_LOCK_ONLY)
202+
(((infomask) & HEAP_XMAX_LOCK_ONLY) || \
203+
(((infomask) & (HEAP_XMAX_IS_MULTI | HEAP_LOCK_MASK)) == HEAP_XMAX_EXCL_LOCK))
204+
200205
/*
201206
* Use these to test whether a particular lock is applied to a tuple
202207
*/

0 commit comments

Comments
 (0)