Recompute allocChunkLimit when reusing an AllocSet context AllocSet contexts with different maxBlockSize values can have the same freeListIndex. When reusing a context from one of the context_freelists, we updated maxBlockSize, but we failed to adjust allocChunkLimit, even though that ordinarily depends on maxBlockSize. This could result in some allocations being put on an external block when they shouldn't have been, resulting in excessive malloc() calls, or if the allocChunkLimit was left set higher than it should be, allocations could have resulted in memory not being free()'d after pfree() due to the chunk having been put on a multi-chunk block (these would still later be cleaned up when the context is reset, so no memory leaks).
The repercussions of this are only inefficient use of memory and perhaps some performance instability depending on which context happened to be top of the freelist when a new AllocSet context was created. To fix, we move the allocChunkLimit calculation code into a helper function and call that to reset the allocChunkLimit when reusing a context. Author: Chao Li <[email protected]> Reviewed-by: Donghang Lin <[email protected]> Reviewed-by: David Rowley <[email protected]> Discussion: https://postgr.es/m/[email protected] Backpatch-through: 14 Branch ------ REL_16_STABLE Details ------- https://git.postgresql.org/pg/commitdiff/2b26e3622142d5693fd6bc8525dadfbd54367547 Modified Files -------------- src/backend/utils/mmgr/aset.c | 88 ++++++++++++++++++++++++++++--------------- 1 file changed, 57 insertions(+), 31 deletions(-)
