Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commitd272244

Browse files
committed
Fix two bugs in WAL-logging of GIN pending-list pages.
In writeListPage, never take a full-page image of the page, because wehave all the information required to re-initialize in the WAL recordanyway. Before this fix, a full-page image was always generated, unlessfull_page_writes=off, because when the page is initialized its LSN isalways 0. In stable-branches, keep the code to restore the backup blocksif they exist, in case that the WAL is generated with an older minorversion, but in master Assert that there are no full-page images.In the redo routine, add missing "off++". Otherwise the tuples are addedto the page in reverse order. That happens to be harmless because wealways scan and remove all the tuples together, but it was clearly wrong.Also, it was masked by the first bug unless full_page_writes=off, becausethe page was always restored from a full-page image.Backpatch to all supported versions.
1 parent728c06f commitd272244

File tree

2 files changed

+6
-8
lines changed

2 files changed

+6
-8
lines changed

‎src/backend/access/gin/ginfast.c

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -119,8 +119,7 @@ writeListPage(Relation index, Buffer buffer,
119119
rdata[0].len=sizeof(ginxlogInsertListPage);
120120
rdata[0].next=rdata+1;
121121

122-
rdata[1].buffer=buffer;
123-
rdata[1].buffer_std= true;
122+
rdata[1].buffer=InvalidBuffer;
124123
rdata[1].data=workspace;
125124
rdata[1].len=size;
126125
rdata[1].next=NULL;

‎src/backend/access/gin/ginxlog.c

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -814,12 +814,10 @@ ginRedoInsertListPage(XLogRecPtr lsn, XLogRecord *record)
814814
tupsize;
815815
IndexTupletuples= (IndexTuple) (XLogRecGetData(record)+sizeof(ginxlogInsertListPage));
816816

817-
/* If we have a full-page image, restore it and we're done */
818-
if (record->xl_info&XLR_BKP_BLOCK(0))
819-
{
820-
(void)RestoreBackupBlock(lsn,record,0, false, false);
821-
return;
822-
}
817+
/*
818+
* Backup blocks are not used, we always re-initialize the page.
819+
*/
820+
Assert(!(record->xl_info&XLR_BKP_BLOCK_MASK));
823821

824822
buffer=XLogReadBuffer(data->node,data->blkno, true);
825823
Assert(BufferIsValid(buffer));
@@ -848,6 +846,7 @@ ginRedoInsertListPage(XLogRecPtr lsn, XLogRecord *record)
848846
elog(ERROR,"failed to add item to index page");
849847

850848
tuples= (IndexTuple) (((char*)tuples)+tupsize);
849+
off++;
851850
}
852851

853852
PageSetLSN(page,lsn);

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp