1
0
mirror of https://github.com/postgres/postgres.git synced 2025-06-30 21:42:05 +03:00

Add test to WAL replay to verify that xl_prev points back to the previous

WAL record; this is necessary to be sure we recognize stale WAL records
when a WAL page was only partially written during a system crash.
This commit is contained in:
Tom Lane
2005-05-31 19:10:57 +00:00
parent 3c6bba3072
commit 5205024b5a

View File

@ -7,7 +7,7 @@
* Portions Copyright (c) 1996-2003, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
* $Header: /cvsroot/pgsql/src/backend/access/transam/xlog.c,v 1.125.2.2 2004/08/11 04:08:00 tgl Exp $
* $Header: /cvsroot/pgsql/src/backend/access/transam/xlog.c,v 1.125.2.3 2005/05/31 19:10:57 tgl Exp $
*
*-------------------------------------------------------------------------
*/
@ -430,8 +430,8 @@ static uint32 readOff = 0;
static char *readBuf = NULL;
/* State information for XLOG reading */
static XLogRecPtr ReadRecPtr;
static XLogRecPtr EndRecPtr;
static XLogRecPtr ReadRecPtr; /* start of last record read */
static XLogRecPtr EndRecPtr; /* end+1 of last record read */
static XLogRecord *nextRecord = NULL;
static StartUpID lastReadSUI;
@ -1900,6 +1900,37 @@ got_record:;
RecPtr->xlogid, RecPtr->xrecoff)));
goto next_record_is_invalid;
}
if (!nextmode)
{
/*
* We can't exactly verify the prev-link, but surely it should be
* less than the record's own address.
*/
if (!XLByteLT(record->xl_prev, *RecPtr))
{
ereport(emode,
(errmsg("record with incorrect prev-link %X/%X at %X/%X",
record->xl_prev.xlogid, record->xl_prev.xrecoff,
RecPtr->xlogid, RecPtr->xrecoff)));
goto next_record_is_invalid;
}
}
else
{
/*
* Record's prev-link should exactly match our previous location.
* This check guards against torn WAL pages where a stale but
* valid-looking WAL record starts on a sector boundary.
*/
if (!XLByteEQ(record->xl_prev, ReadRecPtr))
{
ereport(emode,
(errmsg("record with incorrect prev-link %X/%X at %X/%X",
record->xl_prev.xlogid, record->xl_prev.xrecoff,
RecPtr->xlogid, RecPtr->xrecoff)));
goto next_record_is_invalid;
}
}
/*
* Compute total length of record including any appended backup