Re: postmaster startup failure
От | Tom Lane |
---|---|
Тема | Re: postmaster startup failure |
Дата | |
Msg-id | 4426.1058460573@sss.pgh.pa.us обсуждение исходный текст |
Ответ на | postmaster startup failure (Hannu Krosing <hannu@tm.ee>) |
Ответы |
Re: postmaster startup failure
(Hannu Krosing <hannu@tm.ee>)
|
Список | 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 по дате отправления: