On 2016-06-16 13:16:35 -0500, Kevin Grittner wrote: > On Thu, Jun 16, 2016 at 1:01 PM, Andres Freund <and...@anarazel.de> wrote: > > > The relevant part is the HeapTupleSatisfiesMVCC check, we're using > > SatisfiesToast for toast lookups. > > > > FWIW, I just tried to reproduce this with old_snapshot_threshold = 0 - > > but ran into the problem that I couldn't get it to vacuum anything away > > (neither main nor toast rel). That appears to be > > if (old_snapshot_threshold == 0) > > { > > if (TransactionIdPrecedes(latest_xmin, > > MyPgXact->xmin) > > && TransactionIdFollows(latest_xmin, > > xlimit)) > > xlimit = latest_xmin; > > because latest_xmin always is equal to MyPgXact->xmin, which is actually > > kinda unsurprising? > > Sure -- the STO feature *never* advances the point for early > pruning past the earliest still-active transaction ID. If it did > we would have all sorts of weird problems.
Both latest_xmin, MyPgXact->xmin are equivalent to txid_current() here. Note that a threshold of 1 actually vacuums in this case (after waiting obviously), but 0 never does. Afaics that's because before TransactionIdLimitedForOldSnapshots() is reached, MaintainOldSnapshotTimeMapping will have updated latest_xmin to the current value. With old_snapshot_threshold=1 I indeed can reproduce the issue. I disabled autovacuum, to make the scheduling more predictable. But it should "work" just as well with autovacuum. S1: CREATE TABLE toasted(largecol text); INSERT INTO toasted SELECT string_agg(random()::text, '-') FROM generate_series(1, 10000000); BEGIN; DELETE FROM toasted; S2: BEGIN TRANSACTION ISOLATION LEVEL REPEATABLE READ; S2: SELECT hashtext(largecol), length(largecol) FROM toasted; > ... S1: COMMIT; S2: SELECT hashtext(largecol), length(largecol) FROM toasted; > ... S1: /* wait for snapshot threshold to be passed */ S1: VACUUM pg_toast.pg_toast_16437; > INFO: 00000: "pg_toast_16437": found 61942 removable, 0 nonremovable row > versions in 15486 out of 15486 pages > DETAIL: 0 dead row versions cannot be removed yet. S2: SELECT hashtext(largecol), length(largecol) FROM toasted; ERROR: XX000: missing chunk number 0 for toast value 16455 in pg_toast_16437 LOCATION: toast_fetch_datum, tuptoaster.c:1945 Andres -- Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-hackers