On Sun, Feb 10, 2019 at 7:24 AM Thomas Munro <thomas.mu...@enterprisedb.com> wrote: > On Sat, Feb 9, 2019 at 9:21 PM Robert Haas <robertmh...@gmail.com> wrote: > > On Fri, Feb 8, 2019 at 8:00 AM Thomas Munro > > <thomas.mu...@enterprisedb.com> wrote: > > > Sometimes FreeManagerPutInternal() returns a > > > number-of-contiguous-pages-created-by-this-insertion that is too large > > > by one. [...] > > > > I spent a long time thinking about this and starting at code this > > afternoon, but I didn't really come up with much of anything useful. > > It seems like a strange failure mode, because > > FreePageManagerPutInternal() normally just returns its third argument > > unmodified. [...] > > Bleugh. Yeah. What I said before wasn't quite right. The value > returned by FreePageManagerPutInternal() is actually correct at the > moment it is returned, but it ceases to be correct immediately > afterwards if the following call to FreePageBtreeCleanup() happens to > reduce the size of that particular span.
... but why would it do that? I can reproduce cases where (for example) FreePageManagerPutInternal() returns 179, and then FreePageManagerLargestContiguous() returns 179, but then after FreePageBtreeCleanup() it returns 178. At that point FreePageDump() says: btree depth 1: 77@0 l: 27(1) 78(178) freelists: 1: 27 129: 78(178) But at first glance it shouldn't be allocating pages, because it just does consolidation to try to convert to singleton format, and then it does recycle list cleanup using soft=true so that no allocation of btree pages should occur. -- Thomas Munro http://www.enterprisedb.com