diff options
Diffstat (limited to 'src/backend/access')
-rw-r--r-- | src/backend/access/gin/gindatapage.c | 35 |
1 files changed, 20 insertions, 15 deletions
diff --git a/src/backend/access/gin/gindatapage.c b/src/backend/access/gin/gindatapage.c index 21ce79fc0b1..70801bd05cb 100644 --- a/src/backend/access/gin/gindatapage.c +++ b/src/backend/access/gin/gindatapage.c @@ -1706,22 +1706,16 @@ createPostingTree(Relation index, ItemPointerData *items, uint32 nitems, { BlockNumber blkno; Buffer buffer; + Page tmppage; Page page; Pointer ptr; int nrootitems; int rootsize; - /* - * Create the root page. - */ - buffer = GinNewBuffer(index); - page = BufferGetPage(buffer); - blkno = BufferGetBlockNumber(buffer); - - START_CRIT_SECTION(); - - GinInitPage(page, GIN_DATA | GIN_LEAF | GIN_COMPRESSED, BLCKSZ); - GinPageGetOpaque(page)->rightlink = InvalidBlockNumber; + /* Construct the new root page in memory first. */ + tmppage = (Page) palloc(BLCKSZ); + GinInitPage(tmppage, GIN_DATA | GIN_LEAF | GIN_COMPRESSED, BLCKSZ); + GinPageGetOpaque(tmppage)->rightlink = InvalidBlockNumber; /* * Write as many of the items to the root page as fit. In segments @@ -1729,7 +1723,7 @@ createPostingTree(Relation index, ItemPointerData *items, uint32 nitems, */ nrootitems = 0; rootsize = 0; - ptr = (Pointer) GinDataLeafPageGetPostingList(page); + ptr = (Pointer) GinDataLeafPageGetPostingList(tmppage); while (nrootitems < nitems) { GinPostingList *segment; @@ -1750,10 +1744,19 @@ createPostingTree(Relation index, ItemPointerData *items, uint32 nitems, nrootitems += npacked; pfree(segment); } - GinDataLeafPageSetPostingListSize(page, rootsize); - MarkBufferDirty(buffer); + GinDataLeafPageSetPostingListSize(tmppage, rootsize); - elog(DEBUG2, "created GIN posting tree with %d items", nrootitems); + /* + * All set. Get a new physical page, and copy the in-memory page to it. + */ + buffer = GinNewBuffer(index); + page = BufferGetPage(buffer); + blkno = BufferGetBlockNumber(buffer); + + START_CRIT_SECTION(); + + PageRestoreTempPage(tmppage, page); + MarkBufferDirty(buffer); if (RelationNeedsWAL(index)) { @@ -1787,6 +1790,8 @@ createPostingTree(Relation index, ItemPointerData *items, uint32 nitems, if (buildStats) buildStats->nDataPages++; + elog(DEBUG2, "created GIN posting tree with %d items", nrootitems); + /* * Add any remaining TIDs to the newly-created posting tree. */ |