mirror of
https://github.com/postgres/postgres.git
synced 2025-08-05 07:41:25 +03:00
In the checkpoint written at the end of archive recovery, the WAL page header
was incorrectly initialized with timeline ID 0. That rendered the WAL page unrecoverable, making a subsequent archive recovery stop at that point. ThisTimeLineID needs to be initialized before calling AdvanceXLInsertBuffer(). This fixes bug #5011 reported by James Bardin. Backpatch to 8.4, as the bug was introduced by the changes to use of bgwriter for writing the end-of-archive-recovery checkpoint. Patch by Tom Lane.
This commit is contained in:
@@ -7,7 +7,7 @@
|
|||||||
* Portions Copyright (c) 1996-2009, PostgreSQL Global Development Group
|
* Portions Copyright (c) 1996-2009, PostgreSQL Global Development Group
|
||||||
* Portions Copyright (c) 1994, Regents of the University of California
|
* Portions Copyright (c) 1994, Regents of the University of California
|
||||||
*
|
*
|
||||||
* $PostgreSQL: pgsql/src/backend/access/transam/xlog.c,v 1.345.2.2 2009/08/08 16:39:25 tgl Exp $
|
* $PostgreSQL: pgsql/src/backend/access/transam/xlog.c,v 1.345.2.3 2009/08/27 07:18:04 heikki Exp $
|
||||||
*
|
*
|
||||||
*-------------------------------------------------------------------------
|
*-------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
@@ -6434,6 +6434,17 @@ CreateCheckPoint(int flags)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* An end-of-recovery checkpoint is created before anyone is allowed to
|
||||||
|
* write WAL. To allow us to write the checkpoint record, temporarily
|
||||||
|
* enable XLogInsertAllowed. (This also ensures ThisTimeLineID is
|
||||||
|
* initialized, which we need here and in AdvanceXLInsertBuffer.)
|
||||||
|
*/
|
||||||
|
if (flags & CHECKPOINT_END_OF_RECOVERY)
|
||||||
|
LocalSetXLogInsertAllowed();
|
||||||
|
|
||||||
|
checkPoint.ThisTimeLineID = ThisTimeLineID;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Compute new REDO record ptr = location of next XLOG record.
|
* Compute new REDO record ptr = location of next XLOG record.
|
||||||
*
|
*
|
||||||
@@ -6556,20 +6567,6 @@ CreateCheckPoint(int flags)
|
|||||||
|
|
||||||
START_CRIT_SECTION();
|
START_CRIT_SECTION();
|
||||||
|
|
||||||
/*
|
|
||||||
* An end-of-recovery checkpoint is created before anyone is allowed to
|
|
||||||
* write WAL. To allow us to write the checkpoint record, temporarily
|
|
||||||
* enable XLogInsertAllowed.
|
|
||||||
*/
|
|
||||||
if (flags & CHECKPOINT_END_OF_RECOVERY)
|
|
||||||
LocalSetXLogInsertAllowed();
|
|
||||||
|
|
||||||
/*
|
|
||||||
* This needs to be done after LocalSetXLogInsertAllowed(), else
|
|
||||||
* ThisTimeLineID might still be uninitialized.
|
|
||||||
*/
|
|
||||||
checkPoint.ThisTimeLineID = ThisTimeLineID;
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Now insert the checkpoint record into XLOG.
|
* Now insert the checkpoint record into XLOG.
|
||||||
*/
|
*/
|
||||||
|
Reference in New Issue
Block a user