diff options
Diffstat (limited to 'src')
| -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++)  	{ | 
