diff options
Diffstat (limited to 'src/backend/access/gin/ginxlog.c')
-rw-r--r-- | src/backend/access/gin/ginxlog.c | 18 |
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); |