diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index 47232fe5ce..bc163a7028 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -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.117 2003/06/26 18:23:07 tgl Exp $ + * $Header: /cvsroot/pgsql/src/backend/access/transam/xlog.c,v 1.118 2003/07/17 16:45:04 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -2487,6 +2487,7 @@ StartupXLOG(void) EndOfLog; XLogRecord *record; char *buffer; + uint32 freespace; /* Use malloc() to ensure record buffer is MAXALIGNED */ buffer = (char *) malloc(_INTL_MAXLOGRECSZ); @@ -2697,8 +2698,6 @@ StartupXLOG(void) 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; @@ -2709,6 +2708,27 @@ StartupXLOG(void) XLogCtl->LogwrtRqst.Write = EndOfLog; XLogCtl->LogwrtRqst.Flush = EndOfLog; + freespace = INSERT_FREESPACE(Insert); + if (freespace > 0) + { + /* Make sure rest of page is zero */ + MemSet(Insert->currpos, 0, freespace); + XLogCtl->Write.curridx = 0; + } + else + { + /* + * Whenever Write.LogwrtResult points to exactly the end of a page, + * Write.curridx must point to the *next* page (see XLogWrite()). + * + * Note: it might seem we should do AdvanceXLInsertBuffer() here, + * but we can't since we haven't yet determined the correct StartUpID + * to put into the new page's header. The first actual attempt to + * insert a log record will advance the insert state. + */ + XLogCtl->Write.curridx = NextBufIdx(0); + } + #ifdef NOT_USED /* UNDO */ if (InRecovery)