Re: Re: [COMMITTERS] pgsql: Avoid extra locks in GetSnapshotData if old_snapshot_threshold < - Mailing list pgsql-hackers
From | Kevin Grittner |
---|---|
Subject | Re: Re: [COMMITTERS] pgsql: Avoid extra locks in GetSnapshotData if old_snapshot_threshold < |
Date | |
Msg-id | CACjxUsN6iCBrrNw7H5BJ7amJRx4AiUzjnpW=35FSuyZ1+Pgq1A@mail.gmail.com Whole thread Raw |
In response to | Re: Re: [COMMITTERS] pgsql: Avoid extra locks in GetSnapshotData if old_snapshot_threshold < (Andres Freund <andres@anarazel.de>) |
Responses |
Re: Re: [COMMITTERS] pgsql: Avoid extra locks in
GetSnapshotData if old_snapshot_threshold <
|
List | pgsql-hackers |
On Wed, Jun 15, 2016 at 8:57 PM, Andres Freund <andres@anarazel.de> wrote: > The simplest version of the scenario I'm concerned about is that a tuple > in a tuple is *not* vacuumed, even though it's elegible to be removed > due to STO. If that tuple has toasted columns, it could be the that the > toast table was independently vacuumed (autovac considers main/toast > tables separately, If that were really true, why would we not have the problem in current production versions that the toast table could be vacuumed before the heap, leading to exactly the issue you are talking about? It seems to me that a simple test shows that it is not the case that the heap is vacuumed without considering toast: test=# create table tt (c1 text not null); CREATE TABLE test=# insert into tt select repeat(md5(n::text),100000) from (select generate_series(1,100)) x(n); INSERT 0 100 test=# delete from tt; DELETE 100 test=# vacuum verbose tt; INFO: vacuuming "public.tt" INFO: "tt": removed 100 row versions in 1 pages INFO: "tt": found 100 removable, 0 nonremovable row versions in 1 out of 1 pages DETAIL: 0 dead row versions cannot be removed yet. There were 0 unused item pointers. Skipped 0 pages due to buffer pins. 0 pages are entirely empty. CPU 0.00s/0.00u sec elapsed 0.00 sec. INFO: vacuuming "pg_toast.pg_toast_16552" INFO: scanned index "pg_toast_16552_index" to remove 1900 row versions DETAIL: CPU 0.00s/0.00u sec elapsed 0.00 sec. INFO: "pg_toast_16552": removed 1900 row versions in 467 pages DETAIL: CPU 0.00s/0.00u sec elapsed 0.00 sec. INFO: index "pg_toast_16552_index" now contains 0 row versions in 8 pages DETAIL: 1900 index row versions were removed. 5 index pages have been deleted, 0 are currently reusable. CPU 0.00s/0.00u sec elapsed 0.00 sec. INFO: "pg_toast_16552": found 1900 removable, 0 nonremovable row versions in 467 out of 467 pages DETAIL: 0 dead row versions cannot be removed yet. There were 0 unused item pointers. Skipped 0 pages due to buffer pins. 0 pages are entirely empty. CPU 0.00s/0.00u sec elapsed 0.00 sec. VACUUM > or the horizon could change between the two heap scans, Not a problem in current production why? > or pins could prevent vacuuming of one page, or ...). Not a problem in current production why? So far I am not seeing any way for TOAST tuples to be pruned in advance of the referencing heap tuples, nor any way for the problem you describe to happen in the absence of that. If you see such, could you provide a more detailed description or a reproducible test case? > Toast accesses via tuptoaster.c currently don't perform > TestForOldSnapshot_impl(), because they use SnapshotToastData, not > SnapshotMVCC. > > That seems to means two things: > > 1) You might get 'missing chunk number ...' errors on access to toasted > columns. Misleading error, but ok. > > 2) Because the tuple has been pruned from the toast table, it's possible > that the toast oid/va_valueid is reused, because now there's no > conflict with GetNewOidWithIndex() anymore. In that case the > toast_fetch_datum() might return a tuple from another column & type > (all columns in a table share the same toast table), which could lead > to almost arbitrary problems. That's not super likely to happen, but > could have quite severe consequences once it starts. > > It seems the easiest way to fix this would be to make > TestForOldSnapshot() "accept" SnapshotToast as well. I don't think that would be appropriate without testing the characteristics of the underlying table to see whether it should be excluded. But is the TOAST data ever updated without an update to the referencing heap tuple? If not, I don't see any benefit. And we certainly don't want to add some new way to prune TOAST tuples which might still have referencing heap tuples; that could provide a route to *create* the problem you describe. I am on vacation tomorrow (Friday the 17th) through Monday the 27th, so I will be unable to respond to further issues during that time. Hopefully I can get this particular issue sorted out before I go. -- Kevin Grittner EDB: http://www.enterprisedb.com The Enterprise PostgreSQL Company
pgsql-hackers by date: