On Thu, 31 Jul 2025 at 11:29, Andrey Borodin <x4...@yandex-team.ru> wrote: > > > > > On 29 Jul 2025, at 23:15, Andrey Borodin <x4...@yandex-team.ru> wrote: > > > > I do not understand it yet. > > OK, I figured it out. SimpleLruDoesPhysicalPageExist() was reading a physical > file and could race with real extension by ExtendMultiXactOffset(). > So I used ExtendMultiXactOffset(actual + 1). I hope this does not open a loop > for wraparound... > > Here's an updated two patches, one for Postgres 17 and one for mater(with a > test).
Hi! + /* + * We might have filled this offset previosuly. + * Cross-check for correctness. + */ + Assert((*offptr == 0) || (*offptr == offset)); Should we exit here with errcode(ERRCODE_DATA_CORRUPTED) if *offptr != 0 and *offptr != offset? + /* Read and adjust next page */ + next_slotno = SimpleLruReadPage(MultiXactOffsetCtl, next_pageno, true, next); + next_offptr = (MultiXactOffset *) MultiXactOffsetCtl->shared->page_buffer[next_slotno]; + next_offptr[next_entryno] = offset + nmembers; should we check the value of next_offptr[next_entryno] to be equal to zero or offset + nmembers ? Assert or errcode(ERRCODE_DATA_CORRUPTED) also. -- Best regards, Kirill Reshke