summaryrefslogtreecommitdiff
path: root/src/backend/access/gin/ginxlog.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/backend/access/gin/ginxlog.c')
-rw-r--r--src/backend/access/gin/ginxlog.c18
1 files changed, 18 insertions, 0 deletions
diff --git a/src/backend/access/gin/ginxlog.c b/src/backend/access/gin/ginxlog.c
index 76dabf19736..11b2da16312 100644
--- a/src/backend/access/gin/ginxlog.c
+++ b/src/backend/access/gin/ginxlog.c
@@ -720,12 +720,30 @@ ginRedoDeletePage(XLogRecPtr lsn, XLogRecord *record)
else
{
dbuffer = XLogReadBuffer(data->node, data->blkno, false);
+
+ /*
+ * 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(record->xl_len == sizeof(ginxlogDeletePage) ||
+ record->xl_len == sizeof(ginxlogDeletePageOld));
+
if (BufferIsValid(dbuffer))
{
page = BufferGetPage(dbuffer);
if (lsn > PageGetLSN(page))
{
Assert(GinPageIsData(page));
+ if (record->xl_len == sizeof(ginxlogDeletePage))
+ GinPageSetDeleteXid(page, data->deleteXid);
GinPageGetOpaque(page)->flags = GIN_DELETED;
PageSetLSN(page, lsn);
MarkBufferDirty(dbuffer);