I don't think RecentGlobalXmin is good enough here:
> ! /*
> ! * We would like to set an accurate latestRemovedXid, but there
> ! * is no easy way of obtaining a useful value. So we use the
> ! * probably far too conservative value of RecentGlobalXmin instead.
> ! */
> ! xlrec_delete.latestRemovedXid = RecentGlobalXmin;
> ! rdata[0].data = (char *) &xlrec_delete;
> ! rdata[0].len = SizeOfBtreeDelete;
RecentGlobalXmin is just a hint, it lags behind the real oldest xmin
that GetOldestXmin() would return. If another backend has a more recent
RecentGlobalXmin value, and has killed more recent tuples on the page,
the latestRemovedXid written here is too old.
-- Heikki Linnakangas EnterpriseDB http://www.enterprisedb.com