Re: what to revert - Mailing list pgsql-hackers
From | Kevin Grittner |
---|---|
Subject | Re: what to revert |
Date | |
Msg-id | CACjxUsNOq8o1AyHcBGYq_nK7Qp2=ndyFFpbjLYCMzUzfZ6P6fg@mail.gmail.com Whole thread Raw |
In response to | Re: what to revert (Ants Aasma <ants.aasma@eesti.ee>) |
List | pgsql-hackers |
On Thu, May 5, 2016 at 3:39 AM, Ants Aasma <ants.aasma@eesti.ee> wrote: > 5. mai 2016 6:14 AM kirjutas kuupäeval "Andres Freund" <andres@anarazel.de>: >> >> On 2016-05-05 06:08:39 +0300, Ants Aasma wrote: >>> On 5 May 2016 1:28 a.m., "Andres Freund" <andres@anarazel.de> wrote: >>>> On 2016-05-04 18:22:27 -0400, Robert Haas wrote: >>>>> How would the semantics change? >>>> >>>> Right now the time for computing the snapshot is relevant, if >>>> maintenance of xids is moved, it'll likely be tied to the time xids >>>> are assigned. That seems perfectly alright, but it'll change behaviour. Basically this feature allows pruning or vacuuming rows that would still be visible to some snapshots, and then throws an error if one of those snapshots is used for a scan that would generate incorrect results because of the early cleanup. There are already several places that we relax the timings in such a way that it allows better performance by not being as aggressive as theoretically possible in the cleanup. From my perspective, the performance problems on NUMA when the feature is in use just show that this approach wasn't taken far enough, and the solutions don't do anything that isn't conceptually happening anyway. Some rows that currently get cleaned up in vacuum N will get cleaned up in vacuum N+1 with the proposed changes, but I don't see that as a semantic change. In many of those cases we might be able to add some locking and clean up the rows in vacuumm N-1, but nobody wants that. >>> FWIW moving the maintenance to a clock tick process will not change user >>> visible semantics in any significant way. The change could easily be >>> made in the next release. >> >> I'm not convinced of that - right now the timeout is computed as a >> offset to the time a snapshot with a certain xmin horizon is >> taken. Moving the computation to GetNewTransactionId() or a clock tick >> process will make it relative to the time an xid has been generated >> (minus a fuzz factor). That'll behave differently in a number of cases, >> no? Not in what I would consider any meaningful way. This feature is not about trying to provoke the error, it is about preventing bloat while minimizing errors. I have gotten many emails off-list from people asking whether the feature was broken because they had a case which was running with correct results but not generating any errors, and it often came down to such things as cursor use which had materialized a result set -- correct results were returned from the materialized cursor results, so no error was needed. As long as bloat is limited to something near the old_snapshot_threshold and incorrect results are never returned the contract of this feature is maintained. It's reaching a little bit as a metaphore, but we don't say that the semantics of autovacuum are changed in any significant way based slight variations in the timing of vacuums. > Timeout is calculated in TransactionIdLimitedForOldSnapshots() as > GetSnapshotCurrentTimestamp() minus old_snapshot_timeout rounded down to > previous minute. If the highest seen xmin in that minute is useful in > raising cleanup xmin the threshold is bumped. Snapshots switch behavior when > their whenTaken is past this threshold. Xid generation time has no effect on > this timing, it's completely based on passage of time. > > The needed invariant is, that no snapshot having whenTaken after timeout > timestamp can have xmin less than calculated bound. Moving the xmin > calculation and storage to clock tick actually makes the bound tighter. The > ordering between xmin calculation and clok update/read needs to be correct > to ensure the invariant. Right. -- Kevin Grittner EDB: http://www.enterprisedb.com The Enterprise PostgreSQL Company
pgsql-hackers by date: