Skip to content

Commit 8e42d5a

Browse files
author
Artur Zakirov
committed
Some fixes
1 parent c1df4cc commit 8e42d5a

File tree

11 files changed

+971
-552
lines changed

11 files changed

+971
-552
lines changed

Makefile

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
# contrib/rum/Makefile
22

33
MODULE_big = rum
4-
OBJS = rumutil.o ruminsert.o $(WIN32RES)
4+
OBJS = ginarrayproc.o ginbtree.o ginbulk.o gindatapage.o \
5+
ginentrypage.o ginfast.o ginget.o gininsert.o \
6+
ginscan.o ginutil.o ginvacuum.o ginxlog.o $(WIN32RES)
57

68
EXTENSION = rum
79
DATA = rum--1.0.sql

ginbtree.c

Lines changed: 27 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ ginTraverseLock(Buffer buffer, bool searchMode)
2929
int access = GIN_SHARE;
3030

3131
LockBuffer(buffer, GIN_SHARE);
32-
page = BufferGetPage(buffer);
32+
page = BufferGetPage(buffer, NULL, NULL, BGP_NO_SNAPSHOT_TEST);
3333
if (GinPageIsLeaf(page))
3434
{
3535
if (searchMode == FALSE)
@@ -74,8 +74,6 @@ ginPrepareFindLeafPage(GinBtree btree, BlockNumber blkno)
7474
GinBtreeStack *
7575
ginReFindLeafPage(GinBtree btree, GinBtreeStack *stack)
7676
{
77-
bool found = false;
78-
7977
while (stack->parent)
8078
{
8179
GinBtreeStack *ptr;
@@ -91,14 +89,13 @@ ginReFindLeafPage(GinBtree btree, GinBtreeStack *stack)
9189
stack = stack->parent;
9290
pfree(ptr);
9391

94-
page = BufferGetPage(stack->buffer);
92+
page = BufferGetPage(stack->buffer, NULL, NULL, BGP_NO_SNAPSHOT_TEST);
9593
maxoff = GinPageGetOpaque(page)->maxoff;
9694

9795
if (ginCompareItemPointers(
9896
&(((PostingItem *)GinDataPageGetItem(page, maxoff - 1))->key),
9997
btree->items + btree->curitem) >= 0)
10098
{
101-
found = true;
10299
break;
103100
}
104101
}
@@ -128,7 +125,7 @@ ginFindLeafPage(GinBtree btree, GinBtreeStack *stack)
128125

129126
stack->off = InvalidOffsetNumber;
130127

131-
page = BufferGetPage(stack->buffer);
128+
page = BufferGetPage(stack->buffer, NULL, NULL, BGP_NO_SNAPSHOT_TEST);
132129

133130
if (isfirst)
134131
{
@@ -154,7 +151,8 @@ ginFindLeafPage(GinBtree btree, GinBtreeStack *stack)
154151

155152
stack->buffer = ginStepRight(stack->buffer, btree->index, access);
156153
stack->blkno = rightlink;
157-
page = BufferGetPage(stack->buffer);
154+
page = BufferGetPage(stack->buffer, NULL, NULL,
155+
BGP_NO_SNAPSHOT_TEST);
158156
}
159157

160158
if (GinPageIsLeaf(page)) /* we found, return locked page */
@@ -205,7 +203,7 @@ Buffer
205203
ginStepRight(Buffer buffer, Relation index, int lockmode)
206204
{
207205
Buffer nextbuffer;
208-
Page page = BufferGetPage(buffer);
206+
Page page = BufferGetPage(buffer, NULL, NULL, BGP_NO_SNAPSHOT_TEST);
209207
bool isLeaf = GinPageIsLeaf(page);
210208
bool isData = GinPageIsData(page);
211209
BlockNumber blkno = GinPageGetOpaque(page)->rightlink;
@@ -215,7 +213,7 @@ ginStepRight(Buffer buffer, Relation index, int lockmode)
215213
UnlockReleaseBuffer(buffer);
216214

217215
/* Sanity check that the page we stepped to is of similar kind. */
218-
page = BufferGetPage(nextbuffer);
216+
page = BufferGetPage(nextbuffer, NULL, NULL, BGP_NO_SNAPSHOT_TEST);
219217
if (isLeaf != GinPageIsLeaf(page) || isData != GinPageIsData(page))
220218
elog(ERROR, "right sibling of GIN page is of different type");
221219

@@ -289,7 +287,7 @@ ginFindParents(GinBtree btree, GinBtreeStack *stack,
289287
}
290288
root->off = InvalidOffsetNumber;
291289

292-
page = BufferGetPage(root->buffer);
290+
page = BufferGetPage(root->buffer, NULL, NULL, BGP_NO_SNAPSHOT_TEST);
293291
Assert(!GinPageIsLeaf(page));
294292

295293
/* check trivial case */
@@ -307,7 +305,7 @@ ginFindParents(GinBtree btree, GinBtreeStack *stack,
307305
{
308306
buffer = ReadBuffer(btree->index, blkno);
309307
LockBuffer(buffer, GIN_EXCLUSIVE);
310-
page = BufferGetPage(buffer);
308+
page = BufferGetPage(buffer, NULL, NULL, BGP_NO_SNAPSHOT_TEST);
311309
if (GinPageIsLeaf(page))
312310
elog(ERROR, "Lost path");
313311

@@ -322,7 +320,7 @@ ginFindParents(GinBtree btree, GinBtreeStack *stack,
322320
break;
323321
}
324322
buffer = ginStepRight(buffer, btree->index, GIN_EXCLUSIVE);
325-
page = BufferGetPage(buffer);
323+
page = BufferGetPage(buffer, NULL, NULL, BGP_NO_SNAPSHOT_TEST);
326324
}
327325

328326
if (blkno != InvalidBlockNumber)
@@ -372,7 +370,7 @@ ginInsertValue(GinBtree btree, GinBtreeStack *stack, GinStatsData *buildStats)
372370
XLogRecData *rdata;
373371
BlockNumber savedRightLink;
374372

375-
page = BufferGetPage(stack->buffer);
373+
page = BufferGetPage(stack->buffer, NULL, NULL, BGP_NO_SNAPSHOT_TEST);
376374
savedRightLink = GinPageGetOpaque(page)->rightlink;
377375

378376
if (btree->isEnoughSpace(btree, stack->buffer, stack->off))
@@ -386,7 +384,7 @@ ginInsertValue(GinBtree btree, GinBtreeStack *stack, GinStatsData *buildStats)
386384
{
387385
XLogRecPtr recptr;
388386

389-
recptr = XLogInsert(RM_GIN_ID, XLOG_GIN_INSERT, rdata);
387+
recptr = XLogInsert(RM_GIN_ID, XLOG_GIN_INSERT);
390388
PageSetLSN(page, recptr);
391389
}
392390

@@ -432,9 +430,12 @@ ginInsertValue(GinBtree btree, GinBtreeStack *stack, GinStatsData *buildStats)
432430
((ginxlogSplit *) (rdata->data))->isRootSplit = TRUE;
433431
((ginxlogSplit *) (rdata->data))->rrlink = InvalidBlockNumber;
434432

435-
page = BufferGetPage(stack->buffer);
436-
lpage = BufferGetPage(lbuffer);
437-
rpage = BufferGetPage(rbuffer);
433+
page = BufferGetPage(stack->buffer, NULL, NULL,
434+
BGP_NO_SNAPSHOT_TEST);
435+
lpage = BufferGetPage(lbuffer, NULL, NULL,
436+
BGP_NO_SNAPSHOT_TEST);
437+
rpage = BufferGetPage(rbuffer, NULL, NULL,
438+
BGP_NO_SNAPSHOT_TEST);
438439

439440
GinPageGetOpaque(rpage)->rightlink = InvalidBlockNumber;
440441
GinPageGetOpaque(newlpage)->rightlink = BufferGetBlockNumber(rbuffer);
@@ -454,7 +455,7 @@ ginInsertValue(GinBtree btree, GinBtreeStack *stack, GinStatsData *buildStats)
454455
{
455456
XLogRecPtr recptr;
456457

457-
recptr = XLogInsert(RM_GIN_ID, XLOG_GIN_SPLIT, rdata);
458+
recptr = XLogInsert(RM_GIN_ID, XLOG_GIN_SPLIT);
458459
PageSetLSN(page, recptr);
459460
PageSetLSN(lpage, recptr);
460461
PageSetLSN(rpage, recptr);
@@ -484,8 +485,10 @@ ginInsertValue(GinBtree btree, GinBtreeStack *stack, GinStatsData *buildStats)
484485
((ginxlogSplit *) (rdata->data))->isRootSplit = FALSE;
485486
((ginxlogSplit *) (rdata->data))->rrlink = savedRightLink;
486487

487-
lpage = BufferGetPage(stack->buffer);
488-
rpage = BufferGetPage(rbuffer);
488+
lpage = BufferGetPage(stack->buffer, NULL, NULL,
489+
BGP_NO_SNAPSHOT_TEST);
490+
rpage = BufferGetPage(rbuffer, NULL, NULL,
491+
BGP_NO_SNAPSHOT_TEST);
489492

490493
GinPageGetOpaque(rpage)->rightlink = savedRightLink;
491494
GinPageGetOpaque(newlpage)->rightlink = BufferGetBlockNumber(rbuffer);
@@ -500,7 +503,7 @@ ginInsertValue(GinBtree btree, GinBtreeStack *stack, GinStatsData *buildStats)
500503
{
501504
XLogRecPtr recptr;
502505

503-
recptr = XLogInsert(RM_GIN_ID, XLOG_GIN_SPLIT, rdata);
506+
recptr = XLogInsert(RM_GIN_ID, XLOG_GIN_SPLIT);
504507
PageSetLSN(lpage, recptr);
505508
PageSetLSN(rpage, recptr);
506509
}
@@ -515,7 +518,7 @@ ginInsertValue(GinBtree btree, GinBtreeStack *stack, GinStatsData *buildStats)
515518
LockBuffer(parent->buffer, GIN_EXCLUSIVE);
516519

517520
/* move right if it's needed */
518-
page = BufferGetPage(parent->buffer);
521+
page = BufferGetPage(parent->buffer, NULL, NULL, BGP_NO_SNAPSHOT_TEST);
519522
while ((parent->off = btree->findChildPtr(btree, page, stack->blkno, parent->off)) == InvalidOffsetNumber)
520523
{
521524
BlockNumber rightlink = GinPageGetOpaque(page)->rightlink;
@@ -535,7 +538,8 @@ ginInsertValue(GinBtree btree, GinBtreeStack *stack, GinStatsData *buildStats)
535538

536539
parent->buffer = ginStepRight(parent->buffer, btree->index, GIN_EXCLUSIVE);
537540
parent->blkno = rightlink;
538-
page = BufferGetPage(parent->buffer);
541+
page = BufferGetPage(parent->buffer, NULL, NULL,
542+
BGP_NO_SNAPSHOT_TEST);
539543
}
540544

541545
UnlockReleaseBuffer(stack->buffer);

gindatapage.c

Lines changed: 16 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -357,7 +357,8 @@ dataLocateItem(GinBtree btree, GinBtreeStack *stack)
357357
maxoff;
358358
PostingItem *pitem = NULL;
359359
int result;
360-
Page page = BufferGetPage(stack->buffer);
360+
Page page = BufferGetPage(stack->buffer, NULL, NULL,
361+
BGP_NO_SNAPSHOT_TEST);
361362

362363
Assert(!GinPageIsLeaf(page));
363364
Assert(GinPageIsData(page));
@@ -489,7 +490,8 @@ findInLeafPage(GinBtree btree, Page page, OffsetNumber *offset,
489490
static bool
490491
dataLocateLeafItem(GinBtree btree, GinBtreeStack *stack)
491492
{
492-
Page page = BufferGetPage(stack->buffer);
493+
Page page = BufferGetPage(stack->buffer, NULL, NULL,
494+
BGP_NO_SNAPSHOT_TEST);
493495
ItemPointerData iptr;
494496
Pointer ptr;
495497

@@ -620,7 +622,7 @@ GinPageDeletePostingItem(Page page, OffsetNumber offset)
620622
static bool
621623
dataIsEnoughSpace(GinBtree btree, Buffer buf, OffsetNumber off)
622624
{
623-
Page page = BufferGetPage(buf);
625+
Page page = BufferGetPage(buf, NULL, NULL, BGP_NO_SNAPSHOT_TEST);
624626

625627
Assert(GinPageIsData(page));
626628
Assert(!btree->isDelete);
@@ -699,7 +701,7 @@ dataPrepareData(GinBtree btree, Page page, OffsetNumber off)
699701
static void
700702
dataPlaceToPage(GinBtree btree, Buffer buf, OffsetNumber off, XLogRecData **prdata)
701703
{
702-
Page page = BufferGetPage(buf);
704+
Page page = BufferGetPage(buf, NULL, NULL, BGP_NO_SNAPSHOT_TEST);
703705
Form_pg_attribute attr = btree->ginstate->addAttrs[btree->entryAttnum - 1];
704706

705707
/* these must be static so they can be returned to caller */
@@ -886,8 +888,9 @@ dataSplitPageLeaf(GinBtree btree, Buffer lbuf, Buffer rbuf, OffsetNumber off,
886888
Size totalsize = 0, prevTotalsize;
887889
Pointer ptr, copyPtr;
888890
Page page;
889-
Page lpage = PageGetTempPageCopy(BufferGetPage(lbuf));
890-
Page rpage = BufferGetPage(rbuf);
891+
Page lpage = PageGetTempPageCopy(BufferGetPage(lbuf, NULL, NULL,
892+
BGP_NO_SNAPSHOT_TEST));
893+
Page rpage = BufferGetPage(rbuf, NULL, NULL, BGP_NO_SNAPSHOT_TEST);
891894
Size pageSize = PageGetPageSize(lpage);
892895
Size maxItemSize = 0;
893896
Datum addInfo = 0;
@@ -1127,11 +1130,12 @@ dataSplitPageInternal(GinBtree btree, Buffer lbuf, Buffer rbuf,
11271130
char *ptr;
11281131
OffsetNumber separator;
11291132
ItemPointer bound;
1130-
Page lpage = PageGetTempPageCopy(BufferGetPage(lbuf));
1133+
Page lpage = PageGetTempPageCopy(BufferGetPage(lbuf, NULL, NULL,
1134+
BGP_NO_SNAPSHOT_TEST));
11311135
ItemPointerData oldbound = *GinDataPageGetRightBound(lpage);
11321136
int sizeofitem = GinSizeOfDataPageItem(lpage);
11331137
OffsetNumber maxoff = GinPageGetOpaque(lpage)->maxoff;
1134-
Page rpage = BufferGetPage(rbuf);
1138+
Page rpage = BufferGetPage(rbuf, NULL, NULL, BGP_NO_SNAPSHOT_TEST);
11351139
Size pageSize = PageGetPageSize(lpage);
11361140
Size freeSpace;
11371141
uint32 nCopied = 1;
@@ -1249,7 +1253,7 @@ static Page
12491253
dataSplitPage(GinBtree btree, Buffer lbuf, Buffer rbuf, OffsetNumber off,
12501254
XLogRecData **prdata)
12511255
{
1252-
if (GinPageIsLeaf(BufferGetPage(lbuf)))
1256+
if (GinPageIsLeaf(BufferGetPage(lbuf, NULL, NULL, BGP_NO_SNAPSHOT_TEST)))
12531257
return dataSplitPageLeaf(btree, lbuf, rbuf, off, prdata);
12541258
else
12551259
return dataSplitPageInternal(btree, lbuf, rbuf, off, prdata);
@@ -1304,9 +1308,9 @@ updateItemIndexes(Page page, OffsetNumber attnum, GinState *ginstate)
13041308
void
13051309
ginDataFillRoot(GinBtree btree, Buffer root, Buffer lbuf, Buffer rbuf)
13061310
{
1307-
Page page = BufferGetPage(root),
1308-
lpage = BufferGetPage(lbuf),
1309-
rpage = BufferGetPage(rbuf);
1311+
Page page = BufferGetPage(root, NULL, NULL, BGP_NO_SNAPSHOT_TEST),
1312+
lpage = BufferGetPage(lbuf, NULL, NULL, BGP_NO_SNAPSHOT_TEST),
1313+
rpage = BufferGetPage(rbuf, NULL, NULL, BGP_NO_SNAPSHOT_TEST);
13101314
PostingItem li,
13111315
ri;
13121316

ginentrypage.c

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -136,7 +136,8 @@ entryLocateEntry(GinBtree btree, GinBtreeStack *stack)
136136
maxoff;
137137
IndexTuple itup = NULL;
138138
int result;
139-
Page page = BufferGetPage(stack->buffer);
139+
Page page = BufferGetPage(stack->buffer, NULL, NULL,
140+
BGP_NO_SNAPSHOT_TEST);
140141

141142
Assert(!GinPageIsLeaf(page));
142143
Assert(!GinPageIsData(page));
@@ -207,7 +208,8 @@ entryLocateEntry(GinBtree btree, GinBtreeStack *stack)
207208
static bool
208209
entryLocateLeafEntry(GinBtree btree, GinBtreeStack *stack)
209210
{
210-
Page page = BufferGetPage(stack->buffer);
211+
Page page = BufferGetPage(stack->buffer, NULL, NULL,
212+
BGP_NO_SNAPSHOT_TEST);
211213
OffsetNumber low,
212214
high;
213215

@@ -321,7 +323,7 @@ static bool
321323
entryIsEnoughSpace(GinBtree btree, Buffer buf, OffsetNumber off)
322324
{
323325
Size itupsz = 0;
324-
Page page = BufferGetPage(buf);
326+
Page page = BufferGetPage(buf, NULL, NULL, BGP_NO_SNAPSHOT_TEST);
325327

326328
Assert(btree->entry);
327329
Assert(!GinPageIsData(page));
@@ -377,7 +379,7 @@ entryPreparePage(GinBtree btree, Page page, OffsetNumber off)
377379
static void
378380
entryPlaceToPage(GinBtree btree, Buffer buf, OffsetNumber off, XLogRecData **prdata)
379381
{
380-
Page page = BufferGetPage(buf);
382+
Page page = BufferGetPage(buf, NULL, NULL, BGP_NO_SNAPSHOT_TEST);
381383
OffsetNumber placed;
382384

383385
/* these must be static so they can be returned to caller */
@@ -443,8 +445,9 @@ entrySplitPage(GinBtree btree, Buffer lbuf, Buffer rbuf, OffsetNumber off, XLogR
443445
IndexTuple itup,
444446
leftrightmost = NULL;
445447
Page page;
446-
Page lpage = PageGetTempPageCopy(BufferGetPage(lbuf));
447-
Page rpage = BufferGetPage(rbuf);
448+
Page lpage = PageGetTempPageCopy(BufferGetPage(lbuf, NULL, NULL,
449+
BGP_NO_SNAPSHOT_TEST));
450+
Page rpage = BufferGetPage(rbuf, NULL, NULL, BGP_NO_SNAPSHOT_TEST);
448451
Size pageSize = PageGetPageSize(lpage);
449452

450453
/* these must be static so they can be returned to caller */
@@ -551,7 +554,7 @@ ginPageGetLinkItup(Buffer buf)
551554
{
552555
IndexTuple itup,
553556
nitup;
554-
Page page = BufferGetPage(buf);
557+
Page page = BufferGetPage(buf, NULL, NULL, BGP_NO_SNAPSHOT_TEST);
555558

556559
itup = getRightMostTuple(page);
557560
nitup = GinFormInteriorTuple(itup, page, BufferGetBlockNumber(buf));
@@ -569,7 +572,7 @@ ginEntryFillRoot(GinBtree btree, Buffer root, Buffer lbuf, Buffer rbuf)
569572
Page page;
570573
IndexTuple itup;
571574

572-
page = BufferGetPage(root);
575+
page = BufferGetPage(root, NULL, NULL, BGP_NO_SNAPSHOT_TEST);
573576

574577
itup = ginPageGetLinkItup(lbuf);
575578
if (PageAddItem(page, (Item) itup, IndexTupleSize(itup), InvalidOffsetNumber, false, false) == InvalidOffsetNumber)

0 commit comments

Comments
 (0)