How would you characterize the chances of this happening with default *vacuum_freeze_*_age settings? Offhand, it seems you would need to encounter this bug during each of ~10 generations of autovacuum_freeze_max_age before the old rows actually become invisible.
On Wed, Nov 27, 2013 at 02:14:53PM +0100, Andres Freund wrote: > With regard to fixing things up, ISTM the best bet is heap_prune_chain() > so far. That's executed b vacuum and by opportunistic pruning and we > know we have the appropriate locks there. Looks relatively easy to fix > up things there. Not sure if there are any possible routes to WAL log > this but using log_newpage()? > I am really not sure what the best course of action is :( Maximizing detection is valuable, and the prognosis for automated repair is poor. I would want a way to extract tuples having xmin outside the range of CLOG that are marked HEAP_XMIN_COMMITTED or appear on an all-visible page. At first, I supposed we could offer a tool to blindly freeze such tuples. However, there's no guarantee that they are in harmony with recent changes to the database; transactions that wrongly considered those tuples invisible may have made decisions incompatible with their existence. For example, reviving such a tuple could violate a UNIQUE constraint if the user had already replaced the missing row manually. A module that offers "SELECT * FROM rows_wrongly_invisible('anytable')" would aid manual cleanup efforts. freeze_if_wrongly_invisible(tid) would be useful, too. Thanks, nm -- Noah Misch EnterpriseDB http://www.enterprisedb.com -- Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-hackers