mirror of
https://github.com/postgres/postgres.git
synced 2025-07-07 00:36:50 +03:00
Permit super-MaxAllocSize allocations with MemoryContextAllocHuge().
The MaxAllocSize guard is convenient for most callers, because it reduces the need for careful attention to overflow, data type selection, and the SET_VARSIZE() limit. A handful of callers are happy to navigate those hazards in exchange for the ability to allocate a larger chunk. Introduce MemoryContextAllocHuge() and repalloc_huge(). Use this in tuplesort.c and tuplestore.c, enabling internal sorts of up to INT_MAX tuples, a factor-of-48 increase. In particular, B-tree index builds can now benefit from much-larger maintenance_work_mem settings. Reviewed by Stephen Frost, Simon Riggs and Jeff Janes.
This commit is contained in:
@ -21,26 +21,30 @@
|
||||
|
||||
|
||||
/*
|
||||
* MaxAllocSize
|
||||
* Quasi-arbitrary limit on size of allocations.
|
||||
* MaxAllocSize, MaxAllocHugeSize
|
||||
* Quasi-arbitrary limits on size of allocations.
|
||||
*
|
||||
* Note:
|
||||
* There is no guarantee that allocations smaller than MaxAllocSize
|
||||
* will succeed. Allocation requests larger than MaxAllocSize will
|
||||
* be summarily denied.
|
||||
* There is no guarantee that smaller allocations will succeed, but
|
||||
* larger requests will be summarily denied.
|
||||
*
|
||||
* XXX This is deliberately chosen to correspond to the limiting size
|
||||
* of varlena objects under TOAST. See VARSIZE_4B() and related macros
|
||||
* in postgres.h. Many datatypes assume that any allocatable size can
|
||||
* be represented in a varlena header.
|
||||
*
|
||||
* XXX Also, various places in aset.c assume they can compute twice an
|
||||
* allocation's size without overflow, so beware of raising this.
|
||||
* palloc() enforces MaxAllocSize, chosen to correspond to the limiting size
|
||||
* of varlena objects under TOAST. See VARSIZE_4B() and related macros in
|
||||
* postgres.h. Many datatypes assume that any allocatable size can be
|
||||
* represented in a varlena header. This limit also permits a caller to use
|
||||
* an "int" variable for an index into or length of an allocation. Callers
|
||||
* careful to avoid these hazards can access the higher limit with
|
||||
* MemoryContextAllocHuge(). Both limits permit code to assume that it may
|
||||
* compute twice an allocation's size without overflow.
|
||||
*/
|
||||
#define MaxAllocSize ((Size) 0x3fffffff) /* 1 gigabyte - 1 */
|
||||
|
||||
#define AllocSizeIsValid(size) ((Size) (size) <= MaxAllocSize)
|
||||
|
||||
#define MaxAllocHugeSize ((Size) -1 >> 1) /* SIZE_MAX / 2 */
|
||||
|
||||
#define AllocHugeSizeIsValid(size) ((Size) (size) <= MaxAllocHugeSize)
|
||||
|
||||
/*
|
||||
* All chunks allocated by any memory context manager are required to be
|
||||
* preceded by a StandardChunkHeader at a spacing of STANDARDCHUNKHEADERSIZE.
|
||||
|
Reference in New Issue
Block a user