Re: postmaster startup failure - Mailing list pgsql-hackers

From Tom Lane
Subject Re: postmaster startup failure
Date
Msg-id 4426.1058460573@sss.pgh.pa.us
Whole thread Raw
In response to postmaster startup failure  (Hannu Krosing <hannu@tm.ee>)
Responses Re: postmaster startup failure  (Hannu Krosing <hannu@tm.ee>)
List pgsql-hackers
Hannu Krosing <hannu@tm.ee> writes:
> WHen running PostgreSQL 7.3.3-1 (from rpm's) on Redhat 9.0 I got the
> following in logs and the postmaster will not start up.
> PANIC:  XLogWrite: write request 0/30504000 is past end of log
> 0/30504000

Ugh.  The reason we hadn't seen this happen in the field was that it is
a bug I introduced in a patch two months ago :-(

7.3.3 will in fact fail to start up, with the above error, any time the
last record of the WAL file ends exactly at a page boundary.  I think
we're gonna need a quick 7.3.4 ...

If you want a source patch for 7.3.3, here it is.
        regards, tom lane


*** src/backend/access/transam/xlog.c.orig    Thu May 22 10:39:49 2003
--- src/backend/access/transam/xlog.c    Thu Jul 17 12:36:20 2003
***************
*** 2483,2488 ****
--- 2483,2489 ----                 EndOfLog;     XLogRecord *record;     char       *buffer;
+     uint32        freespace;      /* Use malloc() to ensure record buffer is MAXALIGNED */     buffer = (char *)
malloc(_INTL_MAXLOGRECSZ);
***************
*** 2678,2685 ****     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; 
--- 2679,2684 ----
***************
*** 2689,2694 ****
--- 2688,2714 ----      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 */


pgsql-hackers by date:

Previous
From: Hans-Jürgen Schönig
Date:
Subject: DB2's row_number()
Next
From: Hannu Krosing
Date:
Subject: Re: postmaster startup failure