Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit5010126

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 fora page. Previously, ginxlog.c duplicated the logic used during normaloperation.
1 parent04965ad commit5010126

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+
returnlpage;
584+
}
585+
586+
/*
587+
* Prepare the state in 'btree' for inserting a downlink for given buffer.
588+
*/
589+
staticvoid
590+
dataPrepareDownlink(GinBtreebtree,Bufferlbuf)
591+
{
592+
Pagelpage=BufferGetPage(lbuf);
593+
584594
PostingItemSetBlockNumber(&(btree->pitem),BufferGetBlockNumber(lbuf));
585595
btree->pitem.key=*GinDataPageGetRightBound(lpage);
586-
btree->rightblkno=BufferGetBlockNumber(rbuf);
587-
588-
returnlpage;
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
Sizelsize=0,
571571
size;
572572
char*ptr;
573-
IndexTupleitup,
574-
leftrightmost=NULL;
573+
IndexTupleitup;
575574
Pagepage;
576575
Pagelpage=PageGetTempPageCopy(BufferGetPage(lbuf));
577576
Pagerpage=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(Bufferbuf)
672+
staticvoid
673+
entryPrepareDownlink(GinBtreebtree,Bufferlbuf)
681674
{
682-
IndexTupleitup,
683-
nitup;
684-
Pagepage=BufferGetPage(buf);
675+
Pagelpage=BufferGetPage(lbuf);
676+
IndexTupleitup;
685677

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

689-
returnnitup;
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(GinBtreebtree,Bufferroot,Bufferlbuf,Bufferrbuf)
698692
{
699-
Pagepage;
693+
Pagepage=BufferGetPage(root);
694+
Pagelpage=BufferGetPage(lbuf);
695+
Pagerpage=BufferGetPage(rbuf);
700696
IndexTupleitup;
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-
Pagepage=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
boolisData;
@@ -529,7 +530,6 @@ extern void ginPrepareEntryScan(GinBtree btree, OffsetNumber attnum,
529530
Datumkey,GinNullCategorycategory,
530531
GinState*ginstate);
531532
externvoidginEntryFillRoot(GinBtreebtree,Bufferroot,Bufferlbuf,Bufferrbuf);
532-
externIndexTupleginPageGetLinkItup(Bufferbuf);
533533

534534
/* gindatapage.c */
535535
externBlockNumbercreatePostingTree(Relationindex,

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp