aboutsummaryrefslogtreecommitdiff
path: root/src/backend/access/transam/xlog.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/backend/access/transam/xlog.c')
-rw-r--r--src/backend/access/transam/xlog.c26
1 files changed, 23 insertions, 3 deletions
diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c
index 47232fe5ce1..bc163a70286 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)