Re: postmaster startup failure

From: Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us>
To: Hannu Krosing <hannu(at)tm(dot)ee>
Cc: "pgsql-hackers(at)postgresql(dot)org" <pgsql-hackers(at)postgresql(dot)org>
Subject: Re: postmaster startup failure
Date: 2003-07-17 16:49:33
Message-ID: 4426.1058460573@sss.pgh.pa.us
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-hackers

Hannu Krosing <hannu(at)tm(dot)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 */

In response to

Responses

Browse pgsql-hackers by date

  From Date Subject
Next Message Hannu Krosing 2003-07-17 18:04:24 Re: postmaster startup failure
Previous Message Hans-Jürgen Schönig 2003-07-17 15:03:03 DB2's row_number()