mirror of
https://github.com/postgres/postgres.git
synced 2025-11-15 03:41:20 +03:00
Change the way we mark tuples as frozen.
Instead of changing the tuple xmin to FrozenTransactionId, the combination of HEAP_XMIN_COMMITTED and HEAP_XMIN_INVALID, which were previously never set together, is now defined as HEAP_XMIN_FROZEN. A variety of previous proposals to freeze tuples opportunistically before vacuum_freeze_min_age is reached have foundered on the objection that replacing xmin by FrozenTransactionId might hinder debugging efforts when things in this area go awry; this patch is intended to solve that problem by keeping the XID around (but largely ignoring the value to which it is set). Third-party code that checks for HEAP_XMIN_INVALID on tuples where HEAP_XMIN_COMMITTED might be set will be broken by this change. To fix, use the new accessor macros in htup_details.h rather than consulting the bits directly. HeapTupleHeaderGetXmin has been modified to return FrozenTransactionId when the infomask bits indicate that the tuple is frozen; use HeapTupleHeaderGetRawXmin when you already know that the tuple isn't marked commited or frozen, or want the raw value anyway. We currently do this in routines that display the xmin for user consumption, in tqual.c where it's known to be safe and important for the avoidance of extra cycles, and in the function-caching code for various procedural languages, which shouldn't invalidate the cache just because the tuple gets frozen. Robert Haas and Andres Freund
This commit is contained in:
@@ -65,6 +65,9 @@ manage to be a conflict it would merely mean that one bit-update would
|
||||
be lost and need to be done again later. These four bits are only hints
|
||||
(they cache the results of transaction status lookups in pg_clog), so no
|
||||
great harm is done if they get reset to zero by conflicting updates.
|
||||
Note, however, that a tuple is frozen by setting both HEAP_XMIN_INVALID
|
||||
and HEAP_XMIN_COMMITTED; this is a critical update and accordingly requires
|
||||
an exclusive buffer lock (and it must also be WAL-logged).
|
||||
|
||||
5. To physically remove a tuple or compact free space on a page, one
|
||||
must hold a pin and an exclusive lock, *and* observe while holding the
|
||||
|
||||
Reference in New Issue
Block a user