Обсуждение: Be strict when request to flush past end of WAL in WaitXLogInsertionsToFinish
Be strict when request to flush past end of WAL in WaitXLogInsertionsToFinish
От
Bharath Rupireddy
Дата:
Hi, While working on [1], it was identified that WaitXLogInsertionsToFinish emits a LOG message, and adjusts the upto ptr to proceed further when caller requests to flush past the end of generated WAL. There's a comment explaining no caller should ever do that intentionally except in cases with bogus LSNs. For a similar situation, XLogWrite emits a PANIC "xlog write request %X/%X is past end of log %X/%X". Although there's no problem if WaitXLogInsertionsToFinish emits LOG, but why can't it be a bit more harsh and emit PANIC something like the attached to detect the corner case? Thoughts? [1] https://www.postgresql.org/message-id/b43615437ac7d7fdef86a36e5d5bf3fc049bc11b.camel%40j-davis.com On Thu, Feb 22, 2024 at 1:54 AM Jeff Davis <pgsql@j-davis.com> wrote: > > WaitXLogInsertionsToFinish() uses a LOG level message > for the same situation. They should probably be the same log level, and > I would think it would be either PANIC or WARNING. I have no idea why > LOG was chosen. [2] /* * No-one should request to flush a piece of WAL that hasn't even been * reserved yet. However, it can happen if there is a block with a bogus * LSN on disk, for example. XLogFlush checks for that situation and * complains, but only after the flush. Here we just assume that to mean * that all WAL that has been reserved needs to be finished. In this * corner-case, the return value can be smaller than 'upto' argument. */ if (upto > reservedUpto) { ereport(LOG, (errmsg("request to flush past end of generated WAL; request %X/%X, current position %X/%X", LSN_FORMAT_ARGS(upto), LSN_FORMAT_ARGS(reservedUpto)))); upto = reservedUpto; } -- Bharath Rupireddy PostgreSQL Contributors Team RDS Open Source Databases Amazon Web Services: https://aws.amazon.com
Вложения
On Fri, 2024-03-15 at 13:12 +0530, Bharath Rupireddy wrote:
> Hi,
>
> While working on [1], it was identified that
> WaitXLogInsertionsToFinish emits a LOG message, and adjusts the upto
> ptr to proceed further when caller requests to flush past the end of
> generated WAL. There's a comment explaining no caller should ever do
> that intentionally except in cases with bogus LSNs. For a similar
> situation, XLogWrite emits a PANIC "xlog write request %X/%X is past
> end of log %X/%X". Although there's no problem if
> WaitXLogInsertionsToFinish emits LOG, but why can't it be a bit more
> harsh and emit PANIC something like the attached to detect the corner
> case?
>
> Thoughts?
I'm not clear on why the callers of WaitXLogInsertionsToFinish() are
handling errors the way they are. XLogWrite PANICs, XLogFlush ERRORs
(which is likely to be escalated to a PANIC anyway), and the other
callers ignore the return value and leave it up to XLogWrite() to
PANIC.
As far as I can tell, once WaitXLogInsertionsToFinish() detects this
bogus LSN, a PANIC is a likely outcome, so your proposed change makes
sense. But then why are the callers also checking?
I haven't looked in a lot of detail.
Regards,
Jeff Davis