* by scanning the old xlog if necessary.
* 3. Modify pg_control to reflect a "shutdown" state with a checkpoint
* record at the start of xlog.
- * 4. Flush the existing xlog files and write a new segment 0 with
- * just a checkpoint record in it.
+ * 4. Flush the existing xlog files and write a new segment with
+ * just a checkpoint record in it. The new segment is positioned
+ * just past the end of the old xlog, so that existing LSNs in
+ * data pages will appear to be "in the past".
* This is all pretty straightforward except for the intuition part of
* step 2 ...
*
* Portions Copyright (c) 1996-2001, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
- * $Header: /cvsroot/pgsql/contrib/pg_resetxlog/Attic/pg_resetxlog.c,v 1.1 2001/03/14 00:57:43 tgl Exp $
+ * $Header: /cvsroot/pgsql/contrib/pg_resetxlog/Attic/pg_resetxlog.c,v 1.2 2001/03/16 05:08:39 tgl Exp $
*
*-------------------------------------------------------------------------
*/
static char ControlFilePath[MAXPGPATH];
static ControlFileData ControlFile; /* pg_control values */
+static uint32 newXlogId, newXlogSeg; /* ID/Segment of new XLOG segment */
static bool guessed = false; /* T if we had to guess at any values */
ControlFile.catalog_version_no = oldfile->catalog_version_no;
ControlFile.state = oldfile->state;
+ ControlFile.logId = oldfile->logId;
+ ControlFile.logSeg = oldfile->logSeg;
ControlFile.blcksz = oldfile->blcksz;
ControlFile.relseg_size = oldfile->relseg_size;
printf("Guessed-at pg_control values:\n\n"
"pg_control version number: %u\n"
"Catalog version number: %u\n"
+ "Current log file id: %u\n"
+ "Next log file segment: %u\n"
"Latest checkpoint's StartUpID: %u\n"
"Latest checkpoint's NextXID: %u\n"
"Latest checkpoint's NextOID: %u\n"
ControlFile.pg_control_version,
ControlFile.catalog_version_no,
+ ControlFile.logId,
+ ControlFile.logSeg,
ControlFile.checkPointCopy.ThisStartUpID,
ControlFile.checkPointCopy.nextXid,
ControlFile.checkPointCopy.nextOid,
char buffer[BLCKSZ]; /* need not be aligned */
/*
- * Adjust fields as needed to force an empty XLOG.
+ * Adjust fields as needed to force an empty XLOG starting at the
+ * next available segment.
*/
- ControlFile.checkPointCopy.redo.xlogid = 0;
- ControlFile.checkPointCopy.redo.xrecoff = SizeOfXLogPHD;
+ newXlogId = ControlFile.logId;
+ newXlogSeg = ControlFile.logSeg;
+ /* be sure we wrap around correctly at end of a logfile */
+ NextLogSeg(newXlogId, newXlogSeg);
+
+ ControlFile.checkPointCopy.redo.xlogid = newXlogId;
+ ControlFile.checkPointCopy.redo.xrecoff =
+ newXlogSeg * XLogSegSize + SizeOfXLogPHD;
ControlFile.checkPointCopy.undo = ControlFile.checkPointCopy.redo;
ControlFile.checkPointCopy.time = time(NULL);
ControlFile.state = DB_SHUTDOWNED;
ControlFile.time = time(NULL);
- ControlFile.logId = 0;
- ControlFile.logSeg = 1;
+ ControlFile.logId = newXlogId;
+ ControlFile.logSeg = newXlogSeg + 1;
ControlFile.checkPoint = ControlFile.checkPointCopy.redo;
ControlFile.prevCheckPoint.xlogid = 0;
ControlFile.prevCheckPoint.xrecoff = 0;
record->xl_crc = crc;
/* Write the first page */
- XLogFileName(path, 0, 0);
+ XLogFileName(path, newXlogId, newXlogSeg);
unlink(path);