Re: Hot standby 9.2.6 -> 9.2.6 PANIC: WAL contains references to invalid pages

Поиск
Список
Период
Сортировка
От Tom Lane
Тема Re: Hot standby 9.2.6 -> 9.2.6 PANIC: WAL contains references to invalid pages
Дата
Msg-id 26165.1389664788@sss.pgh.pa.us
обсуждение исходный текст
Ответ на Re: Hot standby 9.2.6 -> 9.2.6 PANIC: WAL contains references to invalid pages  (Andres Freund <andres@2ndquadrant.com>)
Ответы Re: Hot standby 9.2.6 -> 9.2.6 PANIC: WAL contains references to invalid pages  (Heikki Linnakangas <hlinnakangas@vmware.com>)
Список pgsql-bugs
BTW, while I'm looking at this ... the writing side of the code seems a
few bricks shy of a load too:

    /*
     * InHotStandby we need to scan right up to the end of the index for
     * correct locking, so we may need to write a WAL record for the final
     * block in the index if it was not vacuumed. It's possible that VACUUMing
     * has actually removed zeroed pages at the end of the index so we need to
     * take care to issue the record for last actual block and not for the
     * last block that was scanned. Ignore empty indexes.
     */
    if (XLogStandbyInfoActive() &&
        num_pages > 1 && vstate.lastBlockVacuumed < (num_pages - 1))
    {
        Buffer        buf;

        /*
         * We can't use _bt_getbuf() here because it always applies
         * _bt_checkpage(), which will barf on an all-zero page. We want to
         * recycle all-zero pages, not fail.  Also, we want to use a
         * nondefault buffer access strategy.
         */
        buf = ReadBufferExtended(rel, MAIN_FORKNUM, num_pages - 1, RBM_NORMAL,
                                 info->strategy);
        LockBufferForCleanup(buf);
        _bt_delitems_vacuum(rel, buf, NULL, 0, vstate.lastBlockVacuumed);
        _bt_relbuf(rel, buf);
    }

If the last physical page of the index is all-zero, the preceding loop
won't have any problem with that (nor should it); but this code sure will
have a problem, because _bt_delitems_vacuum isn't prepared to cope with an
all-zero page AFAICS.

Nor am I following the logic of the initial comment.  If we know that
pages above N are all-zero, why are we worried about taking locks on them?
There shouldn't be any scans reaching such pages, and any that did would
error out anyhow in _bt_getbuf().

ISTM the right thing here is for the btvacuumpage loop to remember the
last ordinary, valid index page it saw, and point to that one in this
added WAL entry.

            regards, tom lane

В списке pgsql-bugs по дате отправления:

Предыдущее
От: Andres Freund
Дата:
Сообщение: Re: Hot standby 9.2.6 -> 9.2.6 PANIC: WAL contains references to invalid pages
Следующее
От: Jeevan Chalke
Дата:
Сообщение: Re: surprising to_timestamp behavior