mirror of
https://github.com/postgres/postgres.git
synced 2025-09-02 04:21:28 +03:00
Assert that buffers are marked dirty before XLogRegisterBuffer().
Enforce the rule from transam/README in XLogRegisterBuffer(), and update callers to follow the rule. Hash indexes sometimes register clean pages as a part of the locking protocol, so provide a REGBUF_NO_CHANGE flag to support that use. Discussion: https://postgr.es/m/c84114f8-c7f1-5b57-f85a-3adc31e1a904@iki.fi Reviewed-by: Heikki Linnakangas
This commit is contained in:
@@ -387,24 +387,22 @@ ginPlaceToPage(GinBtree btree, GinBtreeStack *stack,
|
||||
START_CRIT_SECTION();
|
||||
|
||||
if (RelationNeedsWAL(btree->index) && !btree->isBuild)
|
||||
{
|
||||
XLogBeginInsert();
|
||||
XLogRegisterBuffer(0, stack->buffer, REGBUF_STANDARD);
|
||||
if (BufferIsValid(childbuf))
|
||||
XLogRegisterBuffer(1, childbuf, REGBUF_STANDARD);
|
||||
}
|
||||
|
||||
/* Perform the page update, and register any extra WAL data */
|
||||
/*
|
||||
* Perform the page update, dirty and register stack->buffer, and
|
||||
* register any extra WAL data.
|
||||
*/
|
||||
btree->execPlaceToPage(btree, stack->buffer, stack,
|
||||
insertdata, updateblkno, ptp_workspace);
|
||||
|
||||
MarkBufferDirty(stack->buffer);
|
||||
|
||||
/* An insert to an internal page finishes the split of the child. */
|
||||
if (BufferIsValid(childbuf))
|
||||
{
|
||||
GinPageGetOpaque(childpage)->flags &= ~GIN_INCOMPLETE_SPLIT;
|
||||
MarkBufferDirty(childbuf);
|
||||
if (RelationNeedsWAL(btree->index) && !btree->isBuild)
|
||||
XLogRegisterBuffer(1, childbuf, REGBUF_STANDARD);
|
||||
}
|
||||
|
||||
if (RelationNeedsWAL(btree->index) && !btree->isBuild)
|
||||
|
@@ -721,9 +721,12 @@ dataExecPlaceToPageLeaf(GinBtree btree, Buffer buf, GinBtreeStack *stack,
|
||||
/* Apply changes to page */
|
||||
dataPlaceToPageLeafRecompress(buf, leaf);
|
||||
|
||||
MarkBufferDirty(buf);
|
||||
|
||||
/* If needed, register WAL data built by computeLeafRecompressWALData */
|
||||
if (RelationNeedsWAL(btree->index) && !btree->isBuild)
|
||||
{
|
||||
XLogRegisterBuffer(0, buf, REGBUF_STANDARD);
|
||||
XLogRegisterBufData(0, leaf->walinfo, leaf->walinfolen);
|
||||
}
|
||||
}
|
||||
@@ -1155,6 +1158,8 @@ dataExecPlaceToPageInternal(GinBtree btree, Buffer buf, GinBtreeStack *stack,
|
||||
pitem = (PostingItem *) insertdata;
|
||||
GinDataPageAddPostingItem(page, pitem, off);
|
||||
|
||||
MarkBufferDirty(buf);
|
||||
|
||||
if (RelationNeedsWAL(btree->index) && !btree->isBuild)
|
||||
{
|
||||
/*
|
||||
@@ -1167,6 +1172,7 @@ dataExecPlaceToPageInternal(GinBtree btree, Buffer buf, GinBtreeStack *stack,
|
||||
data.offset = off;
|
||||
data.newitem = *pitem;
|
||||
|
||||
XLogRegisterBuffer(0, buf, REGBUF_STANDARD);
|
||||
XLogRegisterBufData(0, (char *) &data,
|
||||
sizeof(ginxlogInsertDataInternal));
|
||||
}
|
||||
|
@@ -571,6 +571,8 @@ entryExecPlaceToPage(GinBtree btree, Buffer buf, GinBtreeStack *stack,
|
||||
elog(ERROR, "failed to add item to index page in \"%s\"",
|
||||
RelationGetRelationName(btree->index));
|
||||
|
||||
MarkBufferDirty(buf);
|
||||
|
||||
if (RelationNeedsWAL(btree->index) && !btree->isBuild)
|
||||
{
|
||||
/*
|
||||
@@ -583,6 +585,7 @@ entryExecPlaceToPage(GinBtree btree, Buffer buf, GinBtreeStack *stack,
|
||||
data.isDelete = insertData->isDelete;
|
||||
data.offset = off;
|
||||
|
||||
XLogRegisterBuffer(0, buf, REGBUF_STANDARD);
|
||||
XLogRegisterBufData(0, (char *) &data,
|
||||
offsetof(ginxlogInsertEntry, tuple));
|
||||
XLogRegisterBufData(0, (char *) insertData->entry,
|
||||
|
@@ -397,6 +397,9 @@ ginHeapTupleFastInsert(GinState *ginstate, GinTupleCollector *collector)
|
||||
}
|
||||
|
||||
Assert((ptr - collectordata) <= collector->sumsize);
|
||||
|
||||
MarkBufferDirty(buffer);
|
||||
|
||||
if (needWal)
|
||||
{
|
||||
XLogRegisterBuffer(1, buffer, REGBUF_STANDARD);
|
||||
@@ -404,8 +407,6 @@ ginHeapTupleFastInsert(GinState *ginstate, GinTupleCollector *collector)
|
||||
}
|
||||
|
||||
metadata->tailFreeSize = PageGetExactFreeSpace(page);
|
||||
|
||||
MarkBufferDirty(buffer);
|
||||
}
|
||||
|
||||
/*
|
||||
|
Reference in New Issue
Block a user