mirror of
https://github.com/postgres/postgres.git
synced 2025-06-08 22:02:03 +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:
parent
4f142baf37
commit
2e1229671a
@ -7,7 +7,7 @@
|
||||
* Portions Copyright (c) 1996-2002, 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.109.2.4 2004/08/11 04:08:39 tgl Exp $
|
||||
* $Header: /cvsroot/pgsql/src/backend/access/transam/xlog.c,v 1.109.2.5 2005/05/31 19:11:14 tgl Exp $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
@ -431,8 +431,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;
|
||||
|
||||
@ -1866,6 +1866,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))
|
||||
{
|
||||
elog(emode,
|
||||
"ReadRecord: 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))
|
||||
{
|
||||
elog(emode,
|
||||
"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
|
||||
|
Loading…
x
Reference in New Issue
Block a user