Skip to content

Commit 356a5af

Browse files
committed
Fix insertion into end of page which have right link. Previous coding
inserts all avaliable items although part of them should be inserted to right page. Added check on right bound of page.
1 parent 8dcbdea commit 356a5af

File tree

2 files changed

+18
-41
lines changed

2 files changed

+18
-41
lines changed

rumbtree.c

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -203,10 +203,6 @@ rumFindLeafPage(RumBtree btree, RumBtreeStack * stack)
203203

204204
/*
205205
* Step from current page.
206-
*
207-
* The next page is locked first, before releasing the current page. This is
208-
* crucial to protect from concurrent page deletion (see comment in
209-
* rumDeletePage).
210206
*/
211207
Buffer
212208
rumStep(Buffer buffer, Relation index, int lockmode,
@@ -229,8 +225,8 @@ rumStep(Buffer buffer, Relation index, int lockmode,
229225
}
230226

231227
nextbuffer = ReadBuffer(index, blkno);
232-
LockBuffer(nextbuffer, lockmode);
233228
UnlockReleaseBuffer(buffer);
229+
LockBuffer(nextbuffer, lockmode);
234230

235231
/* Sanity check that the page we stepped to is of similar kind. */
236232
page = BufferGetPage(nextbuffer);

rumdatapage.c

Lines changed: 17 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -905,9 +905,18 @@ dataPlaceToPage(RumBtree btree, Page page, OffsetNumber off)
905905
if (stopAppend)
906906
/* there is no free space on page */
907907
break;
908-
else
908+
else if (RumPageRightMost(page))
909909
/* force insertion of new item */
910910
cmp = 1;
911+
else if ((cmp = compareRumKey(btree->rumstate, btree->entryAttnum,
912+
RumDataPageGetRightBound(page),
913+
btree->items + btree->curitem)) >= 0)
914+
{
915+
/* force insertion of new item */
916+
}
917+
else
918+
/* new items should be inserted on next page */
919+
break;
911920
}
912921
else if (off <= maxoff)
913922
{
@@ -930,10 +939,7 @@ dataPlaceToPage(RumBtree btree, Page page, OffsetNumber off)
930939
copyItemEmpty = true;
931940

932941
if (cmp == 0)
933-
{
934942
btree->curitem++;
935-
insertCount++;
936-
}
937943
}
938944
else /* if (cmp > 0) */
939945
{
@@ -957,8 +963,8 @@ dataPlaceToPage(RumBtree btree, Page page, OffsetNumber off)
957963

958964
Assert(ptr - oldptr == newItemSize);
959965
iptr = btree->items[btree->curitem].iptr;
960-
btree->curitem++;
961966
freespace -= newItemSize;
967+
btree->curitem++;
962968
insertCount++;
963969
}
964970
else
@@ -970,7 +976,6 @@ dataPlaceToPage(RumBtree btree, Page page, OffsetNumber off)
970976
Assert(RumDataPageFreeSpacePre(page, ptr) >= 0);
971977
}
972978

973-
Assert(insertCount > 0);
974979
RumPageGetOpaque(page)->maxoff += insertCount;
975980

976981
/* Update indexes in the end of page */
@@ -1209,7 +1214,6 @@ dataSplitPageInternal(RumBtree btree, Buffer lbuf, Buffer rbuf,
12091214
OffsetNumber maxoff = RumPageGetOpaque(newlPage)->maxoff;
12101215
Size pageSize = PageGetPageSize(newlPage);
12111216
Size freeSpace;
1212-
uint32 nCopied = 1;
12131217

12141218
static char vector[2 * BLCKSZ];
12151219

@@ -1220,36 +1224,13 @@ dataSplitPageInternal(RumBtree btree, Buffer lbuf, Buffer rbuf,
12201224
memcpy(vector, RumDataPageGetItem(newlPage, FirstOffsetNumber),
12211225
maxoff * sizeofitem);
12221226

1223-
if (RumPageIsLeaf(newlPage) && RumPageRightMost(newlPage) &&
1224-
off > RumPageGetOpaque(newlPage)->maxoff)
1225-
{
1226-
nCopied = 0;
1227-
while (btree->curitem < btree->nitem &&
1228-
maxoff * sizeof(ItemPointerData) < 2 * (freeSpace - sizeof(ItemPointerData)))
1229-
{
1230-
memcpy(vector + maxoff * sizeof(ItemPointerData),
1231-
&btree->items[btree->curitem].iptr,
1232-
sizeof(ItemPointerData));
1233-
maxoff++;
1234-
nCopied++;
1235-
btree->curitem++;
1236-
}
1237-
}
1238-
else
1239-
{
1240-
ptr = vector + (off - 1) * sizeofitem;
1241-
if (maxoff + 1 - off != 0)
1242-
memmove(ptr + sizeofitem, ptr, (maxoff - off + 1) * sizeofitem);
1243-
if (RumPageIsLeaf(newlPage))
1244-
{
1245-
memcpy(ptr, &btree->items[btree->curitem].iptr, sizeofitem);
1246-
btree->curitem++;
1247-
}
1248-
else
1249-
memcpy(ptr, &(btree->pitem), sizeofitem);
1227+
Assert(!RumPageIsLeaf(newlPage));
1228+
ptr = vector + (off - 1) * sizeofitem;
1229+
if (maxoff + 1 - off != 0)
1230+
memmove(ptr + sizeofitem, ptr, (maxoff - off + 1) * sizeofitem);
1231+
memcpy(ptr, &(btree->pitem), sizeofitem);
12501232

1251-
maxoff++;
1252-
}
1233+
maxoff++;
12531234

12541235
/*
12551236
* we suppose that during index creation table scaned from begin to end,

0 commit comments

Comments
 (0)