Re: Bug in MultiXact replay compat logic for older minor version after crash-recovery

From: Heikki Linnakangas <hlinnaka(at)iki(dot)fi>
To: Andrey Borodin <x4mmm(at)yandex-team(dot)ru>
Cc: 段坤仁(刻韧) <duankunren(dot)dkr(at)alibaba-inc(dot)com>, pgsql-hackers <pgsql-hackers(at)postgresql(dot)org>
Subject: Re: Bug in MultiXact replay compat logic for older minor version after crash-recovery
Date: 2026-03-20 13:19:32
Message-ID: 452355ef-7c20-4d96-88a2-8fbb49737dc9@iki.fi
Views: Whole Thread | Raw Message | Download mbox | Resend email
Thread:
Lists: pgsql-hackers

On 20/03/2026 13:55, Andrey Borodin wrote:
>> On 19 Mar 2026, at 23:11, Heikki Linnakangas <hlinnaka(at)iki(dot)fi> wrote:
>> I think a better fix is to accept that our tracking is a little
>> imprecise and use SimpleLruDoesPhysicalPageExist() to check if the
>> page exists. I suspect that's too expensive to do on every
>> RecordNewMultiXact() call that crosses a page, but perhaps we
>> could do it once at StartupMultiXact().
>>
>> Or perhaps track last-zeroed page separately from
>> latest_page_number, and if we haven't seen any
>> XLOG_MULTIXACT_ZERO_OFF_PAGE records yet after startup, call
>> SimpleLruDoesPhysicalPageExist() to determine if initialization is
>> needed. Attached patch does that.
>
> SimpleLruDoesPhysicalPageExist() does not detect recently zeroed
> pages via buffers, because it goes directly to FS. I tried this
> approach when implementing deadlock fix, it did not work for me.

Hmm, after startup, before we have zeroed any pages, it still works
though. So I think my patch works, but it means that tracking the latest
page we have zeroed is not merely an optimization to avoid excessive
SimpleLruDoesPhysicalPageExist() calls, it's needed for correctness.
Need to adjust the comments for that.

- Heikki

In response to

Responses

Browse pgsql-hackers by date

  From Date Subject
Next Message Amul Sul 2026-03-20 13:26:42 Re: pg_waldump: support decoding of WAL inside tarfile
Previous Message Álvaro Herrera 2026-03-20 13:19:30 Re: Resetting snapshots during the first phase of [CREATE |RE]INDEX CONCURRENTLY