Re: heap_delete, heap_mark4update must reset t_ctid

Barry Lind <barry@xythos.com>

From: Barry Lind <barry@xythos.com>
To: Tom Lane <tgl@sss.pgh.pa.us>
Cc: Vadim Mikheev <vmikheev@sectorbase.com>, pgsql-hackers@postgreSQL.org
Date: 2002-07-19T17:03:04Z
Lists: pgsql-hackers
Tom,

When/if you have a patch for this, I would like to test it.  I still
have a copy of a database showing the same problem that I would like to
test this on when it is ready.

thanks,
--Barry

Tom Lane wrote:

 >I have been looking at an example of the "no one parent tuple found"
 >VACUUM error provided by Mario Weilguni.  It appears to me that VACUUM
 >is getting confused by a tuple that looks like so in pg_filedump:
 >
 > Item   4 -- Length:  249  Offset: 31616 (0x7b80)  Flags: USED
 >  OID: 0  CID: min(240) max(18)  XID: min(5691267) max(6484551)
 >  Block Id: 1  linp Index: 1   Attributes: 38   Size: 40
 >  infomask: 0x3503 
(HASNULL|HASVARLENA|XMIN_COMMITTED|XMAX_COMMITTED|MARKED_FOR_UPDATE|UPDATED)
 >
 >Notice that the t_ctid field is not pointing to this tuple, but to a
 >different item on the same page (which in fact is an unused item).
 >This causes VACUUM to believe that the tuple is part of an update chain.
 >But in point of fact it is not part of a chain (indeed there are *no*
 >chains in the test relation, thus leading to the observed failure).
 >
 >As near as I can tell, the sequence of events was:
 >
 >1. this row was updated by a transaction that stored the updated version
 >in lineindex 1, but later aborted.  t_ctid is left pointing to linp 1.
 >
 >2. Some other transaction came along, marked the row FOR UPDATE, and
 >committed (with no actual update).
 >
 >So we now have XMAX_COMMITTED and t_ctid != t_self, which looks way too
 >much like a tuple that's been updated, when in fact it is the latest
 >good version of its row.
 >
 >I think an appropriate fix would be to reset t_ctid to equal t_self
 >whenever we clear XMAX_INVALID, which in practice means heap_delete and
 >heap_mark4update need to do this.  (heap_update also clears
 >XMAX_INVALID, but of course it's setting t_ctid to point to the updated
 >tuple.)
 >
 >Comments?
 >
 > 
		regards, tom lane
 >
 >---------------------------(end of broadcast)---------------------------
 >TIP 6: Have you searched our list archives?
 >
 >http://archives.postgresql.org
 >
 >
 >