Skip to content

Commit 5010126

Browse files
committed
Refactor the internal GIN B-tree interface for forming a downlink.
This creates a new gin-btree callback function for creating a downlink for a page. Previously, ginxlog.c duplicated the logic used during normal operation.
1 parent 04965ad commit 5010126

File tree

5 files changed

+38
-40
lines changed

5 files changed

+38
-40
lines changed

src/backend/access/gin/ginbtree.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -452,6 +452,7 @@ ginInsertValue(GinBtree btree, GinBtreeStack *stack, GinStatsData *buildStats)
452452
}
453453
}
454454

455+
btree->prepareDownlink(btree, stack->buffer);
455456
btree->isDelete = FALSE;
456457

457458
/* search parent to lock */

src/backend/access/gin/gindatapage.c

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -580,12 +580,20 @@ dataSplitPage(GinBtree btree, Buffer lbuf, Buffer rbuf, OffsetNumber off, XLogRe
580580
rdata[1].len = MAXALIGN(maxoff * sizeofitem);
581581
rdata[1].next = NULL;
582582

583-
/* Prepare a downlink tuple for insertion to the parent */
583+
return lpage;
584+
}
585+
586+
/*
587+
* Prepare the state in 'btree' for inserting a downlink for given buffer.
588+
*/
589+
static void
590+
dataPrepareDownlink(GinBtree btree, Buffer lbuf)
591+
{
592+
Page lpage = BufferGetPage(lbuf);
593+
584594
PostingItemSetBlockNumber(&(btree->pitem), BufferGetBlockNumber(lbuf));
585595
btree->pitem.key = *GinDataPageGetRightBound(lpage);
586-
btree->rightblkno = BufferGetBlockNumber(rbuf);
587-
588-
return lpage;
596+
btree->rightblkno = GinPageGetOpaque(lpage)->rightlink;
589597
}
590598

591599
/*
@@ -704,6 +712,7 @@ ginPrepareDataScan(GinBtree btree, Relation index)
704712
btree->placeToPage = dataPlaceToPage;
705713
btree->splitPage = dataSplitPage;
706714
btree->fillRoot = ginDataFillRoot;
715+
btree->prepareDownlink = dataPrepareDownlink;
707716

708717
btree->isData = TRUE;
709718
btree->isDelete = FALSE;

src/backend/access/gin/ginentrypage.c

Lines changed: 21 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -570,8 +570,7 @@ entrySplitPage(GinBtree btree, Buffer lbuf, Buffer rbuf, OffsetNumber off, XLogR
570570
Size lsize = 0,
571571
size;
572572
char *ptr;
573-
IndexTuple itup,
574-
leftrightmost = NULL;
573+
IndexTuple itup;
575574
Page page;
576575
Page lpage = PageGetTempPageCopy(BufferGetPage(lbuf));
577576
Page rpage = BufferGetPage(rbuf);
@@ -635,7 +634,6 @@ entrySplitPage(GinBtree btree, Buffer lbuf, Buffer rbuf, OffsetNumber off, XLogR
635634
}
636635
else
637636
{
638-
leftrightmost = itup;
639637
lsize += MAXALIGN(IndexTupleSize(itup)) + sizeof(ItemIdData);
640638
}
641639

@@ -645,11 +643,6 @@ entrySplitPage(GinBtree btree, Buffer lbuf, Buffer rbuf, OffsetNumber off, XLogR
645643
ptr += MAXALIGN(IndexTupleSize(itup));
646644
}
647645

648-
btree->entry = GinFormInteriorTuple(leftrightmost, lpage,
649-
BufferGetBlockNumber(lbuf));
650-
651-
btree->rightblkno = BufferGetBlockNumber(rbuf);
652-
653646
data.node = btree->index->rd_node;
654647
data.rootBlkno = InvalidBlockNumber;
655648
data.lblkno = BufferGetBlockNumber(lbuf);
@@ -674,19 +667,20 @@ entrySplitPage(GinBtree btree, Buffer lbuf, Buffer rbuf, OffsetNumber off, XLogR
674667
}
675668

676669
/*
677-
* return newly allocated rightmost tuple
670+
* Prepare the state in 'btree' for inserting a downlink for given buffer.
678671
*/
679-
IndexTuple
680-
ginPageGetLinkItup(Buffer buf)
672+
static void
673+
entryPrepareDownlink(GinBtree btree, Buffer lbuf)
681674
{
682-
IndexTuple itup,
683-
nitup;
684-
Page page = BufferGetPage(buf);
675+
Page lpage = BufferGetPage(lbuf);
676+
IndexTuple itup;
685677

686-
itup = getRightMostTuple(page);
687-
nitup = GinFormInteriorTuple(itup, page, BufferGetBlockNumber(buf));
678+
itup = getRightMostTuple(lpage);
688679

689-
return nitup;
680+
btree->entry = GinFormInteriorTuple(itup,
681+
lpage,
682+
BufferGetBlockNumber(lbuf));
683+
btree->rightblkno = GinPageGetOpaque(lpage)->rightlink;
690684
}
691685

