On Tue, Aug 2, 2016 at 9:10 AM, Robert Haas <robertmh...@gmail.com> wrote: > On Sat, Jul 30, 2016 at 8:17 AM, Amit Kapila <amit.kapil...@gmail.com> wrote: >> On Fri, Jul 29, 2016 at 1:10 AM, Robert Haas <robertmh...@gmail.com> wrote: >>> On Wed, Jul 27, 2016 at 7:26 PM, Andres Freund <and...@anarazel.de> wrote: >>> >>> New version attached. >> >> +static inline void >> +InitToastSnapshot(Snapshot snapshot, XLogRecPtr lsn) >> +{ >> + snapshot->satisfies = HeapTupleSatisfiesToast; >> + snapshot->lsn = lsn; >> +} >> >> Here, don't you need to initialize whenTaken as that is also used in >> TestForOldSnapshot_impl() to report error "snapshot too old". > > Hmm, yeah. This is actually a bit confusing. We want the "oldest" > snapshot, but there are three different notions of "oldest": > > 1. Smallest LSN. > 2. Smallest whenTaken. > 3. Smallest xmin. > > Which one do we use? >
Which ever notion we choose, I think we should use the LSN and whenTaken from the same snapshot. I think we can choose the snapshot with smallest xmin and then use the LSN and whenTaken from it. I think xmin comparison makes more sense because you are already retrieving smallest xmin snapshot from the registered snapshots. Whatever value we choose here, I think we can't guarantee that it will be in sync with the value used for heap. So there is a chance that we might spuriously raise "snapshot too old" error. I think we should mentioned this as a caveat in docs [1] where we explain behaviour of about old_snapshot_threshold. [1] - https://www.postgresql.org/docs/9.6/static/runtime-config-resource.html#RUNTIME-CONFIG-RESOURCE-ASYNC-BEHAVIOR -- With Regards, Amit Kapila. 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