> 27 марта 2018 г., в 13:45, Alexander Korotkov <a.korot...@postgrespro.ru> 
> написал(а):
> 
> On Tue, Mar 27, 2018 at 11:16 AM, Andrey Borodin <x4...@yandex-team.ru 
> <mailto:x4...@yandex-team.ru>> wrote:
> > 27 марта 2018 г., в 12:53, Teodor Sigaev <teo...@sigaev.ru 
> > <mailto:teo...@sigaev.ru>> написал(а):
> >
> > I have a question: why do not CheckForSerializableConflictIn() move  into 
> > begining of gistplacetopage()? Seems, it is the single function which 
> > actually changes page and all predicate locking stuff will be placed in 
> > single function...
> 
> gistplacetopage() is called from
> 1. Buffered build - probably harmless
> 
> Yes, harmless, but useless.
>  
> 2. Finish split - i'm not sure about this. It seems to me that it is 
> necessary... then your version is correct.
> 
> Yes, it's necessary, because GiST scan can end up on non-leaf page.  So, scan 
> and modify of same non-leaf page should conflict.
> 
> Checking for serializable conflicts from buffering build seems useless 
> overhead.  gistplacetopage()
> is called from only two places: gistinserttuples() and 
> gistbufferinginserttuples().  In order to evade
> useless overhead for buffering build, I've moved 
> CheckForSerializableConflictIn() into gistinserttuples().
+1
Also, both gistdoinsert() and gistplacetopage() are mind blowing in complexity. 
gistinserttuples() looks like a cosy place if we need to add some more.

Best regards, Andrey Borodin.

Reply via email to