Hannu Krosing <[EMAIL PROTECTED]> 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 */

---------------------------(end of broadcast)---------------------------
TIP 3: if posting/reading through Usenet, please send an appropriate
      subscribe-nomail command to [EMAIL PROTECTED] so that your
      message can get through to the mailing list cleanly

Reply via email to