692686
/*
@@ -696,17 +690,21 @@ ginPageGetLinkItup(Buffer buf)
696690
void
697691
ginEntryFillRoot(GinBtree btree, Buffer root, Buffer lbuf, Buffer rbuf)
698692
{
699-
Page page;
693+
Page page = BufferGetPage(root);
694+
Page lpage = BufferGetPage(lbuf);
695+
Page rpage = BufferGetPage(rbuf);
700696
IndexTuple itup;
701697

702-
page = BufferGetPage(root);
703-
704-
itup = ginPageGetLinkItup(lbuf);
698+
itup = GinFormInteriorTuple(getRightMostTuple(lpage),
699+
lpage,
700+
BufferGetBlockNumber(lbuf));
705701
if (PageAddItem(page, (Item) itup, IndexTupleSize(itup), InvalidOffsetNumber, false, false) == InvalidOffsetNumber)
706702
elog(ERROR, "failed to add item to index root page");
707703
pfree(itup);
708704

709-
itup = ginPageGetLinkItup(rbuf);
705+
itup = GinFormInteriorTuple(getRightMostTuple(rpage),
706+
rpage,
707+
BufferGetBlockNumber(rbuf));
710708
if (PageAddItem(page, (Item) itup, IndexTupleSize(itup), InvalidOffsetNumber, false, false) == InvalidOffsetNumber)
711709
elog(ERROR, "failed to add item to index root page");
712710
pfree(itup);
@@ -736,6 +734,7 @@ ginPrepareEntryScan(GinBtree btree, OffsetNumber attnum,
736734
btree->placeToPage = entryPlaceToPage;
737735
btree->splitPage = entrySplitPage;
738736
btree->fillRoot = ginEntryFillRoot;
737+
btree->prepareDownlink = entryPrepareDownlink;
739738

740739
btree->isData = FALSE;
741740
btree->fullScan = FALSE;

src/backend/access/gin/ginxlog.c

Lines changed: 2 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -799,31 +799,20 @@ ginContinueSplit(ginIncompleteSplit *split)
799799
ginPrepareEntryScan(&btree,
800800
InvalidOffsetNumber, (Datum) 0, GIN_CAT_NULL_KEY,
801801
&ginstate);
802-
btree.entry = ginPageGetLinkItup(buffer);
803802
}
804803
else
805804
{
806-
Page page = BufferGetPage(buffer);
807-
808805
ginPrepareDataScan(&btree, reln);
809-
810-
PostingItemSetBlockNumber(&(btree.pitem), split->leftBlkno);
811-
if (GinPageIsLeaf(page))
812-
btree.pitem.key = *GinDataPageGetItemPointer(page,
813-
GinPageGetOpaque(page)->maxoff);
814-
else
815-
btree.pitem.key = GinDataPageGetPostingItem(page,
816-
GinPageGetOpaque(page)->maxoff)->key;
817806
}
818807

819-
btree.rightblkno = split->rightBlkno;
820-
821808
stack.blkno = split->leftBlkno;
822809
stack.buffer = buffer;
823810
stack.off = InvalidOffsetNumber;
824811
stack.parent = NULL;
825812

826813
ginFindParents(&btree, &stack, split->rootBlkno);
814+
815+
btree.prepareDownlink(&btree, buffer);
827816
ginInsertValue(&btree, stack.parent, NULL);
828817

829818
FreeFakeRelcacheEntry(reln);

src/include/access/gin_private.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -487,6 +487,7 @@ typedef struct GinBtreeData
487487
OffsetNumber (*findChildPtr) (GinBtree, Page, BlockNumber, OffsetNumber);
488488
bool (*placeToPage) (GinBtree, Buffer, OffsetNumber, XLogRecData **);
489489
Page (*splitPage) (GinBtree, Buffer, Buffer, OffsetNumber, XLogRecData **);
490+
void (*prepareDownlink) (GinBtree, Buffer);
490491
void (*fillRoot) (GinBtree, Buffer, Buffer, Buffer);
491492

492493
bool isData;
@@ -529,7 +530,6 @@ extern void ginPrepareEntryScan(GinBtree btree, OffsetNumber attnum,
529530
Datum key, GinNullCategory category,
530531
GinState *ginstate);
531532
extern void ginEntryFillRoot(GinBtree btree, Buffer root, Buffer lbuf, Buffer rbuf);
532-
extern IndexTuple ginPageGetLinkItup(Buffer buf);
533533

534534
/* gindatapage.c */
535535
extern BlockNumber createPostingTree(Relation index,

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy