diff options
-rw-r--r-- | src/backend/access/gin/ginxlog.c | 27 |
1 files changed, 13 insertions, 14 deletions
diff --git a/src/backend/access/gin/ginxlog.c b/src/backend/access/gin/ginxlog.c index c9f611d936e..f66938a1303 100644 --- a/src/backend/access/gin/ginxlog.c +++ b/src/backend/access/gin/ginxlog.c @@ -487,18 +487,20 @@ ginRedoUpdateMetapage(XLogRecPtr lsn, XLogRecord *record) Page metapage; Buffer buffer; + /* + * Restore the metapage. This is essentially the same as a full-page image, + * so restore the metapage unconditionally without looking at the LSN, to + * avoid torn page hazards. + */ metabuffer = XLogReadBuffer(data->node, GIN_METAPAGE_BLKNO, false); if (!BufferIsValid(metabuffer)) return; /* assume index was deleted, nothing to do */ metapage = BufferGetPage(metabuffer); - if (!XLByteLE(lsn, PageGetLSN(metapage))) - { - memcpy(GinPageGetMeta(metapage), &data->metadata, sizeof(GinMetaPageData)); - PageSetLSN(metapage, lsn); - PageSetTLI(metapage, ThisTimeLineID); - MarkBufferDirty(metabuffer); - } + memcpy(GinPageGetMeta(metapage), &data->metadata, sizeof(GinMetaPageData)); + PageSetLSN(metapage, lsn); + PageSetTLI(metapage, ThisTimeLineID); + MarkBufferDirty(metabuffer); if (data->ntuples > 0) { @@ -637,13 +639,10 @@ ginRedoDeleteListPages(XLogRecPtr lsn, XLogRecord *record) return; /* assume index was deleted, nothing to do */ metapage = BufferGetPage(metabuffer); - if (!XLByteLE(lsn, PageGetLSN(metapage))) - { - memcpy(GinPageGetMeta(metapage), &data->metadata, sizeof(GinMetaPageData)); - PageSetLSN(metapage, lsn); - PageSetTLI(metapage, ThisTimeLineID); - MarkBufferDirty(metabuffer); - } + memcpy(GinPageGetMeta(metapage), &data->metadata, sizeof(GinMetaPageData)); + PageSetLSN(metapage, lsn); + PageSetTLI(metapage, ThisTimeLineID); + MarkBufferDirty(metabuffer); for (i = 0; i < data->ndeleted; i++) { |