aboutsummaryrefslogtreecommitdiff
path: root/src/backend/access/gin/ginbtree.c
diff options
context:
space:
mode:
authorKevin Grittner <kgrittn@postgresql.org>2016-04-08 14:30:10 -0500
committerKevin Grittner <kgrittn@postgresql.org>2016-04-08 14:30:10 -0500
commit8b65cf4c5edabdcae45ceaef7b9ac236879aae50 (patch)
treef4412d3e9bc0db823ac32e08fac8e3124b42ff02 /src/backend/access/gin/ginbtree.c
parent689f9a058854a1a32e994818dd6d79f49d8f8a1b (diff)
downloadpostgresql-8b65cf4c5edabdcae45ceaef7b9ac236879aae50.tar.gz
postgresql-8b65cf4c5edabdcae45ceaef7b9ac236879aae50.zip
Modify BufferGetPage() to prepare for "snapshot too old" feature
This patch is a no-op patch which is intended to reduce the chances of failures of omission once the functional part of the "snapshot too old" patch goes in. It adds parameters for snapshot, relation, and an enum to specify whether the snapshot age check needs to be done for the page at this point. This initial patch passes NULL for the first two new parameters and BGP_NO_SNAPSHOT_TEST for the third. The follow-on patch will change the places where the test needs to be made.
Diffstat (limited to 'src/backend/access/gin/ginbtree.c')
-rw-r--r--src/backend/access/gin/ginbtree.c68
1 files changed, 44 insertions, 24 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,