Skip to content

Commit 9bc70b1

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 we have all the information required to re-initialize in the WAL record anyway. Before this fix, a full-page image was always generated, unless full_page_writes=off, because when the page is initialized its LSN is always 0. In stable-branches, keep the code to restore the backup blocks if they exist, in case that the WAL is generated with an older minor version, but in master Assert that there are no full-page images. In the redo routine, add missing "off++". Otherwise the tuples are added to the page in reverse order. That happens to be harmless because we always 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, because the page was always restored from a full-page image. Backpatch to all supported versions.
1 parent 70e7be2 commit 9bc70b1

File tree

2 files changed

+7
-3
lines changed

2 files changed

+7
-3
lines changed

src/backend/access/gin/ginfast.c

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

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

src/backend/access/gin/ginxlog.c

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -621,7 +621,11 @@ ginRedoInsertListPage(XLogRecPtr lsn, XLogRecord *record)
621621
tupsize;
622622
IndexTuple tuples = (IndexTuple) (XLogRecGetData(record) + sizeof(ginxlogInsertListPage));
623623

624-
/* If we have a full-page image, restore it and we're done */
624+
/*
625+
* If we have a full-page image, restore it and we're done. (As the code
626+
* stands, we never create full-page images, but we used to. Cope if
627+
* we're reading WAL generated with an older minor version.)
628+
*/
625629
if (record->xl_info & XLR_BKP_BLOCK(0))
626630
{
627631
(void) RestoreBackupBlock(lsn, record, 0, false, false);
@@ -655,6 +659,7 @@ ginRedoInsertListPage(XLogRecPtr lsn, XLogRecord *record)
655659
elog(ERROR, "failed to add item to index page");
656660

657661
tuples = (IndexTuple) (((char *) tuples) + tupsize);
662+
off++;
658663
}
659664

660665
PageSetLSN(page, lsn);

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy