On Tue, Jul 4, 2023 at 5:45 PM Japin Li <japi...@hotmail.com> wrote:
> > On Tue, 04 Jul 2023 at 17:00, jian he <jian.universal...@gmail.com> wrote: > > the following will also crash. no idea why. > > begin; > > select count(*) from onek; > > select relpages from pg_class where relname = 'onek'; --queryA > > > > SELECT count(*) FROM pg_buffercache WHERE relfilenode = > > pg_relation_filenode('onek'::regclass); --queryB > > > > insert into onek values(default); > > > > select count(pg_buffercache_invalidate(bufferid)) from > > pg_buffercache where relfilenode = > > pg_relation_filenode('onek'::regclass); > > > > --------------------------------- > > queryA returns 35, queryB returns 37. > > ---------------------------------- > > crash info: > > test_dev=*# insert into onek values(default); > > INSERT 0 1 > > test_dev=*# select count(pg_buffercache_invalidate(bufferid)) from > > pg_buffercache where relfilenode = > > pg_relation_filenode('onek'::regclass); > > TRAP: failed Assert("resarr->nitems < resarr->maxitems"), File: > > > "../../Desktop/pg_sources/main/postgres/src/backend/utils/resowner/resowner.c", > > Line: 275, PID: 1533312 > > According to the comments of ResourceArrayAdd(), the caller must have > previously > done ResourceArrayEnlarge(). I tried to call ResourceOwnerEnlargeBuffers() > before > PinBuffer_Locked(), so it can avoid this crash. > > if ((buf_state & BM_DIRTY) == BM_DIRTY) > { > + /* make sure we can handle the pin */ > + ResourceOwnerEnlargeBuffers(CurrentResourceOwner); > + > /* > * Try once to flush the dirty buffer. > */ > PinBuffer_Locked(bufHdr); > > -- > Regrads, > Japin Li. > thanks. tested flush pg_catalog, public schema, now, both works as pitched.