StartupXLOG(): initialize XLogCtl->Insert to new page if there is

no room for a record on last log page.
This commit is contained in:
Vadim B. Mikheev 2001-04-05 09:34:32 +00:00
parent 495fe1214c
commit 3092869233
1 changed files with 44 additions and 14 deletions

View File

@ -7,7 +7,7 @@
* Portions Copyright (c) 1996-2001, PostgreSQL Global Development Group * Portions Copyright (c) 1996-2001, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California * Portions Copyright (c) 1994, Regents of the University of California
* *
* $Header: /cvsroot/pgsql/src/backend/access/transam/xlog.c,v 1.63 2001/03/22 03:59:18 momjian Exp $ * $Header: /cvsroot/pgsql/src/backend/access/transam/xlog.c,v 1.64 2001/04/05 09:34:32 vadim Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
@ -2440,23 +2440,53 @@ StartupXLOG(void)
openLogOff = 0; openLogOff = 0;
ControlFile->logId = openLogId; ControlFile->logId = openLogId;
ControlFile->logSeg = openLogSeg + 1; ControlFile->logSeg = openLogSeg + 1;
XLogCtl->xlblocks[0].xlogid = openLogId;
XLogCtl->xlblocks[0].xrecoff =
((EndOfLog.xrecoff - 1) / BLCKSZ + 1) * BLCKSZ;
Insert = &XLogCtl->Insert; Insert = &XLogCtl->Insert;
Insert->PrevRecord = LastRec;
/* /*
* Tricky point here: readBuf contains the *last* block that the * If the next record will go to the new page
* LastRec record spans, not the one it starts in, which is what we * then initialize for that one.
* want.
*/ */
Assert(readOff == (XLogCtl->xlblocks[0].xrecoff - BLCKSZ) % XLogSegSize); if ((BLCKSZ - EndOfLog.xrecoff % BLCKSZ) < SizeOfXLogRecord)
memcpy((char *) Insert->currpage, readBuf, BLCKSZ); EndOfLog.xrecoff += (BLCKSZ - EndOfLog.xrecoff % BLCKSZ);
Insert->currpos = (char *) Insert->currpage + if (EndOfLog.xrecoff % BLCKSZ == 0)
(EndOfLog.xrecoff + BLCKSZ - XLogCtl->xlblocks[0].xrecoff); {
/* Make sure rest of page is zero */ if (EndOfLog.xrecoff >= XLogFileSize)
memset(Insert->currpos, 0, INSERT_FREESPACE(Insert)); {
Insert->PrevRecord = LastRec; XLogCtl->xlblocks[0].xlogid = EndOfLog.xlogid + 1;
XLogCtl->xlblocks[0].xrecoff = BLCKSZ;
}
else
{
XLogCtl->xlblocks[0].xlogid = EndOfLog.xlogid;
XLogCtl->xlblocks[0].xrecoff = EndOfLog.xrecoff + BLCKSZ;
}
Insert->currpos = (char *) Insert->currpage + SizeOfXLogPHD;
Insert->currpage->xlp_magic = XLOG_PAGE_MAGIC;
if (InRecovery)
Insert->currpage->xlp_sui = ThisStartUpID;
else
Insert->currpage->xlp_sui = ThisStartUpID + 1;
}
else
{
XLogCtl->xlblocks[0].xlogid = openLogId;
XLogCtl->xlblocks[0].xrecoff =
((EndOfLog.xrecoff - 1) / BLCKSZ + 1) * BLCKSZ;
/*
* Tricky point here: readBuf contains the *last* block that the
* LastRec record spans, not the one it starts in, which is what we
* want.
*
* XXX - why would we want block LastRec starts in?
*/
Assert(readOff == (XLogCtl->xlblocks[0].xrecoff - BLCKSZ) % XLogSegSize);
memcpy((char *) Insert->currpage, readBuf, BLCKSZ);
Insert->currpos = (char *) Insert->currpage +
(EndOfLog.xrecoff + BLCKSZ - XLogCtl->xlblocks[0].xrecoff);
/* Make sure rest of page is zero */
memset(Insert->currpos, 0, INSERT_FREESPACE(Insert));
}
LogwrtResult.Write = LogwrtResult.Flush = EndOfLog; LogwrtResult.Write = LogwrtResult.Flush = EndOfLog;