Re: dsa_allocate() faliure
От | Thomas Munro |
---|---|
Тема | Re: dsa_allocate() faliure |
Дата | |
Msg-id | CAEepm=2X8jDzJNj5UbnmdWcFfzRo6ZMpX2TAmApwzPc9thvo0w@mail.gmail.com обсуждение исходный текст |
Ответ на | Re: dsa_allocate() faliure (Thomas Munro <thomas.munro@enterprisedb.com>) |
Ответы |
Re: dsa_allocate() faliure
|
Список | pgsql-hackers |
On Sun, Feb 10, 2019 at 7:24 AM Thomas Munro <thomas.munro@enterprisedb.com> wrote: > On Sat, Feb 9, 2019 at 9:21 PM Robert Haas <robertmhaas@gmail.com> wrote: > > On Fri, Feb 8, 2019 at 8:00 AM Thomas Munro > > <thomas.munro@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
В списке pgsql-hackers по дате отправления: