On 23 November 2016 at 03:55, Robert Haas <robertmh...@gmail.com> wrote: > On Tue, Nov 22, 2016 at 1:49 AM, Craig Ringer <cr...@2ndquadrant.com> wrote: >> On 22 November 2016 at 10:20, Craig Ringer <cr...@2ndquadrant.com> wrote: >>> I'm currently looking at making detection of replay conflict with a >>> slot work by separating the current catalog_xmin into two effective >>> parts - the catalog_xmin currently needed by any known slots >>> (ProcArray->replication_slot_catalog_xmin, as now), and the oldest >>> actually valid catalog_xmin where we know we haven't removed anything >>> yet. >> >> OK, more detailed plan. >> >> The last checkpoint's oldestXid, and ShmemVariableCache's oldestXid, >> are already held down by ProcArray's catalog_xmin. But that doesn't >> mean we haven't removed newer tuples from specific relations and >> logged that in xl_heap_clean, etc, including catalogs or user >> catalogs, it only means the clog still exists for those XIDs. > > Really?
(Note the double negative above). Yes, necessarily so. You can't look up xids older than the clog truncation threshold at oldestXid, per our discussion on txid_status() and traceable commit. But the tuples from that xact aren't guaranteed to exist in any given relation; vacuum uses vacuum_set_xid_limits(...) which calls GetOldestXmin(...); that in turn scans ProcArray to find the oldest xid any running xact cares about. It might bump it down further if there's a replication slot requirement or based on vacuum_defer_cleanup_age, but it doesn't care in the slightest about oldestXmin. oldestXmin cannot advance until vacuum has removed all tuples for that xid and advanced the database's datfrozenxid. But a given oldestXmin says nothing about which tuples, catalog or otherwise, still exist and are acessible. -- Craig Ringer http://www.2ndQuadrant.com/ PostgreSQL Development, 24x7 Support, Training & Services -- Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-hackers