diff options
Diffstat (limited to 'src/backend/access/gin')
-rw-r--r-- | src/backend/access/gin/ginbtree.c | 68 | ||||
-rw-r--r-- | src/backend/access/gin/gindatapage.c | 18 | ||||
-rw-r--r-- | src/backend/access/gin/ginentrypage.c | 18 | ||||
-rw-r--r-- | src/backend/access/gin/ginfast.c | 22 | ||||
-rw-r--r-- | src/backend/access/gin/ginget.c | 58 | ||||
-rw-r--r-- | src/backend/access/gin/gininsert.c | 6 | ||||
-rw-r--r-- | src/backend/access/gin/ginutil.c | 12 | ||||
-rw-r--r-- | src/backend/access/gin/ginvacuum.c | 29 | ||||
-rw-r--r-- | src/backend/access/gin/ginxlog.c | 34 |
9 files changed, 152 insertions, 113 deletions
diff --git a/src/backend/access/gin/ginbtree.c b/src/backend/access/gin/ginbtree.c index 06ba9cb957f..13258cca0ea 100644 --- a/src/backend/access/gin/ginbtree.c +++ b/src/backend/access/gin/ginbtree.c @@ -36,7 +36,7 @@ ginTraverseLock(Buffer buffer, bool searchMode) int access = GIN_SHARE; LockBuffer(buffer, GIN_SHARE); - page = BufferGetPage(buffer); + page = BufferGetPage(buffer, NULL, NULL, BGP_NO_SNAPSHOT_TEST); if (GinPageIsLeaf(page)) { if (searchMode == FALSE) @@ -89,7 +89,7 @@ ginFindLeafPage(GinBtree btree, bool searchMode) stack->off = InvalidOffsetNumber; - page = BufferGetPage(stack->buffer); + page = BufferGetPage(stack->buffer, NULL, NULL, BGP_NO_SNAPSHOT_TEST); access = ginTraverseLock(stack->buffer, searchMode); @@ -115,7 +115,8 @@ ginFindLeafPage(GinBtree btree, bool searchMode) stack->buffer = ginStepRight(stack->buffer, btree->index, access); stack->blkno = rightlink; - page = BufferGetPage(stack->buffer); + page = BufferGetPage(stack->buffer, NULL, NULL, + BGP_NO_SNAPSHOT_TEST); if (!searchMode && GinPageIsIncompleteSplit(page)) ginFinishSplit(btree, stack, false, NULL); @@ -161,7 +162,7 @@ Buffer ginStepRight(Buffer buffer, Relation index, int lockmode) { Buffer nextbuffer; - Page page = BufferGetPage(buffer); + Page page = BufferGetPage(buffer, NULL, NULL, BGP_NO_SNAPSHOT_TEST); bool isLeaf = GinPageIsLeaf(page); bool isData = GinPageIsData(page); BlockNumber blkno = GinPageGetOpaque(page)->rightlink; @@ -171,7 +172,7 @@ ginStepRight(Buffer buffer, Relation index, int lockmode) UnlockReleaseBuffer(buffer); /* Sanity check that the page we stepped to is of similar kind. */ - page = BufferGetPage(nextbuffer); + page = BufferGetPage(nextbuffer, NULL, NULL, BGP_NO_SNAPSHOT_TEST); if (isLeaf != GinPageIsLeaf(page) || isData != GinPageIsData(page)) elog(ERROR, "right sibling of GIN page is of different type"); @@ -243,7 +244,7 @@ ginFindParents(GinBtree btree, GinBtreeStack *stack) for (;;) { LockBuffer(buffer, GIN_EXCLUSIVE); - page = BufferGetPage(buffer); + page = BufferGetPage(buffer, NULL, NULL, BGP_NO_SNAPSHOT_TEST); if (GinPageIsLeaf(page)) elog(ERROR, "Lost path"); @@ -274,7 +275,7 @@ ginFindParents(GinBtree btree, GinBtreeStack *stack) break; } buffer = ginStepRight(buffer, btree->index, GIN_EXCLUSIVE); - page = BufferGetPage(buffer); + page = BufferGetPage(buffer, NULL, NULL, BGP_NO_SNAPSHOT_TEST); /* finish any incomplete splits, as above */ if (GinPageIsIncompleteSplit(page)) @@ -325,7 +326,8 @@ ginPlaceToPage(GinBtree btree, GinBtreeStack *stack, void *insertdata, BlockNumber updateblkno, Buffer childbuf, GinStatsData *buildStats) { - Page page = BufferGetPage(stack->buffer); + Page page = BufferGetPage(stack->buffer, NULL, NULL, + BGP_NO_SNAPSHOT_TEST); GinPlaceToPageRC rc; uint16 xlflags = 0; Page childpage = NULL; @@ -344,7 +346,7 @@ ginPlaceToPage(GinBtree btree, GinBtreeStack *stack, { Assert(BufferIsValid(childbuf)); Assert(updateblkno != InvalidBlockNumber); - childpage = BufferGetPage(childbuf); + childpage = BufferGetPage(childbuf, NULL, NULL, BGP_NO_SNAPSHOT_TEST); } /* @@ -456,7 +458,8 @@ ginPlaceToPage(GinBtree btree, GinBtreeStack *stack, data.flags = xlflags; if (childbuf != InvalidBuffer) { - Page childpage = BufferGetPage(childbuf); + Page childpage = BufferGetPage(childbuf, NULL, NULL, + BGP_NO_SNAPSHOT_TEST); GinPageGetOpaque(childpage)->flags &= ~GIN_INCOMPLETE_SPLIT; @@ -538,14 +541,21 @@ ginPlaceToPage(GinBtree btree, GinBtreeStack *stack, if (stack->parent == NULL) { MarkBufferDirty(lbuffer); - memcpy(BufferGetPage(stack->buffer), newrootpg, BLCKSZ); - memcpy(BufferGetPage(lbuffer), newlpage, BLCKSZ); - memcpy(BufferGetPage(rbuffer), newrpage, BLCKSZ); + memcpy(BufferGetPage(stack->buffer, NULL, NULL, + BGP_NO_SNAPSHOT_TEST), + newrootpg, BLCKSZ); + memcpy(BufferGetPage(lbuffer, NULL, NULL, BGP_NO_SNAPSHOT_TEST), + newlpage, BLCKSZ); + memcpy(BufferGetPage(rbuffer, NULL, NULL, BGP_NO_SNAPSHOT_TEST), + newrpage, BLCKSZ); } else { - memcpy(BufferGetPage(stack->buffer), newlpage, BLCKSZ); - memcpy(BufferGetPage(rbuffer), newrpage, BLCKSZ); + memcpy(BufferGetPage(stack->buffer, NULL, NULL, + BGP_NO_SNAPSHOT_TEST), + newlpage, BLCKSZ); + memcpy(BufferGetPage(rbuffer, NULL, NULL, BGP_NO_SNAPSHOT_TEST), + newrpage, BLCKSZ); } /* write WAL record */ @@ -577,10 +587,16 @@ ginPlaceToPage(GinBtree btree, GinBtreeStack *stack, XLogRegisterData((char *) &data, sizeof(ginxlogSplit)); recptr = XLogInsert(RM_GIN_ID, XLOG_GIN_SPLIT); - PageSetLSN(BufferGetPage(stack->buffer), recptr); - PageSetLSN(BufferGetPage(rbuffer), recptr); + PageSetLSN(BufferGetPage(stack->buffer, NULL, NULL, + BGP_NO_SNAPSHOT_TEST), + recptr); + PageSetLSN(BufferGetPage(rbuffer, NULL, NULL, + BGP_NO_SNAPSHOT_TEST), + recptr); if (stack->parent == NULL) - PageSetLSN(BufferGetPage(lbuffer), recptr); + PageSetLSN(BufferGetPage(lbuffer, NULL, NULL, + BGP_NO_SNAPSHOT_TEST), + recptr); if (BufferIsValid(childbuf)) PageSetLSN(childpage, recptr); } @@ -662,11 +678,12 @@ ginFinishSplit(GinBtree btree, GinBtreeStack *stack, bool freestack, * page that has no downlink in the parent, and splitting it further * would fail. */ - if (GinPageIsIncompleteSplit(BufferGetPage(parent->buffer))) + if (GinPageIsIncompleteSplit(BufferGetPage(parent->buffer, NULL, NULL, + BGP_NO_SNAPSHOT_TEST))) ginFinishSplit(btree, parent, false, buildStats); /* move right if it's needed */ - page = BufferGetPage(parent->buffer); + page = BufferGetPage(parent->buffer, NULL, NULL, BGP_NO_SNAPSHOT_TEST); while ((parent->off = btree->findChildPtr(btree, page, stack->blkno, parent->off)) == InvalidOffsetNumber) { if (GinPageRightMost(page)) @@ -684,15 +701,17 @@ ginFinishSplit(GinBtree btree, GinBtreeStack *stack, bool freestack, parent->buffer = ginStepRight(parent->buffer, btree->index, GIN_EXCLUSIVE); parent->blkno = BufferGetBlockNumber(parent->buffer); - page = BufferGetPage(parent->buffer); + page = BufferGetPage(parent->buffer, NULL, NULL, BGP_NO_SNAPSHOT_TEST); - if (GinPageIsIncompleteSplit(BufferGetPage(parent->buffer))) + if (GinPageIsIncompleteSplit(BufferGetPage(parent->buffer, NULL, NULL, + BGP_NO_SNAPSHOT_TEST))) ginFinishSplit(btree, parent, false, buildStats); } /* insert the downlink */ insertdata = btree->prepareDownlink(btree, stack->buffer); - updateblkno = GinPageGetOpaque(BufferGetPage(stack->buffer))->rightlink; + updateblkno = GinPageGetOpaque(BufferGetPage(stack->buffer, NULL, NULL, + BGP_NO_SNAPSHOT_TEST))->rightlink; done = ginPlaceToPage(btree, parent, insertdata, updateblkno, stack->buffer, buildStats); @@ -742,7 +761,8 @@ ginInsertValue(GinBtree btree, GinBtreeStack *stack, void *insertdata, bool done; /* If the leaf page was incompletely split, finish the split first */ - if (GinPageIsIncompleteSplit(BufferGetPage(stack->buffer))) + if (GinPageIsIncompleteSplit(BufferGetPage(stack->buffer, NULL, NULL, + BGP_NO_SNAPSHOT_TEST))) ginFinishSplit(btree, stack, false, buildStats); done = ginPlaceToPage(btree, stack, diff --git a/src/backend/access/gin/gindatapage.c b/src/backend/access/gin/gindatapage.c index a55bb4a45d1..9c501a1af5f 100644 --- a/src/backend/access/gin/gindatapage.c +++ b/src/backend/access/gin/gindatapage.c @@ -246,7 +246,7 @@ dataLocateItem(GinBtree btree, GinBtreeStack *stack) maxoff; PostingItem *pitem = NULL; int result; - Page page = BufferGetPage(stack->buffer); + Page page = BufferGetPage(stack->buffer, NULL, NULL, BGP_NO_SNAPSHOT_TEST); Assert(!GinPageIsLeaf(page)); Assert(GinPageIsData(page)); @@ -432,7 +432,7 @@ dataPlaceToPageLeaf(GinBtree btree, Buffer buf, GinBtreeStack *stack, GinBtreeDataLeafInsertData *items = insertdata; ItemPointer newItems = &items->items[items->curitem]; int maxitems = items->nitem - items->curitem; - Page page = BufferGetPage(buf); + Page page = BufferGetPage(buf, NULL, NULL, BGP_NO_SNAPSHOT_TEST); int i; ItemPointerData rbound; ItemPointerData lbound; @@ -714,7 +714,7 @@ dataPlaceToPageLeaf(GinBtree btree, Buffer buf, GinBtreeStack *stack, void ginVacuumPostingTreeLeaf(Relation indexrel, Buffer buffer, GinVacuumState *gvs) { - Page page = BufferGetPage(buffer); + Page page = BufferGetPage(buffer, NULL, NULL, BGP_NO_SNAPSHOT_TEST); disassembledLeaf *leaf; bool removedsomething = false; dlist_iter iter; @@ -953,7 +953,7 @@ registerLeafRecompressWALData(Buffer buf, disassembledLeaf *leaf) static void dataPlaceToPageLeafRecompress(Buffer buf, disassembledLeaf *leaf) { - Page page = BufferGetPage(buf); + Page page = BufferGetPage(buf, NULL, NULL, BGP_NO_SNAPSHOT_TEST); char *ptr; int newsize; bool modified = false; @@ -1091,7 +1091,7 @@ dataPlaceToPageInternal(GinBtree btree, Buffer buf, GinBtreeStack *stack, void *insertdata, BlockNumber updateblkno, Page *newlpage, Page *newrpage) { - Page page = BufferGetPage(buf); + Page page = BufferGetPage(buf, NULL, NULL, BGP_NO_SNAPSHOT_TEST); OffsetNumber off = stack->off; PostingItem *pitem; @@ -1141,7 +1141,7 @@ dataPlaceToPage(GinBtree btree, Buffer buf, GinBtreeStack *stack, void *insertdata, BlockNumber updateblkno, Page *newlpage, Page *newrpage) { - Page page = BufferGetPage(buf); + Page page = BufferGetPage(buf, NULL, NULL, BGP_NO_SNAPSHOT_TEST); Assert(GinPageIsData(page)); @@ -1164,7 +1164,7 @@ dataSplitPageInternal(GinBtree btree, Buffer origbuf, void *insertdata, BlockNumber updateblkno, Page *newlpage, Page *newrpage) { - Page oldpage = BufferGetPage(origbuf); + Page oldpage = BufferGetPage(origbuf, NULL, NULL, BGP_NO_SNAPSHOT_TEST); OffsetNumber off = stack->off; int nitems = GinPageGetOpaque(oldpage)->maxoff; int nleftitems; @@ -1242,7 +1242,7 @@ static void * dataPrepareDownlink(GinBtree btree, Buffer lbuf) { PostingItem *pitem = palloc(sizeof(PostingItem)); - Page lpage = BufferGetPage(lbuf); + Page lpage = BufferGetPage(lbuf, NULL, NULL, BGP_NO_SNAPSHOT_TEST); PostingItemSetBlockNumber(pitem, BufferGetBlockNumber(lbuf)); pitem->key = *GinDataPageGetRightBound(lpage); @@ -1726,7 +1726,7 @@ createPostingTree(Relation index, ItemPointerData *items, uint32 nitems, * All set. Get a new physical page, and copy the in-memory page to it. */ buffer = GinNewBuffer(index); - page = BufferGetPage(buffer); + page = BufferGetPage(buffer, NULL, NULL, BGP_NO_SNAPSHOT_TEST); blkno = BufferGetBlockNumber(buffer); START_CRIT_SECTION(); diff --git a/src/backend/access/gin/ginentrypage.c b/src/backend/access/gin/ginentrypage.c index 25127456480..8a5d9e17279 100644 --- a/src/backend/access/gin/ginentrypage.c +++ b/src/backend/access/gin/ginentrypage.c @@ -274,7 +274,8 @@ entryLocateEntry(GinBtree btree, GinBtreeStack *stack) maxoff; IndexTuple itup = NULL; int result; - Page page = BufferGetPage(stack->buffer); + Page page = BufferGetPage(stack->buffer, NULL, NULL, + BGP_NO_SNAPSHOT_TEST); Assert(!GinPageIsLeaf(page)); Assert(!GinPageIsData(page)); @@ -345,7 +346,8 @@ entryLocateEntry(GinBtree btree, GinBtreeStack *stack) static bool entryLocateLeafEntry(GinBtree btree, GinBtreeStack *stack) { - Page page = BufferGetPage(stack->buffer); + Page page = BufferGetPage(stack->buffer, NULL, NULL, + BGP_NO_SNAPSHOT_TEST); OffsetNumber low, high; @@ -461,7 +463,7 @@ entryIsEnoughSpace(GinBtree btree, Buffer buf, OffsetNumber off, { Size releasedsz = 0; Size addedsz; - Page page = BufferGetPage(buf); + Page page = BufferGetPage(buf, NULL, NULL, BGP_NO_SNAPSHOT_TEST); Assert(insertData->entry); Assert(!GinPageIsData(page)); @@ -525,7 +527,7 @@ entryPlaceToPage(GinBtree btree, Buffer buf, GinBtreeStack *stack, Page *newlpage, Page *newrpage) { GinBtreeEntryInsertData *insertData = insertPayload; - Page page = BufferGetPage(buf); + Page page = BufferGetPage(buf, NULL, NULL, BGP_NO_SNAPSHOT_TEST); OffsetNumber off = stack->off; OffsetNumber placed; @@ -592,8 +594,10 @@ entrySplitPage(GinBtree btree, Buffer origbuf, char *ptr; IndexTuple itup; Page page; - Page lpage = PageGetTempPageCopy(BufferGetPage(origbuf)); - Page rpage = PageGetTempPageCopy(BufferGetPage(origbuf)); + Page lpage = PageGetTempPageCopy(BufferGetPage(origbuf, NULL, NULL, + BGP_NO_SNAPSHOT_TEST)); + Page rpage = PageGetTempPageCopy(BufferGetPage(origbuf, NULL, NULL, + BGP_NO_SNAPSHOT_TEST)); Size pageSize = PageGetPageSize(lpage); char tupstore[2 * BLCKSZ]; @@ -674,7 +678,7 @@ static void * entryPrepareDownlink(GinBtree btree, Buffer lbuf) { GinBtreeEntryInsertData *insertData; - Page lpage = BufferGetPage(lbuf); + Page lpage = BufferGetPage(lbuf, NULL, NULL, BGP_NO_SNAPSHOT_TEST); BlockNumber lblkno = BufferGetBlockNumber(lbuf); IndexTuple itup; diff --git a/src/backend/access/gin/ginfast.c b/src/backend/access/gin/ginfast.c index 2ddf5680f6f..08ec16f1262 100644 --- a/src/backend/access/gin/ginfast.c +++ b/src/backend/access/gin/ginfast.c @@ -53,7 +53,7 @@ static int32 writeListPage(Relation index, Buffer buffer, IndexTuple *tuples, int32 ntuples, BlockNumber rightlink) { - Page page = BufferGetPage(buffer); + Page page = BufferGetPage(buffer, NULL, NULL, BGP_NO_SNAPSHOT_TEST); int32 i, freesize, size = 0; @@ -239,7 +239,7 @@ ginHeapTupleFastInsert(GinState *ginstate, GinTupleCollector *collector) data.newRightlink = data.prevTail = InvalidBlockNumber; metabuffer = ReadBuffer(index, GIN_METAPAGE_BLKNO); - metapage = BufferGetPage(metabuffer); + metapage = BufferGetPage(metabuffer, NULL, NULL, BGP_NO_SNAPSHOT_TEST); if (collector->sumsize + collector->ntuples * sizeof(ItemIdData) > GinListPageSize) { @@ -310,7 +310,7 @@ ginHeapTupleFastInsert(GinState *ginstate, GinTupleCollector *collector) buffer = ReadBuffer(index, metadata->tail); LockBuffer(buffer, GIN_EXCLUSIVE); - page = BufferGetPage(buffer); + page = BufferGetPage(buffer, NULL, NULL, BGP_NO_SNAPSHOT_TEST); Assert(GinPageGetOpaque(page)->rightlink == InvalidBlockNumber); @@ -344,7 +344,7 @@ ginHeapTupleFastInsert(GinState *ginstate, GinTupleCollector *collector) buffer = ReadBuffer(index, metadata->tail); LockBuffer(buffer, GIN_EXCLUSIVE); - page = BufferGetPage(buffer); + page = BufferGetPage(buffer, NULL, NULL, BGP_NO_SNAPSHOT_TEST); off = (PageIsEmpty(page)) ? FirstOffsetNumber : OffsetNumberNext(PageGetMaxOffsetNumber(page)); @@ -514,7 +514,7 @@ shiftList(Relation index, Buffer metabuffer, BlockNumber newHead, GinMetaPageData *metadata; BlockNumber blknoToDelete; - metapage = BufferGetPage(metabuffer); + metapage = BufferGetPage(metabuffer, NULL, NULL, BGP_NO_SNAPSHOT_TEST); metadata = GinPageGetMeta(metapage); blknoToDelete = metadata->head; @@ -533,7 +533,7 @@ shiftList(Relation index, Buffer metabuffer, BlockNumber newHead, freespace[data.ndeleted] = blknoToDelete; buffers[data.ndeleted] = ReadBuffer(index, blknoToDelete); LockBuffer(buffers[data.ndeleted], GIN_EXCLUSIVE); - page = BufferGetPage(buffers[data.ndeleted]); + page = BufferGetPage(buffers[data.ndeleted], NULL, NULL, BGP_NO_SNAPSHOT_TEST); data.ndeleted++; @@ -582,7 +582,7 @@ shiftList(Relation index, Buffer metabuffer, BlockNumber newHead, for (i = 0; i < data.ndeleted; i++) { - page = BufferGetPage(buffers[i]); + page = BufferGetPage(buffers[i], NULL, NULL, BGP_NO_SNAPSHOT_TEST); GinPageGetOpaque(page)->flags = GIN_DELETED; MarkBufferDirty(buffers[i]); } @@ -606,7 +606,7 @@ shiftList(Relation index, Buffer metabuffer, BlockNumber newHead, for (i = 0; i < data.ndeleted; i++) { - page = BufferGetPage(buffers[i]); + page = BufferGetPage(buffers[i], NULL, NULL, BGP_NO_SNAPSHOT_TEST); PageSetLSN(page, recptr); } } @@ -760,7 +760,7 @@ ginInsertCleanup(GinState *ginstate, metabuffer = ReadBuffer(index, GIN_METAPAGE_BLKNO); LockBuffer(metabuffer, GIN_SHARE); - metapage = BufferGetPage(metabuffer); + metapage = BufferGetPage(metabuffer, NULL, NULL, BGP_NO_SNAPSHOT_TEST); metadata = GinPageGetMeta(metapage); if (metadata->head == InvalidBlockNumber) @@ -776,7 +776,7 @@ ginInsertCleanup(GinState *ginstate, blkno = metadata->head; buffer = ReadBuffer(index, blkno); LockBuffer(buffer, GIN_SHARE); - page = BufferGetPage(buffer); + page = BufferGetPage(buffer, NULL, NULL, BGP_NO_SNAPSHOT_TEST); LockBuffer(metabuffer, GIN_UNLOCK); @@ -943,7 +943,7 @@ ginInsertCleanup(GinState *ginstate, vacuum_delay_point(); buffer = ReadBuffer(index, blkno); LockBuffer(buffer, GIN_SHARE); - page = BufferGetPage(buffer); + page = BufferGetPage(buffer, NULL, NULL, BGP_NO_SNAPSHOT_TEST); } ReleaseBuffer(metabuffer); diff --git a/src/backend/access/gin/ginget.c b/src/backend/access/gin/ginget.c index 53290a4279b..33683278e10 100644 --- a/src/backend/access/gin/ginget.c +++ b/src/backend/access/gin/ginget.c @@ -19,6 +19,7 @@ #include "miscadmin.h" #include "utils/datum.h" #include "utils/memutils.h" +#include "utils/rel.h" /* GUC parameter */ int GinFuzzySearchLimit = 0; @@ -39,7 +40,8 @@ typedef struct pendingPosition static bool moveRightIfItNeeded(GinBtreeData *btree, GinBtreeStack *stack) { - Page page = BufferGetPage(stack->buffer); + Page page = BufferGetPage(stack->buffer, NULL, NULL, + BGP_NO_SNAPSHOT_TEST); if (stack->off > PageGetMaxOffsetNumber(page)) { @@ -63,7 +65,7 @@ moveRightIfItNeeded(GinBtreeData *btree, GinBtreeStack *stack) */ static void scanPostingTree(Relation index, GinScanEntry scanEntry, - BlockNumber rootPostingTree) + BlockNumber rootPostingTree, Snapshot snapshot) { GinBtreeData btree; GinBtreeStack *stack; @@ -82,7 +84,7 @@ scanPostingTree(Relation index, GinScanEntry scanEntry, */ for (;;) { - page = BufferGetPage(buffer); + page = BufferGetPage(buffer, NULL, NULL, BGP_NO_SNAPSHOT_TEST); if ((GinPageGetOpaque(page)->flags & GIN_DELETED) == 0) { int n = GinDataLeafPageGetItemsToTbm(page, scanEntry->matchBitmap); @@ -114,7 +116,7 @@ scanPostingTree(Relation index, GinScanEntry scanEntry, */ static bool collectMatchBitmap(GinBtreeData *btree, GinBtreeStack *stack, - GinScanEntry scanEntry) + GinScanEntry scanEntry, Snapshot snapshot) { OffsetNumber attnum; Form_pg_attribute attr; @@ -144,7 +146,7 @@ collectMatchBitmap(GinBtreeData *btree, GinBtreeStack *stack, if (moveRightIfItNeeded(btree, stack) == false) return true; - page = BufferGetPage(stack->buffer); + page = BufferGetPage(stack->buffer, NULL, NULL, BGP_NO_SNAPSHOT_TEST); itup = (IndexTuple) PageGetItem(page, PageGetItemId(page, stack->off)); /* @@ -224,14 +226,14 @@ collectMatchBitmap(GinBtreeData *btree, GinBtreeStack *stack, LockBuffer(stack->buffer, GIN_UNLOCK); /* Collect all the TIDs in this entry's posting tree */ - scanPostingTree(btree->index, scanEntry, rootPostingTree); + scanPostingTree(btree->index, scanEntry, rootPostingTree, snapshot); /* * We lock again the entry page and while it was unlocked insert * might have occurred, so we need to re-find our position. */ LockBuffer(stack->buffer, GIN_SHARE); - page = BufferGetPage(stack->buffer); + page = BufferGetPage(stack->buffer, NULL, NULL, BGP_NO_SNAPSHOT_TEST); if (!GinPageIsLeaf(page)) { /* @@ -251,7 +253,7 @@ collectMatchBitmap(GinBtreeData *btree, GinBtreeStack *stack, if (moveRightIfItNeeded(btree, stack) == false) elog(ERROR, "lost saved point in index"); /* must not happen !!! */ - page = BufferGetPage(stack->buffer); + page = BufferGetPage(stack->buffer, NULL, NULL, BGP_NO_SNAPSHOT_TEST); itup = (IndexTuple) PageGetItem(page, PageGetItemId(page, stack->off)); if (gintuple_get_attrnum(btree->ginstate, itup) != attnum) @@ -291,7 +293,7 @@ collectMatchBitmap(GinBtreeData *btree, GinBtreeStack *stack, * Start* functions setup beginning state of searches: finds correct buffer and pins it. */ static void -startScanEntry(GinState *ginstate, GinScanEntry entry) +startScanEntry(GinState *ginstate, GinScanEntry entry, Snapshot snapshot) { GinBtreeData btreeEntry; GinBtreeStack *stackEntry; @@ -319,7 +321,7 @@ restartScanEntry: entry->queryKey, entry->queryCategory, ginstate); stackEntry = ginFindLeafPage(&btreeEntry, true); - page = BufferGetPage(stackEntry->buffer); + page = BufferGetPage(stackEntry->buffer, NULL, NULL, BGP_NO_SNAPSHOT_TEST); needUnlock = TRUE; entry->isFinished = TRUE; @@ -335,7 +337,7 @@ restartScanEntry: * for the entry type. */ btreeEntry.findItem(&btreeEntry, stackEntry); - if (collectMatchBitmap(&btreeEntry, stackEntry, entry) == false) + if (!collectMatchBitmap(&btreeEntry, stackEntry, entry, snapshot)) { /* * GIN tree was seriously restructured, so we will cleanup all @@ -393,7 +395,7 @@ restartScanEntry: */ IncrBufferRefCount(entry->buffer); - page = BufferGetPage(entry->buffer); + page = BufferGetPage(entry->buffer, NULL, NULL, BGP_NO_SNAPSHOT_TEST); /* * Load the first page into memory. @@ -535,7 +537,7 @@ startScan(IndexScanDesc scan) uint32 i; for (i = 0; i < so->totalentries; i++) - startScanEntry(ginstate, so->entries[i]); + startScanEntry(ginstate, so->entries[i], scan->xs_snapshot); if (GinFuzzySearchLimit > 0) { @@ -580,7 +582,8 @@ startScan(IndexScanDesc scan) * keep it pinned to prevent interference with vacuum. */ static void -entryLoadMoreItems(GinState *ginstate, GinScanEntry entry, ItemPointerData advancePast) +entryLoadMoreItems(GinState *ginstate, GinScanEntry entry, + ItemPointerData advancePast, Snapshot snapshot) { Page page; int i; @@ -638,7 +641,7 @@ entryLoadMoreItems(GinState *ginstate, GinScanEntry entry, ItemPointerData advan GinItemPointerGetOffsetNumber(&advancePast), !stepright); - page = BufferGetPage(entry->buffer); + page = BufferGetPage(entry->buffer, NULL, NULL, BGP_NO_SNAPSHOT_TEST); for (;;) { entry->offset = InvalidOffsetNumber; @@ -670,7 +673,7 @@ entryLoadMoreItems(GinState *ginstate, GinScanEntry entry, ItemPointerData advan entry->buffer = ginStepRight(entry->buffer, ginstate->index, GIN_SHARE); - page = BufferGetPage(entry->buffer); + page = BufferGetPage(entry->buffer, NULL, NULL, BGP_NO_SNAPSHOT_TEST); } stepright = true; @@ -734,7 +737,7 @@ entryLoadMoreItems(GinState *ginstate, GinScanEntry entry, ItemPointerData advan */ static void entryGetItem(GinState *ginstate, GinScanEntry entry, - ItemPointerData advancePast) + ItemPointerData advancePast, Snapshot snapshot) { Assert(!entry->isFinished); @@ -857,7 +860,7 @@ entryGetItem(GinState *ginstate, GinScanEntry entry, /* If we've processed the current batch, load more items */ while (entry->offset >= entry->nlist) { - entryLoadMoreItems(ginstate, entry, advancePast); + entryLoadMoreItems(ginstate, entry, advancePast, snapshot); if (entry->isFinished) { @@ -896,7 +899,7 @@ entryGetItem(GinState *ginstate, GinScanEntry entry, */ static void keyGetItem(GinState *ginstate, MemoryContext tempCtx, GinScanKey key, - ItemPointerData advancePast) + ItemPointerData advancePast, Snapshot snapshot) { ItemPointerData minItem; ItemPointerData curPageLossy; @@ -943,7 +946,7 @@ keyGetItem(GinState *ginstate, MemoryContext tempCtx, GinScanKey key, */ if (ginCompareItemPointers(&entry->curItem, &advancePast) <= 0) { - entryGetItem(ginstate, entry, advancePast); + entryGetItem(ginstate, entry, advancePast, snapshot); if (entry->isFinished) continue; } @@ -1001,7 +1004,7 @@ keyGetItem(GinState *ginstate, MemoryContext tempCtx, GinScanKey key, if (ginCompareItemPointers(&entry->curItem, &advancePast) <= 0) { - entryGetItem(ginstate, entry, advancePast); + entryGetItem(ginstate, entry, advancePast, snapshot); if (entry->isFinished) continue; } @@ -1210,7 +1213,8 @@ scanGetItem(IndexScanDesc scan, ItemPointerData advancePast, GinScanKey key = so->keys + i; /* Fetch the next item for this key that is > advancePast. */ - keyGetItem(&so->ginstate, so->tempCtx, key, advancePast); + keyGetItem(&so->ginstate, so->tempCtx, key, advancePast, + scan->xs_snapshot); if (key->isFinished) return false; @@ -1331,7 +1335,8 @@ scanGetCandidate(IndexScanDesc scan, pendingPosition *pos) ItemPointerSetInvalid(&pos->item); for (;;) { - page = BufferGetPage(pos->pendingBuffer); + page = BufferGetPage(pos->pendingBuffer, NULL, + NULL, BGP_NO_SNAPSHOT_TEST); maxoff = PageGetMaxOffsetNumber(page); if (pos->firstOffset > maxoff) @@ -1511,7 +1516,8 @@ collectMatchesForHeapRow(IndexScanDesc scan, pendingPosition *pos) memset(datumExtracted + pos->firstOffset - 1, 0, sizeof(bool) * (pos->lastOffset - pos->firstOffset)); - page = BufferGetPage(pos->pendingBuffer); + page = BufferGetPage(pos->pendingBuffer, NULL, + NULL, BGP_NO_SNAPSHOT_TEST); for (i = 0; i < so->nkeys; i++) { @@ -1698,12 +1704,14 @@ scanPendingInsert(IndexScanDesc scan, TIDBitmap *tbm, int64 *ntids) int i; pendingPosition pos; Buffer metabuffer = ReadBuffer(scan->indexRelation, GIN_METAPAGE_BLKNO); + Page page; BlockNumber blkno; *ntids = 0; LockBuffer(metabuffer, GIN_SHARE); - blkno = GinPageGetMeta(BufferGetPage(metabuffer))->head; + page = BufferGetPage(metabuffer, NULL, NULL, BGP_NO_SNAPSHOT_TEST); + blkno = GinPageGetMeta(page)->head; /* * fetch head of list before unlocking metapage. head page must be pinned diff --git a/src/backend/access/gin/gininsert.c b/src/backend/access/gin/gininsert.c index cd21e0e6552..126501149d2 100644 --- a/src/backend/access/gin/gininsert.c +++ b/src/backend/access/gin/gininsert.c @@ -193,7 +193,7 @@ ginEntryInsert(GinState *ginstate, ginPrepareEntryScan(&btree, attnum, key, category, ginstate); stack = ginFindLeafPage(&btree, false); - page = BufferGetPage(stack->buffer); + page = BufferGetPage(stack->buffer, NULL, NULL, BGP_NO_SNAPSHOT_TEST); if (btree.findItem(&btree, stack)) { @@ -352,10 +352,10 @@ ginbuild(Relation heap, Relation index, IndexInfo *indexInfo) recptr = XLogInsert(RM_GIN_ID, XLOG_GIN_CREATE_INDEX); - page = BufferGetPage(RootBuffer); + page = BufferGetPage(RootBuffer, NULL, NULL, BGP_NO_SNAPSHOT_TEST); PageSetLSN(page, recptr); - page = BufferGetPage(MetaBuffer); + page = BufferGetPage(MetaBuffer, NULL, NULL, BGP_NO_SNAPSHOT_TEST); PageSetLSN(page, recptr); } diff --git a/src/backend/access/gin/ginutil.c b/src/backend/access/gin/ginutil.c index 94502678abb..de3532b80ef 100644 --- a/src/backend/access/gin/ginutil.c +++ b/src/backend/access/gin/ginutil.c @@ -273,7 +273,8 @@ GinNewBuffer(Relation index) */ if (ConditionalLockBuffer(buffer)) { - Page page = BufferGetPage(buffer); + Page page = BufferGetPage(buffer, NULL, NULL, + BGP_NO_SNAPSHOT_TEST); if (PageIsNew(page)) return buffer; /* OK to use, if never initialized */ @@ -318,14 +319,15 @@ GinInitPage(Page page, uint32 f, Size pageSize) void GinInitBuffer(Buffer b, uint32 f) { - GinInitPage(BufferGetPage(b), f, BufferGetPageSize(b)); + GinInitPage(BufferGetPage(b, NULL, NULL, BGP_NO_SNAPSHOT_TEST), + f, BufferGetPageSize(b)); } void GinInitMetabuffer(Buffer b) { GinMetaPageData *metadata; - Page page = BufferGetPage(b); + Page page = BufferGetPage(b, NULL, NULL, BGP_NO_SNAPSHOT_TEST); GinInitPage(page, GIN_META, BufferGetPageSize(b)); @@ -605,7 +607,7 @@ ginGetStats(Relation index, GinStatsData *stats) metabuffer = ReadBuffer(index, GIN_METAPAGE_BLKNO); LockBuffer(metabuffer, GIN_SHARE); - metapage = BufferGetPage(metabuffer); + metapage = BufferGetPage(metabuffer, NULL, NULL, BGP_NO_SNAPSHOT_TEST); metadata = GinPageGetMeta(metapage); stats->nPendingPages = metadata->nPendingPages; @@ -632,7 +634,7 @@ ginUpdateStats(Relation index, const GinStatsData *stats) metabuffer = ReadBuffer(index, GIN_METAPAGE_BLKNO); LockBuffer(metabuffer, GIN_EXCLUSIVE); - metapage = BufferGetPage(metabuffer); + metapage = BufferGetPage(metabuffer, NULL, NULL, BGP_NO_SNAPSHOT_TEST); metadata = GinPageGetMeta(metapage); START_CRIT_SECTION(); diff --git a/src/backend/access/gin/ginvacuum.c b/src/backend/access/gin/ginvacuum.c index 6a4b98a4e7e..f26dc799b5d 100644 --- a/src/backend/access/gin/ginvacuum.c +++ b/src/backend/access/gin/ginvacuum.c @@ -87,7 +87,8 @@ ginVacuumItemPointers(GinVacuumState *gvs, ItemPointerData *items, static void xlogVacuumPage(Relation index, Buffer buffer) { - Page page = BufferGetPage(buffer); + Page page = BufferGetPage(buffer, NULL, NULL, + BGP_NO_SNAPSHOT_TEST); XLogRecPtr recptr; /* This is only used for entry tree leaf pages. */ @@ -118,7 +119,7 @@ ginVacuumPostingTreeLeaves(GinVacuumState *gvs, BlockNumber blkno, bool isRoot, buffer = ReadBufferExtended(gvs->index, MAIN_FORKNUM, blkno, RBM_NORMAL, gvs->strategy); - page = BufferGetPage(buffer); + page = BufferGetPage(buffer, NULL, NULL, BGP_NO_SNAPSHOT_TEST); /* * We should be sure that we don't concurrent with inserts, insert process @@ -212,14 +213,14 @@ ginDeletePage(GinVacuumState *gvs, BlockNumber deleteBlkno, BlockNumber leftBlkn START_CRIT_SECTION(); /* Unlink the page by changing left sibling's rightlink */ - page = BufferGetPage(dBuffer); + page = BufferGetPage(dBuffer, NULL, NULL, BGP_NO_SNAPSHOT_TEST); rightlink = GinPageGetOpaque(page)->rightlink; - page = BufferGetPage(lBuffer); + page = BufferGetPage(lBuffer, NULL, NULL, BGP_NO_SNAPSHOT_TEST); GinPageGetOpaque(page)->rightlink = rightlink; /* Delete downlink from parent */ - parentPage = BufferGetPage(pBuffer); + parentPage = BufferGetPage(pBuffer, NULL, NULL, BGP_NO_SNAPSHOT_TEST); #ifdef USE_ASSERT_CHECKING do { @@ -230,7 +231,7 @@ ginDeletePage(GinVacuumState *gvs, BlockNumber deleteBlkno, BlockNumber leftBlkn #endif GinPageDeletePostingItem(parentPage, myoff); - page = BufferGetPage(dBuffer); + page = BufferGetPage(dBuffer, NULL, NULL, BGP_NO_SNAPSHOT_TEST); /* * we shouldn't change rightlink field to save workability of running @@ -268,7 +269,8 @@ ginDeletePage(GinVacuumState *gvs, BlockNumber deleteBlkno, BlockNumber leftBlkn recptr = XLogInsert(RM_GIN_ID, XLOG_GIN_DELETE_PAGE); PageSetLSN(page, recptr); PageSetLSN(parentPage, recptr); - PageSetLSN(BufferGetPage(lBuffer), recptr); + PageSetLSN(BufferGetPage(lBuffer, NULL, NULL, + BGP_NO_SNAPSHOT_TEST), recptr); } if (!isParentRoot) @@ -324,7 +326,7 @@ ginScanToDelete(GinVacuumState *gvs, BlockNumber blkno, bool isRoot, buffer = ReadBufferExtended(gvs->index, MAIN_FORKNUM, blkno, RBM_NORMAL, gvs->strategy); - page = BufferGetPage(buffer); + page = BufferGetPage(buffer, NULL, NULL, BGP_NO_SNAPSHOT_TEST); Assert(GinPageIsData(page)); @@ -407,7 +409,8 @@ ginVacuumPostingTree(GinVacuumState *gvs, BlockNumber rootBlkno) static Page ginVacuumEntryPage(GinVacuumState *gvs, Buffer buffer, BlockNumber *roots, uint32 *nroot) { - Page origpage = BufferGetPage(buffer), + Page origpage = BufferGetPage(buffer, NULL, NULL, + BGP_NO_SNAPSHOT_TEST), tmppage; OffsetNumber i, maxoff = PageGetMaxOffsetNumber(origpage); @@ -554,7 +557,8 @@ ginbulkdelete(IndexVacuumInfo *info, IndexBulkDeleteResult *stats, /* find leaf page */ for (;;) { - Page page = BufferGetPage(buffer); + Page page = BufferGetPage(buffer, NULL, NULL, + BGP_NO_SNAPSHOT_TEST); IndexTuple itup; LockBuffer(buffer, GIN_SHARE); @@ -589,7 +593,8 @@ ginbulkdelete(IndexVacuumInfo *info, IndexBulkDeleteResult *stats, for (;;) { - Page page = BufferGetPage(buffer); + Page page = BufferGetPage(buffer, NULL, NULL, + BGP_NO_SNAPSHOT_TEST); Page resPage; uint32 i; @@ -703,7 +708,7 @@ ginvacuumcleanup(IndexVacuumInfo *info, IndexBulkDeleteResult *stats) buffer = ReadBufferExtended(index, MAIN_FORKNUM, blkno, RBM_NORMAL, info->strategy); LockBuffer(buffer, GIN_SHARE); - page = (Page) BufferGetPage(buffer); + page = BufferGetPage(buffer, NULL, NULL, BGP_NO_SNAPSHOT_TEST); if (PageIsNew(page) || GinPageIsDeleted(page)) { diff --git a/src/backend/access/gin/ginxlog.c b/src/backend/access/gin/ginxlog.c index b4d310f337a..8bfa7ec18c2 100644 --- a/src/backend/access/gin/ginxlog.c +++ b/src/backend/access/gin/ginxlog.c @@ -28,7 +28,7 @@ ginRedoClearIncompleteSplit(XLogReaderState *record, uint8 block_id) if (XLogReadBufferForRedo(record, block_id, &buffer) == BLK_NEEDS_REDO) { - page = (Page) BufferGetPage(buffer); + page = BufferGetPage(buffer, NULL, NULL, BGP_NO_SNAPSHOT_TEST); GinPageGetOpaque(page)->flags &= ~GIN_INCOMPLETE_SPLIT; PageSetLSN(page, lsn); @@ -48,7 +48,7 @@ ginRedoCreateIndex(XLogReaderState *record) MetaBuffer = XLogInitBufferForRedo(record, 0); Assert(BufferGetBlockNumber(MetaBuffer) == GIN_METAPAGE_BLKNO); - page = (Page) BufferGetPage(MetaBuffer); + page = BufferGetPage(MetaBuffer, NULL, NULL, BGP_NO_SNAPSHOT_TEST); GinInitMetabuffer(MetaBuffer); @@ -57,7 +57,7 @@ ginRedoCreateIndex(XLogReaderState *record) RootBuffer = XLogInitBufferForRedo(record, 1); Assert(BufferGetBlockNumber(RootBuffer) == GIN_ROOT_BLKNO); - page = (Page) BufferGetPage(RootBuffer); + page = BufferGetPage(RootBuffer, NULL, NULL, BGP_NO_SNAPSHOT_TEST); GinInitBuffer(RootBuffer, GIN_LEAF); @@ -78,7 +78,7 @@ ginRedoCreatePTree(XLogReaderState *record) Page page; buffer = XLogInitBufferForRedo(record, 0); - page = (Page) BufferGetPage(buffer); + page = BufferGetPage(buffer, NULL, NULL, BGP_NO_SNAPSHOT_TEST); GinInitBuffer(buffer, GIN_DATA | GIN_LEAF | GIN_COMPRESSED); @@ -98,7 +98,7 @@ ginRedoCreatePTree(XLogReaderState *record) static void ginRedoInsertEntry(Buffer buffer, bool isLeaf, BlockNumber rightblkno, void *rdata) { - Page page = BufferGetPage(buffer); + Page page = BufferGetPage(buffer, NULL, NULL, BGP_NO_SNAPSHOT_TEST); ginxlogInsertEntry *data = (ginxlogInsertEntry *) rdata; OffsetNumber offset = data->offset; IndexTuple itup; @@ -293,7 +293,7 @@ ginRedoRecompress(Page page, ginxlogRecompressDataLeaf *data) static void ginRedoInsertData(Buffer buffer, bool isLeaf, BlockNumber rightblkno, void *rdata) { - Page page = BufferGetPage(buffer); + Page page = BufferGetPage(buffer, NULL, NULL, BGP_NO_SNAPSHOT_TEST); if (isLeaf) { @@ -350,7 +350,7 @@ ginRedoInsert(XLogReaderState *record) if (XLogReadBufferForRedo(record, 0, &buffer) == BLK_NEEDS_REDO) { - Page page = BufferGetPage(buffer); + Page page = BufferGetPage(buffer, NULL, NULL, BGP_NO_SNAPSHOT_TEST); Size len; char *payload = XLogRecGetBlockData(record, 0, &len); @@ -431,7 +431,7 @@ ginRedoVacuumDataLeafPage(XLogReaderState *record) if (XLogReadBufferForRedo(record, 0, &buffer) == BLK_NEEDS_REDO) { - Page page = BufferGetPage(buffer); + Page page = BufferGetPage(buffer, NULL, NULL, BGP_NO_SNAPSHOT_TEST); Size len; ginxlogVacuumDataLeafPage *xlrec; @@ -460,7 +460,7 @@ ginRedoDeletePage(XLogReaderState *record) if (XLogReadBufferForRedo(record, 0, &dbuffer) == BLK_NEEDS_REDO) { - page = BufferGetPage(dbuffer); + page = BufferGetPage(dbuffer, NULL, NULL, BGP_NO_SNAPSHOT_TEST); Assert(GinPageIsData(page)); GinPageGetOpaque(page)->flags = GIN_DELETED; PageSetLSN(page, lsn); @@ -469,7 +469,7 @@ ginRedoDeletePage(XLogReaderState *record) if (XLogReadBufferForRedo(record, 1, &pbuffer) == BLK_NEEDS_REDO) { - page = BufferGetPage(pbuffer); + page = BufferGetPage(pbuffer, NULL, NULL, BGP_NO_SNAPSHOT_TEST); Assert(GinPageIsData(page)); Assert(!GinPageIsLeaf(page)); GinPageDeletePostingItem(page, data->parentOffset); @@ -479,7 +479,7 @@ ginRedoDeletePage(XLogReaderState *record) if (XLogReadBufferForRedo(record, 2, &lbuffer) == BLK_NEEDS_REDO) { - page = BufferGetPage(lbuffer); + page = BufferGetPage(lbuffer, NULL, NULL, BGP_NO_SNAPSHOT_TEST); Assert(GinPageIsData(page)); GinPageGetOpaque(page)->rightlink = data->rightLink; PageSetLSN(page, lsn); @@ -510,7 +510,7 @@ ginRedoUpdateMetapage(XLogReaderState *record) */ metabuffer = XLogInitBufferForRedo(record, 0); Assert(BufferGetBlockNumber(metabuffer) == GIN_METAPAGE_BLKNO); - metapage = BufferGetPage(metabuffer); + metapage = BufferGetPage(metabuffer, NULL, NULL, BGP_NO_SNAPSHOT_TEST); GinInitPage(metapage, GIN_META, BufferGetPageSize(metabuffer)); memcpy(GinPageGetMeta(metapage), &data->metadata, sizeof(GinMetaPageData)); @@ -524,7 +524,7 @@ ginRedoUpdateMetapage(XLogReaderState *record) */ if (XLogReadBufferForRedo(record, 1, &buffer) == BLK_NEEDS_REDO) { - Page page = BufferGetPage(buffer); + Page page = BufferGetPage(buffer, NULL, NULL, BGP_NO_SNAPSHOT_TEST); OffsetNumber off; int i; Size tupsize; @@ -572,7 +572,7 @@ ginRedoUpdateMetapage(XLogReaderState *record) */ if (XLogReadBufferForRedo(record, 1, &buffer) == BLK_NEEDS_REDO) { - Page page = BufferGetPage(buffer); + Page page = BufferGetPage(buffer, NULL, NULL, BGP_NO_SNAPSHOT_TEST); GinPageGetOpaque(page)->rightlink = data->newRightlink; @@ -603,7 +603,7 @@ ginRedoInsertListPage(XLogReaderState *record) /* We always re-initialize the page. */ buffer = XLogInitBufferForRedo(record, 0); - page = BufferGetPage(buffer); + page = BufferGetPage(buffer, NULL, NULL, BGP_NO_SNAPSHOT_TEST); GinInitBuffer(buffer, GIN_LIST); GinPageGetOpaque(page)->rightlink = data->rightlink; @@ -652,7 +652,7 @@ ginRedoDeleteListPages(XLogReaderState *record) metabuffer = XLogInitBufferForRedo(record, 0); Assert(BufferGetBlockNumber(metabuffer) == GIN_METAPAGE_BLKNO); - metapage = BufferGetPage(metabuffer); + metapage = BufferGetPage(metabuffer, NULL, NULL, BGP_NO_SNAPSHOT_TEST); GinInitPage(metapage, GIN_META, BufferGetPageSize(metabuffer)); @@ -681,7 +681,7 @@ ginRedoDeleteListPages(XLogReaderState *record) Page page; buffer = XLogInitBufferForRedo(record, i + 1); - page = BufferGetPage(buffer); + page = BufferGetPage(buffer, NULL, NULL, BGP_NO_SNAPSHOT_TEST); GinInitBuffer(buffer, GIN_DELETED); PageSetLSN(page, lsn); |