Thread
Commits
-
Add predicate locking for GiST
- 3ad55863e939 11.0 landed
-
GSoC 2017 : Patch for predicate locking in Gist index
Shubham Barai <shubhambaraiss@gmail.com> — 2017-06-16T10:24:13Z
Hi, hackers! I have created my first patch for predicate locking in gist index. It includes a test for verification of serialization failures and a test to check false positives. I am submitting my patch little late because there were some issues with "make check" that I was trying to solve. Now, the patch passes all existing tests. Regards, Shubham <https://mailtrack.io/> Sent with Mailtrack <https://mailtrack.io/install?source=signature&lang=en&referral=shubhambaraiss@gmail.com&idSignature=22>
-
Re: GSoC 2017 : Patch for predicate locking in Gist index
Shubham Barai <shubhambaraiss@gmail.com> — 2017-06-18T11:48:23Z
Hi, Please find the updated patch here. Regards, Shubham On 16 June 2017 at 15:54, Shubham Barai <shubhambaraiss@gmail.com> wrote: > Hi, hackers! > > I have created my first patch for predicate locking in gist index. It > includes a test for verification of serialization failures and a test to > check false positives. > I am submitting my patch little late because there were some issues with > "make check" that I was trying to solve. Now, the patch passes all existing > tests. > > Regards, > Shubham > > > > <https://mailtrack.io/> Sent with Mailtrack > <https://mailtrack.io/install?source=signature&lang=en&referral=shubhambaraiss@gmail.com&idSignature=22> >
-
Re: GSoC 2017 : Patch for predicate locking in Gist index
Heikki Linnakangas <hlinnaka@iki.fi> — 2017-06-21T07:41:36Z
On 06/16/2017 01:24 PM, Shubham Barai wrote: > @@ -497,6 +499,13 @@ gistplacetopage(Relation rel, Size freespace, GISTSTATE *giststate, > for (ptr = dist->next; ptr; ptr = ptr->next) > UnlockReleaseBuffer(ptr->buffer); > } > + > + for (ptr = dist; ptr; ptr = ptr->next) > + PredicateLockPageSplit(rel, > + BufferGetBlockNumber(buffer), > + BufferGetBlockNumber(ptr->buffer)); > + > + I think this new code needs to go before the UnlockReleaseBuffer() calls above. Calling BufferGetBlockNumber() on an already-released buffer is not cool. - Heikki
-
Re: GSoC 2017 : Patch for predicate locking in Gist index
Heikki Linnakangas <hlinnaka@iki.fi> — 2017-06-21T07:42:46Z
On 06/21/2017 10:41 AM, Heikki Linnakangas wrote: > On 06/16/2017 01:24 PM, Shubham Barai wrote: >> @@ -497,6 +499,13 @@ gistplacetopage(Relation rel, Size freespace, GISTSTATE *giststate, >> for (ptr = dist->next; ptr; ptr = ptr->next) >> UnlockReleaseBuffer(ptr->buffer); >> } >> + >> + for (ptr = dist; ptr; ptr = ptr->next) >> + PredicateLockPageSplit(rel, >> + BufferGetBlockNumber(buffer), >> + BufferGetBlockNumber(ptr->buffer)); >> + >> + > > I think this new code needs to go before the UnlockReleaseBuffer() calls > above. Calling BufferGetBlockNumber() on an already-released buffer is > not cool. .. and that's exactly what you fixed in your updated patch. Sorry for the noise :-) - Heikki
-
Re: GSoC 2017 : Patch for predicate locking in Gist index
Shubham Barai <shubhambaraiss@gmail.com> — 2017-06-21T07:52:50Z
Hi, On 21 June 2017 at 13:11, Heikki Linnakangas <hlinnaka@iki.fi> wrote: > On 06/16/2017 01:24 PM, Shubham Barai wrote: > >> @@ -497,6 +499,13 @@ gistplacetopage(Relation rel, Size freespace, >> GISTSTATE *giststate, >> for (ptr = dist->next; ptr; ptr = ptr->next) >> UnlockReleaseBuffer(ptr->buffer); >> } >> + >> + for (ptr = dist; ptr; ptr = ptr->next) >> + PredicateLockPageSplit(rel, >> + >> BufferGetBlockNumber(buffer), >> + >> BufferGetBlockNumber(ptr->buffer)); >> + >> + >> > > I think this new code needs to go before the UnlockReleaseBuffer() calls > above. Calling BufferGetBlockNumber() on an already-released buffer is not > cool. > > - Heikki > > I know that. This is the old version of the patch. I had sent updated patch later. Please have a look at updated patch. Regards, Shubham <https://mailtrack.io/> Sent with Mailtrack <https://mailtrack.io/install?source=signature&lang=en&referral=shubhambaraiss@gmail.com&idSignature=22>
-
Re: GSoC 2017 : Patch for predicate locking in Gist index
x4mmm@yandex-team.ru — 2017-08-16T09:58:08Z
Hi, hackers! > 21 июня 2017 г., в 12:52, Shubham Barai <shubhambaraiss@gmail.com> написал(а): > > Hi, > ... > I know that. This is the old version of the patch. I had sent updated patch later. Please have a look at updated patch. > > Regards, > Shubham Here is some information for reviewers. This applies to patches for GiST, Hash, GIN and SP-GiST. As a mentor of the Shubham's GSoC project for every patch regarding predicate locking I have checked: 0. Correctness of implementation (places of predicate lock function calls, but, anyway, this point deserves special attention) 1. Patch applies and installcheck-world passes 2. Patch contains new isolation tests 3. These tests fail if indexes do not implement predicate locking 4. Patch updates documentation Shubham also had checked that patches work (install check-world) on 1Kb, 8Kb and 32Kb pages. Best regards, Andrey Borodin, Yandex.
-
Re: GSoC 2017 : Patch for predicate locking in Gist index
Alexander Korotkov <a.korotkov@postgrespro.ru> — 2017-09-28T10:59:51Z
Hi! On Wed, Jun 21, 2017 at 10:52 AM, Shubham Barai <shubhambaraiss@gmail.com> wrote: > Hi, > > On 21 June 2017 at 13:11, Heikki Linnakangas <hlinnaka@iki.fi> wrote: > >> On 06/16/2017 01:24 PM, Shubham Barai wrote: >> >>> @@ -497,6 +499,13 @@ gistplacetopage(Relation rel, Size freespace, >>> GISTSTATE *giststate, >>> for (ptr = dist->next; ptr; ptr = ptr->next) >>> UnlockReleaseBuffer(ptr->buffer); >>> } >>> + >>> + for (ptr = dist; ptr; ptr = ptr->next) >>> + PredicateLockPageSplit(rel, >>> + >>> BufferGetBlockNumber(buffer), >>> + >>> BufferGetBlockNumber(ptr->buffer)); >>> + >>> + >>> >> >> I think this new code needs to go before the UnlockReleaseBuffer() calls >> above. Calling BufferGetBlockNumber() on an already-released buffer is not >> cool. >> >> - Heikki >> >> I know that. This is the old version of the patch. I had sent updated > patch later. Please have a look at updated patch. > I took a look on this patch. In gistdoinsert() you do CheckForSerializableConflictIn() only if page wasn't exclusively locked before (xlocked is false). if (!xlocked) > { > LockBuffer(stack->buffer, GIST_UNLOCK); > LockBuffer(stack->buffer, GIST_EXCLUSIVE); > CheckForSerializableConflictIn(r, NULL, stack->buffer); > xlocked = true; However, page might be exclusively locked before. And in this case CheckForSerializableConflictIn() would be skipped. That happens very rarely (someone fixes incomplete split before we did), but nevertheless. ------ Alexander Korotkov Postgres Professional: http://www.postgrespro.com The Russian Postgres Company -
Re: GSoC 2017 : Patch for predicate locking in Gist index
Andrey Borodin <amborodin86@gmail.com> — 2017-10-02T10:40:29Z
Hi, Alexander! Thanks for looking into the patch! On Thu, Sep 28, 2017 at 3:59 PM, Alexander Korotkov < a.korotkov@postgrespro.ru> wrote: > > > In gistdoinsert() you do CheckForSerializableConflictIn() only if page > wasn't exclusively locked before (xlocked is false). > > if (!xlocked) >> { >> LockBuffer(stack->buffer, GIST_UNLOCK); >> LockBuffer(stack->buffer, GIST_EXCLUSIVE); >> CheckForSerializableConflictIn(r, NULL, stack->buffer); >> xlocked = true; > > > However, page might be exclusively locked before. And in this case > CheckForSerializableConflictIn() would be skipped. That happens very > rarely (someone fixes incomplete split before we did), but nevertheless. > if xlocked = true, page was already checked for conflict after setting exclusive lock on it's buffer. I still do not see any problem here... Best regards, Andrey Borodin. -
Re: GSoC 2017 : Patch for predicate locking in Gist index
Shubham Barai <shubhambaraiss@gmail.com> — 2017-10-02T13:12:30Z
On Sep 28, 2017 4:30 PM, "Alexander Korotkov" <a.korotkov@postgrespro.ru> wrote: Hi! On Wed, Jun 21, 2017 at 10:52 AM, Shubham Barai <shubhambaraiss@gmail.com> wrote: > Hi, > > On 21 June 2017 at 13:11, Heikki Linnakangas <hlinnaka@iki.fi> wrote: > >> On 06/16/2017 01:24 PM, Shubham Barai wrote: >> >>> @@ -497,6 +499,13 @@ gistplacetopage(Relation rel, Size freespace, >>> GISTSTATE *giststate, >>> for (ptr = dist->next; ptr; ptr = ptr->next) >>> UnlockReleaseBuffer(ptr->buffer); >>> } >>> + >>> + for (ptr = dist; ptr; ptr = ptr->next) >>> + PredicateLockPageSplit(rel, >>> + >>> BufferGetBlockNumber(buffer), >>> + >>> BufferGetBlockNumber(ptr->buffer)); >>> + >>> + >>> >> >> I think this new code needs to go before the UnlockReleaseBuffer() calls >> above. Calling BufferGetBlockNumber() on an already-released buffer is not >> cool. >> >> - Heikki >> >> I know that. This is the old version of the patch. I had sent updated > patch later. Please have a look at updated patch. > I took a look on this patch. In gistdoinsert() you do CheckForSerializableConflictIn() only if page wasn't exclusively locked before (xlocked is false). if (!xlocked) > { > LockBuffer(stack->buffer, GIST_UNLOCK); > LockBuffer(stack->buffer, GIST_EXCLUSIVE); > CheckForSerializableConflictIn(r, NULL, stack->buffer); > xlocked = true; However, page might be exclusively locked before. And in this case CheckForSerializableConflictIn() would be skipped. That happens very rarely (someone fixes incomplete split before we did), but nevertheless. I agree with Andrey Borodin's view on locks. I am quoting his message "if xlocked = true, page was already checked for conflict after setting exclusive lock on it's buffer. I still do not see any problem here..." Regards, Shubham -
Re: GSoC 2017 : Patch for predicate locking in Gist index
Alexander Korotkov <a.korotkov@postgrespro.ru> — 2017-10-02T15:00:26Z
Hi, Andrew! On Mon, Oct 2, 2017 at 1:40 PM, Andrew Borodin <amborodin86@gmail.com> wrote: > Thanks for looking into the patch! > > On Thu, Sep 28, 2017 at 3:59 PM, Alexander Korotkov < > a.korotkov@postgrespro.ru> wrote: > >> >> >> In gistdoinsert() you do CheckForSerializableConflictIn() only if page >> wasn't exclusively locked before (xlocked is false). >> >> if (!xlocked) >>> { >>> LockBuffer(stack->buffer, GIST_UNLOCK); >>> LockBuffer(stack->buffer, GIST_EXCLUSIVE); >>> CheckForSerializableConflictIn(r, NULL, stack->buffer); >>> xlocked = true; >> >> >> However, page might be exclusively locked before. And in this case >> CheckForSerializableConflictIn() would be skipped. That happens very >> rarely (someone fixes incomplete split before we did), but nevertheless. >> > > if xlocked = true, page was already checked for conflict after setting > exclusive lock on it's buffer. I still do not see any problem here... > What happen if exactly this "continue" fires? if (GistFollowRight(stack->page)) > { > if (!xlocked) > { > LockBuffer(stack->buffer, GIST_UNLOCK); > LockBuffer(stack->buffer, GIST_EXCLUSIVE); > xlocked = true; > /* someone might've completed the split when we unlocked */ > if (!GistFollowRight(stack->page)) > continue; In this case we might get xlocked == true without calling CheckForSerializableConflictIn(). This is very rare codepath, but still... I think it would be rather safe and easy for understanding to more CheckForSerializableConflictIn() directly before gistinserttuple(). ------ Alexander Korotkov Postgres Professional: http://www.postgrespro.com The Russian Postgres Company -
Re: GSoC 2017 : Patch for predicate locking in Gist index
Andrey Borodin <amborodin86@gmail.com> — 2017-10-02T18:11:55Z
On Mon, Oct 2, 2017 at 8:00 PM, Alexander Korotkov <a.korotkov@postgrespro.ru> wrote: > What happen if exactly this "continue" fires? > >> if (GistFollowRight(stack->page)) >> { >> if (!xlocked) >> { >> LockBuffer(stack->buffer, GIST_UNLOCK); >> LockBuffer(stack->buffer, GIST_EXCLUSIVE); >> xlocked = true; >> /* someone might've completed the split when we unlocked */ >> if (!GistFollowRight(stack->page)) >> continue; > > > In this case we might get xlocked == true without calling > CheckForSerializableConflictIn(). Indeed! I've overlooked it. I'm remembering this issue, we were considering not fixing splits if in Serializable isolation, but dropped the idea. CheckForSerializableConflictIn() must be after every exclusive lock. > I think it would be rather safe and easy for understanding to more > CheckForSerializableConflictIn() directly before gistinserttuple(). The difference is that after lock we have conditions to change page, and before gistinserttuple() we have actual intent to change page. From the point of future development first version is better (if some new calls occasionally spawn in), but it has 3 calls while your proposal have 2 calls. It seems to me that CheckForSerializableConflictIn() before gistinserttuple() is better as for now. Best regards, Andrey Borodin. -
Re: GSoC 2017 : Patch for predicate locking in Gist index
Alexander Korotkov <a.korotkov@postgrespro.ru> — 2017-10-02T19:02:26Z
On Mon, Oct 2, 2017 at 9:11 PM, Andrew Borodin <amborodin86@gmail.com> wrote: > On Mon, Oct 2, 2017 at 8:00 PM, Alexander Korotkov > <a.korotkov@postgrespro.ru> wrote: > > What happen if exactly this "continue" fires? > > > >> if (GistFollowRight(stack->page)) > >> { > >> if (!xlocked) > >> { > >> LockBuffer(stack->buffer, GIST_UNLOCK); > >> LockBuffer(stack->buffer, GIST_EXCLUSIVE); > >> xlocked = true; > >> /* someone might've completed the split when we unlocked */ > >> if (!GistFollowRight(stack->page)) > >> continue; > > > > > > In this case we might get xlocked == true without calling > > CheckForSerializableConflictIn(). > Indeed! I've overlooked it. I'm remembering this issue, we were > considering not fixing splits if in Serializable isolation, but > dropped the idea. > Yeah, current insert algorithm assumes that split must be fixed before we can correctly traverse the tree downwards. > CheckForSerializableConflictIn() must be after every exclusive lock. > I'm not sure, that fixing split is the case to necessary call CheckForSerializableConflictIn(). This lock on leaf page is not taken to do modification of the page. It's just taken to ensure that nobody else is fixing this split the same this. After fixing the split, it might appear that insert would go to another page. > I think it would be rather safe and easy for understanding to more > > CheckForSerializableConflictIn() directly before gistinserttuple(). > The difference is that after lock we have conditions to change page, > and before gistinserttuple() we have actual intent to change page. > > From the point of future development first version is better (if some > new calls occasionally spawn in), but it has 3 calls while your > proposal have 2 calls. > It seems to me that CheckForSerializableConflictIn() before > gistinserttuple() is better as for now. > Agree. ------ Alexander Korotkov Postgres Professional: http://www.postgrespro.com The Russian Postgres Company -
Re: GSoC 2017 : Patch for predicate locking in Gist index
Shubham Barai <shubhambaraiss@gmail.com> — 2017-10-05T18:48:13Z
<https://mailtrack.io/> Sent with Mailtrack <https://chrome.google.com/webstore/detail/mailtrack-for-gmail-inbox/ndnaehgpjlnokgebbaldlmgkapkpjkkb?utm_source=gmail&utm_medium=signature&utm_campaign=signaturevirality> <#> On 3 October 2017 at 00:32, Alexander Korotkov <a.korotkov@postgrespro.ru> wrote: > On Mon, Oct 2, 2017 at 9:11 PM, Andrew Borodin <amborodin86@gmail.com> > wrote: > >> On Mon, Oct 2, 2017 at 8:00 PM, Alexander Korotkov >> <a.korotkov@postgrespro.ru> wrote: >> > What happen if exactly this "continue" fires? >> > >> >> if (GistFollowRight(stack->page)) >> >> { >> >> if (!xlocked) >> >> { >> >> LockBuffer(stack->buffer, GIST_UNLOCK); >> >> LockBuffer(stack->buffer, GIST_EXCLUSIVE); >> >> xlocked = true; >> >> /* someone might've completed the split when we unlocked */ >> >> if (!GistFollowRight(stack->page)) >> >> continue; >> > >> > >> > In this case we might get xlocked == true without calling >> > CheckForSerializableConflictIn(). >> Indeed! I've overlooked it. I'm remembering this issue, we were >> considering not fixing splits if in Serializable isolation, but >> dropped the idea. >> > > Yeah, current insert algorithm assumes that split must be fixed before we > can correctly traverse the tree downwards. > > >> CheckForSerializableConflictIn() must be after every exclusive lock. >> > > I'm not sure, that fixing split is the case to necessary call > CheckForSerializableConflictIn(). This lock on leaf page is not taken to > do modification of the page. It's just taken to ensure that nobody else is > fixing this split the same this. After fixing the split, it might appear > that insert would go to another page. > > > I think it would be rather safe and easy for understanding to more >> > CheckForSerializableConflictIn() directly before gistinserttuple(). >> The difference is that after lock we have conditions to change page, >> and before gistinserttuple() we have actual intent to change page. >> >> From the point of future development first version is better (if some >> new calls occasionally spawn in), but it has 3 calls while your >> proposal have 2 calls. >> It seems to me that CheckForSerializableConflictIn() before >> gistinserttuple() is better as for now. >> > > Agree. > I have updated the location of CheckForSerializableConflictIn() and changed the status of the patch to "needs review". Regards, Shubham -
Re: GSoC 2017 : Patch for predicate locking in Gist index
Alexander Korotkov <a.korotkov@postgrespro.ru> — 2017-10-09T13:27:46Z
On Thu, Oct 5, 2017 at 9:48 PM, Shubham Barai <shubhambaraiss@gmail.com> wrote: > On 3 October 2017 at 00:32, Alexander Korotkov <a.korotkov@postgrespro.ru> > wrote: > >> On Mon, Oct 2, 2017 at 9:11 PM, Andrew Borodin <amborodin86@gmail.com> >> wrote: >> >>> On Mon, Oct 2, 2017 at 8:00 PM, Alexander Korotkov >>> <a.korotkov@postgrespro.ru> wrote: >>> > What happen if exactly this "continue" fires? >>> > >>> >> if (GistFollowRight(stack->page)) >>> >> { >>> >> if (!xlocked) >>> >> { >>> >> LockBuffer(stack->buffer, GIST_UNLOCK); >>> >> LockBuffer(stack->buffer, GIST_EXCLUSIVE); >>> >> xlocked = true; >>> >> /* someone might've completed the split when we unlocked */ >>> >> if (!GistFollowRight(stack->page)) >>> >> continue; >>> > >>> > >>> > In this case we might get xlocked == true without calling >>> > CheckForSerializableConflictIn(). >>> Indeed! I've overlooked it. I'm remembering this issue, we were >>> considering not fixing splits if in Serializable isolation, but >>> dropped the idea. >>> >> >> Yeah, current insert algorithm assumes that split must be fixed before we >> can correctly traverse the tree downwards. >> >> >>> CheckForSerializableConflictIn() must be after every exclusive lock. >>> >> >> I'm not sure, that fixing split is the case to necessary call >> CheckForSerializableConflictIn(). This lock on leaf page is not taken >> to do modification of the page. It's just taken to ensure that nobody else >> is fixing this split the same this. After fixing the split, it might >> appear that insert would go to another page. >> >> > I think it would be rather safe and easy for understanding to more >>> > CheckForSerializableConflictIn() directly before gistinserttuple(). >>> The difference is that after lock we have conditions to change page, >>> and before gistinserttuple() we have actual intent to change page. >>> >>> From the point of future development first version is better (if some >>> new calls occasionally spawn in), but it has 3 calls while your >>> proposal have 2 calls. >>> It seems to me that CheckForSerializableConflictIn() before >>> gistinserttuple() is better as for now. >>> >> >> Agree. >> > > I have updated the location of CheckForSerializableConflictIn() and > changed the status of the patch to "needs review". > Now, ITSM that predicate locks and conflict checks are placed right for now. However, it would be good to add couple comments to gistdoinsert() whose would state why do we call CheckForSerializableConflictIn() in these particular places. I also take a look at isolation tests. You made two separate test specs: one to verify that serialization failures do fire, and another to check there are no false positives. I wonder if we could merge this two test specs into one, but use more variety of statements with different keys for both inserts and selects. ------ Alexander Korotkov Postgres Professional: http://www.postgrespro.com The Russian Postgres Company -
Re: GSoC 2017 : Patch for predicate locking in Gist index
Shubham Barai <shubhambaraiss@gmail.com> — 2017-10-31T21:10:44Z
On 9 October 2017 at 18:57, Alexander Korotkov <a.korotkov@postgrespro.ru> wrote: > On Thu, Oct 5, 2017 at 9:48 PM, Shubham Barai <shubhambaraiss@gmail.com> > wrote: > >> On 3 October 2017 at 00:32, Alexander Korotkov <a.korotkov@postgrespro.ru >> > wrote: >> >>> On Mon, Oct 2, 2017 at 9:11 PM, Andrew Borodin <amborodin86@gmail.com> >>> wrote: >>> >>>> On Mon, Oct 2, 2017 at 8:00 PM, Alexander Korotkov >>>> <a.korotkov@postgrespro.ru> wrote: >>>> > What happen if exactly this "continue" fires? >>>> > >>>> >> if (GistFollowRight(stack->page)) >>>> >> { >>>> >> if (!xlocked) >>>> >> { >>>> >> LockBuffer(stack->buffer, GIST_UNLOCK); >>>> >> LockBuffer(stack->buffer, GIST_EXCLUSIVE); >>>> >> xlocked = true; >>>> >> /* someone might've completed the split when we unlocked */ >>>> >> if (!GistFollowRight(stack->page)) >>>> >> continue; >>>> > >>>> > >>>> > In this case we might get xlocked == true without calling >>>> > CheckForSerializableConflictIn(). >>>> Indeed! I've overlooked it. I'm remembering this issue, we were >>>> considering not fixing splits if in Serializable isolation, but >>>> dropped the idea. >>>> >>> >>> Yeah, current insert algorithm assumes that split must be fixed before >>> we can correctly traverse the tree downwards. >>> >>> >>>> CheckForSerializableConflictIn() must be after every exclusive lock. >>>> >>> >>> I'm not sure, that fixing split is the case to necessary call >>> CheckForSerializableConflictIn(). This lock on leaf page is not taken >>> to do modification of the page. It's just taken to ensure that nobody else >>> is fixing this split the same this. After fixing the split, it might >>> appear that insert would go to another page. >>> >>> > I think it would be rather safe and easy for understanding to more >>>> > CheckForSerializableConflictIn() directly before gistinserttuple(). >>>> The difference is that after lock we have conditions to change page, >>>> and before gistinserttuple() we have actual intent to change page. >>>> >>>> From the point of future development first version is better (if some >>>> new calls occasionally spawn in), but it has 3 calls while your >>>> proposal have 2 calls. >>>> It seems to me that CheckForSerializableConflictIn() before >>>> gistinserttuple() is better as for now. >>>> >>> >>> Agree. >>> >> >> I have updated the location of CheckForSerializableConflictIn() and >> changed the status of the patch to "needs review". >> > > Now, ITSM that predicate locks and conflict checks are placed right for > now. > However, it would be good to add couple comments to gistdoinsert() whose > would state why do we call CheckForSerializableConflictIn() in these > particular places. > > I also take a look at isolation tests. You made two separate test specs: > one to verify that serialization failures do fire, and another to check > there are no false positives. > I wonder if we could merge this two test specs into one, but use more > variety of statements with different keys for both inserts and selects. > Please find the updated version of patch here. I have made suggested changes. Regards, Shubham -
Re: [HACKERS] GSoC 2017 : Patch for predicate locking in Gist index
Alexander Korotkov <a.korotkov@postgrespro.ru> — 2017-11-27T07:47:32Z
Hi, Shubham! On Wed, Nov 1, 2017 at 12:10 AM, Shubham Barai <shubhambaraiss@gmail.com> wrote: > On 9 October 2017 at 18:57, Alexander Korotkov <a.korotkov@postgrespro.ru> > wrote: > >> Now, ITSM that predicate locks and conflict checks are placed right for >> now. >> However, it would be good to add couple comments to gistdoinsert() whose >> would state why do we call CheckForSerializableConflictIn() in these >> particular places. >> >> I also take a look at isolation tests. You made two separate test specs: >> one to verify that serialization failures do fire, and another to check >> there are no false positives. >> I wonder if we could merge this two test specs into one, but use more >> variety of statements with different keys for both inserts and selects. >> > > Please find the updated version of patch here. I have made suggested > changes. > In general, patch looks good for me now. I just see some cosmetic issues. /* > + *Check for any r-w conflicts (in serialisation isolation level) > + *just before we intend to modify the page > + */ > + CheckForSerializableConflictIn(r, NULL, stack->buffer); > + /* Formatting doesn't look good here. You've missed space after star sign in the comment. You also missed newline after CheckForSerializableConflictIn() call. Also, you've long comment lines in predicate-gist.spec. Please, break long comments into multiple lines. ------ Alexander Korotkov Postgres Professional: http://www.postgrespro.com The Russian Postgres Company
-
Re: [HACKERS] GSoC 2017 : Patch for predicate locking in Gist index
Michael Paquier <michael.paquier@gmail.com> — 2017-11-29T01:53:13Z
On Mon, Nov 27, 2017 at 4:47 PM, Alexander Korotkov <a.korotkov@postgrespro.ru> wrote: > Also, you've long comment lines in predicate-gist.spec. Please, break long > comments into multiple lines. Two days is to short to reply. I am moving this patch to next CF. -- Michael
-
Re: [HACKERS] GSoC 2017 : Patch for predicate locking in Gist index
Shubham Barai <shubhambaraiss@gmail.com> — 2017-11-29T17:50:36Z
On 27 November 2017 at 13:17, Alexander Korotkov <a.korotkov@postgrespro.ru> wrote: > Hi, Shubham! > > On Wed, Nov 1, 2017 at 12:10 AM, Shubham Barai <shubhambaraiss@gmail.com> > wrote: > >> On 9 October 2017 at 18:57, Alexander Korotkov <a.korotkov@postgrespro.ru >> > wrote: >> >>> Now, ITSM that predicate locks and conflict checks are placed right for >>> now. >>> However, it would be good to add couple comments to gistdoinsert() whose >>> would state why do we call CheckForSerializableConflictIn() in these >>> particular places. >>> >>> I also take a look at isolation tests. You made two separate test >>> specs: one to verify that serialization failures do fire, and another to >>> check there are no false positives. >>> I wonder if we could merge this two test specs into one, but use more >>> variety of statements with different keys for both inserts and selects. >>> >> >> Please find the updated version of patch here. I have made suggested >> changes. >> > > In general, patch looks good for me now. I just see some cosmetic issues. > > /* >> + *Check for any r-w conflicts (in serialisation isolation level) >> + *just before we intend to modify the page >> + */ >> + CheckForSerializableConflictIn(r, NULL, stack->buffer); >> + /* > > > Formatting doesn't look good here. You've missed space after star sign in > the comment. You also missed newline after CheckForSerializableConflictIn() > call. > > Also, you've long comment lines in predicate-gist.spec. Please, break > long comments into multiple lines. > > I have fixed formatting style. Please take a look at updated patch. Regards, Shubham > >
-
Re: [HACKERS] GSoC 2017 : Patch for predicate locking in Gist index
x4mmm@yandex-team.ru — 2018-01-04T16:07:56Z
Hello everyone! > 29 нояб. 2017 г., в 22:50, Shubham Barai <shubhambaraiss@gmail.com> написал(а): > > I have fixed formatting style. Please take a look at updated patch. Here's rebased patch. Every issue has been addressed, so I'm marking this patch as ready for committer. Best regards, Andrey Borodin.
-
Re: [HACKERS] GSoC 2017 : Patch for predicate locking in Gist index
Alexander Korotkov <a.korotkov@postgrespro.ru> — 2018-01-04T21:48:23Z
On Thu, Jan 4, 2018 at 7:07 PM, Andrey Borodin <x4mmm@yandex-team.ru> wrote: > 29 нояб. 2017 г., в 22:50, Shubham Barai <shubhambaraiss@gmail.com> > написал(а): > > I have fixed formatting style. Please take a look at updated patch. > > > Here's rebased patch. Every issue has been addressed, so I'm marking this > patch as ready for committer. > I'm sorry for concentrating on boring things, but formatting of predicate-gist.spec still doesn't look good for me. # To verify serialization failures, queries and permutations are written in > such > # a way that an index scan(from one transaction) and an index insert(from > another > # transaction) will try to access the same part(sub-tree) of the index. > # > # To check reduced false positives, queries and permutations are written > in such > # a way that an index scan(from one transaction) and an index insert(from > another > # transaction) will try to access different parts(sub-tree) of the index. > No space before open bracket (I think it should be when there are multiple words brackets). Also, we're trying to fit our lines to 80 characters (if it's not objectively difficult). And these are two almost same paragraphs. I think it should be simplified. setup > { > create table gist_point_tbl(id int4, p point); > create index gist_pointidx on gist_point_tbl using gist(p); > insert into gist_point_tbl (id, p) > select g, point(g*10, g*10) from generate_series(1, 1000) g; > } > setup > { > BEGIN ISOLATION LEVEL SERIALIZABLE; > set enable_seqscan=off; > set enable_bitmapscan=off; > set enable_indexonlyscan=on; > } > setup { > BEGIN ISOLATION LEVEL SERIALIZABLE; > set enable_seqscan=off; > set enable_bitmapscan=off; > set enable_indexonlyscan=on; > } I didn't get idea of using various indentation styles for same purpose. step "wx3" { insert into gist_point_tbl (id, p) > select g, point(g*500, g*500) from generate_series(12, > 18) g; } Indented using spaces here... ------ Alexander Korotkov Postgres Professional: http://www.postgrespro.com The Russian Postgres Company -
Re: [HACKERS] GSoC 2017 : Patch for predicate locking in Gist index
Shubham Barai <shubhambaraiss@gmail.com> — 2018-01-08T17:14:37Z
On 5 January 2018 at 03:18, Alexander Korotkov <a.korotkov@postgrespro.ru> wrote: > On Thu, Jan 4, 2018 at 7:07 PM, Andrey Borodin <x4mmm@yandex-team.ru> > wrote: > >> 29 нояб. 2017 г., в 22:50, Shubham Barai <shubhambaraiss@gmail.com> >> написал(а): >> >> I have fixed formatting style. Please take a look at updated patch. >> >> >> Here's rebased patch. Every issue has been addressed, so I'm marking this >> patch as ready for committer. >> > > I'm sorry for concentrating on boring things, but formatting of > predicate-gist.spec still doesn't look good for me. > > # To verify serialization failures, queries and permutations are written >> in such >> # a way that an index scan(from one transaction) and an index insert(from >> another >> # transaction) will try to access the same part(sub-tree) of the index. >> # >> # To check reduced false positives, queries and permutations are written >> in such >> # a way that an index scan(from one transaction) and an index insert(from >> another >> # transaction) will try to access different parts(sub-tree) of the index. >> > > No space before open bracket (I think it should be when there are multiple > words brackets). > Also, we're trying to fit our lines to 80 characters (if it's not > objectively difficult). > And these are two almost same paragraphs. I think it should be simplified. > > setup >> { >> create table gist_point_tbl(id int4, p point); >> create index gist_pointidx on gist_point_tbl using gist(p); >> insert into gist_point_tbl (id, p) >> select g, point(g*10, g*10) from generate_series(1, 1000) g; >> } >> setup >> { >> BEGIN ISOLATION LEVEL SERIALIZABLE; >> set enable_seqscan=off; >> set enable_bitmapscan=off; >> set enable_indexonlyscan=on; >> } >> setup { >> BEGIN ISOLATION LEVEL SERIALIZABLE; >> set enable_seqscan=off; >> set enable_bitmapscan=off; >> set enable_indexonlyscan=on; >> } > > > I didn't get idea of using various indentation styles for same purpose. > > step "wx3" { insert into gist_point_tbl (id, p) >> select g, point(g*500, g*500) from generate_series(12, >> 18) g; } > > > Indented using spaces here... > > I have fixed formatting issues. Please have a look at updated patch. Regards, Shubham -
Re: [HACKERS] GSoC 2017 : Patch for predicate locking in Gist index
Shubham Barai <shubhambaraiss@gmail.com> — 2018-01-08T17:43:36Z
On 8 January 2018 at 22:44, Shubham Barai <shubhambaraiss@gmail.com> wrote: > > > On 5 January 2018 at 03:18, Alexander Korotkov <a.korotkov@postgrespro.ru> > wrote: > >> On Thu, Jan 4, 2018 at 7:07 PM, Andrey Borodin <x4mmm@yandex-team.ru> >> wrote: >> >>> 29 нояб. 2017 г., в 22:50, Shubham Barai <shubhambaraiss@gmail.com> >>> написал(а): >>> >>> I have fixed formatting style. Please take a look at updated patch. >>> >>> >>> Here's rebased patch. Every issue has been addressed, so I'm marking >>> this patch as ready for committer. >>> >> >> I'm sorry for concentrating on boring things, but formatting of >> predicate-gist.spec still doesn't look good for me. >> >> # To verify serialization failures, queries and permutations are written >>> in such >>> # a way that an index scan(from one transaction) and an index >>> insert(from another >>> # transaction) will try to access the same part(sub-tree) of the index. >>> # >>> # To check reduced false positives, queries and permutations are written >>> in such >>> # a way that an index scan(from one transaction) and an index >>> insert(from another >>> # transaction) will try to access different parts(sub-tree) of the index. >>> >> >> No space before open bracket (I think it should be when there are >> multiple words brackets). >> Also, we're trying to fit our lines to 80 characters (if it's not >> objectively difficult). >> And these are two almost same paragraphs. I think it should be >> simplified. >> >> setup >>> { >>> create table gist_point_tbl(id int4, p point); >>> create index gist_pointidx on gist_point_tbl using gist(p); >>> insert into gist_point_tbl (id, p) >>> select g, point(g*10, g*10) from generate_series(1, 1000) g; >>> } >>> setup >>> { >>> BEGIN ISOLATION LEVEL SERIALIZABLE; >>> set enable_seqscan=off; >>> set enable_bitmapscan=off; >>> set enable_indexonlyscan=on; >>> } >>> setup { >>> BEGIN ISOLATION LEVEL SERIALIZABLE; >>> set enable_seqscan=off; >>> set enable_bitmapscan=off; >>> set enable_indexonlyscan=on; >>> } >> >> >> I didn't get idea of using various indentation styles for same purpose. >> >> step "wx3" { insert into gist_point_tbl (id, p) >>> select g, point(g*500, g*500) from generate_series(12, >>> 18) g; } >> >> >> Indented using spaces here... >> >> > > I have fixed formatting issues. Please have a look at updated patch. Regards, Shubham -
Re: [HACKERS] GSoC 2017 : Patch for predicate locking in Gist index
Shubham Barai <shubhambaraiss@gmail.com> — 2018-01-10T18:55:57Z
On 8 January 2018 at 23:13, Shubham Barai <shubhambaraiss@gmail.com> wrote: > > > On 8 January 2018 at 22:44, Shubham Barai <shubhambaraiss@gmail.com> > wrote: > >> >> >> On 5 January 2018 at 03:18, Alexander Korotkov <a.korotkov@postgrespro.ru >> > wrote: >> >>> On Thu, Jan 4, 2018 at 7:07 PM, Andrey Borodin <x4mmm@yandex-team.ru> >>> wrote: >>> >>>> 29 нояб. 2017 г., в 22:50, Shubham Barai <shubhambaraiss@gmail.com> >>>> написал(а): >>>> >>>> I have fixed formatting style. Please take a look at updated patch. >>>> >>>> >>>> Here's rebased patch. Every issue has been addressed, so I'm marking >>>> this patch as ready for committer. >>>> >>> >>> I'm sorry for concentrating on boring things, but formatting of >>> predicate-gist.spec still doesn't look good for me. >>> >>> # To verify serialization failures, queries and permutations are written >>>> in such >>>> # a way that an index scan(from one transaction) and an index >>>> insert(from another >>>> # transaction) will try to access the same part(sub-tree) of the index. >>>> # >>>> # To check reduced false positives, queries and permutations are >>>> written in such >>>> # a way that an index scan(from one transaction) and an index >>>> insert(from another >>>> # transaction) will try to access different parts(sub-tree) of the >>>> index. >>>> >>> >>> No space before open bracket (I think it should be when there are >>> multiple words brackets). >>> Also, we're trying to fit our lines to 80 characters (if it's not >>> objectively difficult). >>> And these are two almost same paragraphs. I think it should be >>> simplified. >>> >>> setup >>>> { >>>> create table gist_point_tbl(id int4, p point); >>>> create index gist_pointidx on gist_point_tbl using gist(p); >>>> insert into gist_point_tbl (id, p) >>>> select g, point(g*10, g*10) from generate_series(1, 1000) g; >>>> } >>>> setup >>>> { >>>> BEGIN ISOLATION LEVEL SERIALIZABLE; >>>> set enable_seqscan=off; >>>> set enable_bitmapscan=off; >>>> set enable_indexonlyscan=on; >>>> } >>>> setup { >>>> BEGIN ISOLATION LEVEL SERIALIZABLE; >>>> set enable_seqscan=off; >>>> set enable_bitmapscan=off; >>>> set enable_indexonlyscan=on; >>>> } >>> >>> >>> I didn't get idea of using various indentation styles for same purpose. >>> >>> step "wx3" { insert into gist_point_tbl (id, p) >>>> select g, point(g*500, g*500) from >>>> generate_series(12, 18) g; } >>> >>> >>> Indented using spaces here... >>> >>> >> >> > I have fixed formatting issues. Please have a look at updated patch. > > The previous patch couldn't be applied cleanly because there were some modifications to isolation_schedule. I have updated the patch now. Regards, Shubham -
Re: [HACKERS] GSoC 2017 : Patch for predicate locking in Gist index
Alexander Korotkov <a.korotkov@postgrespro.ru> — 2018-01-25T13:10:26Z
On Wed, Jan 10, 2018 at 9:55 PM, Shubham Barai <shubhambaraiss@gmail.com> wrote: > The previous patch couldn't be applied cleanly because there were some > modifications to isolation_schedule. I have updated the patch now. > In the attached patch indentation is still looking strange. I've contacted Shubham using Telegram, and we realized that it's because he used tab width 8 in his editor. Shumham seems to have updated version of this patch, but didn't post it yet. Thus, I'm marking this "Waiting on author" until the updated patch is posted. ------ Alexander Korotkov Postgres Professional: http://www.postgrespro.com The Russian Postgres Company
-
Re: [HACKERS] GSoC 2017 : Patch for predicate locking in Gist index
Shubham Barai <shubhambaraiss@gmail.com> — 2018-01-25T14:13:35Z
On 25 January 2018 at 18:40, Alexander Korotkov <a.korotkov@postgrespro.ru> wrote: > On Wed, Jan 10, 2018 at 9:55 PM, Shubham Barai <shubhambaraiss@gmail.com> > wrote: > >> The previous patch couldn't be applied cleanly because there were some >> modifications to isolation_schedule. I have updated the patch now. >> > > In the attached patch indentation is still looking strange. > I've contacted Shubham using Telegram, and we realized that > it's because he used tab width 8 in his editor. > Shumham seems to have updated version of this patch, but didn't > post it yet. Thus, I'm marking this "Waiting on author" until > the updated patch is posted. > > > I have fixed formatting issues. Please take a look at updated patch. Regards, Shubham
-
Re: [HACKERS] GSoC 2017 : Patch for predicate locking in Gist index
Alexander Korotkov <a.korotkov@postgrespro.ru> — 2018-01-25T14:32:45Z
On Thu, Jan 25, 2018 at 5:13 PM, Shubham Barai <shubhambaraiss@gmail.com> wrote: > > > On 25 January 2018 at 18:40, Alexander Korotkov <a.korotkov@postgrespro.ru > > wrote: > >> On Wed, Jan 10, 2018 at 9:55 PM, Shubham Barai <shubhambaraiss@gmail.com> >> wrote: >> >>> The previous patch couldn't be applied cleanly because there were some >>> modifications to isolation_schedule. I have updated the patch now. >>> >> >> In the attached patch indentation is still looking strange. >> I've contacted Shubham using Telegram, and we realized that >> it's because he used tab width 8 in his editor. >> Shumham seems to have updated version of this patch, but didn't >> post it yet. Thus, I'm marking this "Waiting on author" until >> the updated patch is posted. >> >> >> > I have fixed formatting issues. Please take a look at updated patch. > Now it looks good for me. I'm marking it "Ready for committer". ------ Alexander Korotkov Postgres Professional: http://www.postgrespro.com The Russian Postgres Company
-
Re: [HACKERS] GSoC 2017 : Patch for predicate locking in Gist index
Teodor Sigaev <teodor@sigaev.ru> — 2018-03-27T07:53:12Z
Hi! > Now it looks good for me. I'm marking it "Ready for committer". 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... See attached version of patch. -- Teodor Sigaev E-mail: teodor@sigaev.ru WWW: http://www.sigaev.ru/ -
Re: [HACKERS] GSoC 2017 : Patch for predicate locking in Gist index
x4mmm@yandex-team.ru — 2018-03-27T08:16:19Z
Hi1 > 27 марта 2018 г., в 12:53, Teodor Sigaev <teodor@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 2. Finish split - i'm not sure about this. It seems to me that it is necessary... then your version is correct. Best regards, Andrey Borodin.
-
Re: [HACKERS] GSoC 2017 : Patch for predicate locking in Gist index
Alexander Korotkov <a.korotkov@postgrespro.ru> — 2018-03-27T08:45:32Z
Hi! On Tue, Mar 27, 2018 at 11:16 AM, Andrey Borodin <x4mmm@yandex-team.ru> wrote: > > 27 марта 2018 г., в 12:53, Teodor Sigaev <teodor@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(). Also, I find that we call PredicateLockPageSplit() for every page produced by split including original. That also seems to cause extra overhead. This is why I've moved PredicateLockPageSplit() into loop where we do assign new buffers. ------ Alexander Korotkov Postgres Professional: http://www.postgrespro.com The Russian Postgres Company
-
Re: [HACKERS] GSoC 2017 : Patch for predicate locking in Gist index
x4mmm@yandex-team.ru — 2018-03-27T09:07:55Z
> 27 марта 2018 г., в 13:45, Alexander Korotkov <a.korotkov@postgrespro.ru> написал(а): > > On Tue, Mar 27, 2018 at 11:16 AM, Andrey Borodin <x4mmm@yandex-team.ru <mailto:x4mmm@yandex-team.ru>> wrote: > > 27 марта 2018 г., в 12:53, Teodor Sigaev <teodor@sigaev.ru <mailto:teodor@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.
-
Re: [HACKERS] GSoC 2017 : Patch for predicate locking in Gist index
Teodor Sigaev <teodor@sigaev.ru> — 2018-03-27T12:44:48Z
Thanks to everyone, pushed Andrey Borodin wrote: > > >> 27 марта 2018 г., в 13:45, Alexander Korotkov <a.korotkov@postgrespro.ru >> <mailto:a.korotkov@postgrespro.ru>> написал(а): >> >> On Tue, Mar 27, 2018 at 11:16 AM, Andrey Borodin <x4mmm@yandex-team.ru >> <mailto:x4mmm@yandex-team.ru>> wrote: >> >> > 27 марта 2018 г., в 12:53, Teodor Sigaev <teodor@sigaev.ru >> <mailto:teodor@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. -- Teodor Sigaev E-mail: teodor@sigaev.ru WWW: http://www.sigaev.ru/