On Wed, 31 Aug 2022 at 02:17, Tom Lane <t...@sss.pgh.pa.us> wrote: > > I wrote: > > So maybe we should revisit the question. It'd be worth collecting some > > stats about how much extra space would be needed if we force there > > to be room for a sentinel. > > Actually, after ingesting more caffeine, the problem with this for aset.c > is that the only way to add space for a sentinel that didn't fit already > is to double the space allocation. That's a little daunting, especially > remembering how many places deliberately allocate power-of-2-sized > arrays.
I decided to try and quantify that by logging the size, MAXALIGN(size) and the power of 2 size during AllocSetAlloc and GenerationAlloc. I made the pow2_size 0 in GenerationAlloc and in AlloocSetAlloc when size > allocChunkLimit. After running make installcheck, grabbing the records out the log and loading them into Postgres, I see that if we did double the pow2_size when there's no space for the sentinel byte then we'd go from allocating a total of 10.2GB all the way to 16.4GB (!) of non-dedicated block aset.c allocations. select round(sum(pow2_Size)::numeric/1024/1024/1024,3) as pow2_size, round(sum(case when maxalign_size=pow2_size then pow2_size*2 else pow2_size end)::numeric/1024/1024/1024,3) as method1, round(sum(case when maxalign_size=pow2_size then pow2_size+8 else pow2_size end)::numeric/1024/1024/1024,3) as method2 from memstats where pow2_size > 0; pow2_size | method1 | method2 -----------+---------+--------- 10.194 | 16.382 | 10.463 if we did just add on an extra 8 bytes (or or MAXALIGN(size+1) at least), then that would take the size up to 10.5GB. David