aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/backend/access/gin/ginxlog.c19
-rw-r--r--src/include/access/ginxlog.h10
2 files changed, 28 insertions, 1 deletions
diff --git a/src/backend/access/gin/ginxlog.c b/src/backend/access/gin/ginxlog.c
index 291f22ef77f..b86990f3ac7 100644
--- a/src/backend/access/gin/ginxlog.c
+++ b/src/backend/access/gin/ginxlog.c
@@ -531,7 +531,24 @@ ginRedoDeletePage(XLogReaderState *record)
page = BufferGetPage(dbuffer);
Assert(GinPageIsData(page));
GinPageGetOpaque(page)->flags = GIN_DELETED;
- GinPageSetDeleteXid(page, data->deleteXid);
+
+ /*
+ * deleteXid field of ginxlogDeletePage was added during backpatching.
+ * But, non-backpatched instances will continue generate WAL without
+ * this field. We should be able to correctly apply that. We can
+ * distinguish new WAL records by size their data, because
+ * ginxlogDeletePage changes its size on both 32-bit and 64-bit
+ * platforms.
+ */
+ StaticAssertStmt(sizeof(ginxlogDeletePage) !=
+ sizeof(ginxlogDeletePageOld),
+ "ginxlogDeletePage size should be changed "
+ "with addition of deleteXid field");
+ Assert(XLogRecGetDataLen(record) == sizeof(ginxlogDeletePage) ||
+ XLogRecGetDataLen(record) == sizeof(ginxlogDeletePageOld));
+ if (XLogRecGetDataLen(record) == sizeof(ginxlogDeletePage))
+ GinPageSetDeleteXid(page, data->deleteXid);
+
PageSetLSN(page, lsn);
MarkBufferDirty(dbuffer);
}
diff --git a/src/include/access/ginxlog.h b/src/include/access/ginxlog.h
index a86735b7ed8..e05cf42c9ec 100644
--- a/src/include/access/ginxlog.h
+++ b/src/include/access/ginxlog.h
@@ -161,6 +161,16 @@ typedef struct ginxlogDeletePage
TransactionId deleteXid; /* last Xid which could see this page in scan */
} ginxlogDeletePage;
+/*
+ * Previous version of ginxlogDeletePage struct, which didn't have deleteXid
+ * field. Used for size comparison (see ginRedoDeletePage()).
+ */
+typedef struct ginxlogDeletePageOld
+{
+ OffsetNumber parentOffset;
+ BlockNumber rightLink;
+} ginxlogDeletePageOld;
+
#define XLOG_GIN_UPDATE_META_PAGE 0x60
/*