summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorHeikki Linnakangas <heikki.linnakangas@iki.fi>2014-04-28 16:12:45 +0300
committerHeikki Linnakangas <heikki.linnakangas@iki.fi>2014-04-28 17:24:13 +0300
commit9bc70b1d66bbaddd4de5b37500bff49f6365fc2e (patch)
treecc45d2f43ce9573cd4f2c0f2b18c56da0cb858ab /src
parent70e7be2647106c30784627e69b9d92342e77dc3e (diff)
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.
Diffstat (limited to 'src')
-rw-r--r--src/backend/access/gin/ginfast.c3
-rw-r--r--src/backend/access/gin/ginxlog.c7
2 files changed, 7 insertions, 3 deletions
diff --git a/src/backend/access/gin/ginfast.c b/src/backend/access/gin/ginfast.c
index 704f4710364..cc01deac3ec 100644
--- a/src/backend/access/gin/ginfast.c
+++ b/src/backend/access/gin/ginfast.c
@@ -120,8 +120,7 @@ writeListPage(Relation index, Buffer buffer,
rdata[0].len = sizeof(ginxlogInsertListPage);
rdata[0].next = rdata + 1;
- rdata[1].buffer = buffer;
- rdata[1].buffer_std = true;
+ rdata[1].buffer = InvalidBuffer;
rdata[1].data = workspace;
rdata[1].len = size;
rdata[1].next = NULL;
diff --git a/src/backend/access/gin/ginxlog.c b/src/backend/access/gin/ginxlog.c
index bfd32241443..6b781c5d356 100644
--- a/src/backend/access/gin/ginxlog.c
+++ b/src/backend/access/gin/ginxlog.c
@@ -621,7 +621,11 @@ ginRedoInsertListPage(XLogRecPtr lsn, XLogRecord *record)
tupsize;
IndexTuple tuples = (IndexTuple) (XLogRecGetData(record) + sizeof(ginxlogInsertListPage));
- /* If we have a full-page image, restore it and we're done */
+ /*
+ * If we have a full-page image, restore it and we're done. (As the code
+ * stands, we never create full-page images, but we used to. Cope if
+ * we're reading WAL generated with an older minor version.)
+ */
if (record->xl_info & XLR_BKP_BLOCK(0))
{
(void) RestoreBackupBlock(lsn, record, 0, false, false);
@@ -655,6 +659,7 @@ ginRedoInsertListPage(XLogRecPtr lsn, XLogRecord *record)
elog(ERROR, "failed to add item to index page");
tuples = (IndexTuple) (((char *) tuples) + tupsize);
+ off++;
}
PageSetLSN(page, lsn);