Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit79e0f87

Browse files
committed
Use type "int64" for memory accounting in tuplesort.c/tuplestore.c.
Commit263865a switched tuplesort.c andtuplestore.c variables representing memory usage from type "long" totype "Size". This was unnecessary; I thought doing so avoided overflowscenarios on 64-bit Windows, but guc.c already limited work_mem so as toprevent the overflow. It was also incomplete, not touching the logicthat assumed a signed data type. Change the affected variables to"int64". This is perfect for 64-bit platforms, and it reduces the needto contemplate platform-specific overflow scenarios. It also puts usclose to being able to support work_mem over 2 GiB on 64-bit Windows.Per report from Andres Freund.
1 parent7842d41 commit79e0f87

File tree

3 files changed

+25
-21
lines changed

3 files changed

+25
-21
lines changed

‎src/backend/utils/sort/tuplesort.c

Lines changed: 16 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -211,8 +211,8 @@ struct Tuplesortstate
211211
* tuples to return? */
212212
boolboundUsed;/* true if we made use of a bounded heap */
213213
intbound;/* if bounded, the maximum number of tuples */
214-
SizeavailMem;/* remaining memory available, in bytes */
215-
SizeallowedMem;/* total memory allowed, in bytes */
214+
int64availMem;/* remaining memory available, in bytes */
215+
int64allowedMem;/* total memory allowed, in bytes */
216216
intmaxTapes;/* number of tapes (Knuth's T) */
217217
inttapeRange;/* maxTapes-1 (Knuth's P) */
218218
MemoryContextsortcontext;/* memory context holding all sort data */
@@ -308,7 +308,7 @@ struct Tuplesortstate
308308
int*mergenext;/* first preread tuple for each source */
309309
int*mergelast;/* last preread tuple for each source */
310310
int*mergeavailslots;/* slots left for prereading each tape */
311-
Size*mergeavailmem;/* availMem for prereading each tape */
311+
int64*mergeavailmem;/* availMem for prereading each tape */
312312
intmergefreelist;/* head of freelist of recycled slots */
313313
intmergefirstfree;/* first slot never used in this merge */
314314

@@ -565,7 +565,7 @@ tuplesort_begin_common(int workMem, bool randomAccess)
565565
state->randomAccess=randomAccess;
566566
state->bounded= false;
567567
state->boundUsed= false;
568-
state->allowedMem=workMem*1024L;
568+
state->allowedMem=workMem*(int64)1024;
569569
state->availMem=state->allowedMem;
570570
state->sortcontext=sortcontext;
571571
state->tapeset=NULL;
@@ -980,7 +980,7 @@ grow_memtuples(Tuplesortstate *state)
980980
{
981981
intnewmemtupsize;
982982
intmemtupsize=state->memtupsize;
983-
SizememNowUsed=state->allowedMem-state->availMem;
983+
int64memNowUsed=state->allowedMem-state->availMem;
984984

985985
/* Forget it if we've already maxed out memtuples, per comment above */
986986
if (!state->growmemtuples)
@@ -991,7 +991,7 @@ grow_memtuples(Tuplesortstate *state)
991991
{
992992
/*
993993
* We've used no more than half of allowedMem; double our usage,
994-
* clamping at INT_MAX.
994+
* clamping at INT_MAX tuples.
995995
*/
996996
if (memtupsize<INT_MAX /2)
997997
newmemtupsize=memtupsize*2;
@@ -1048,7 +1048,9 @@ grow_memtuples(Tuplesortstate *state)
10481048
/*
10491049
* On a 32-bit machine, allowedMem could exceed MaxAllocHugeSize. Clamp
10501050
* to ensure our request won't be rejected. Note that we can easily
1051-
* exhaust address space before facing this outcome.
1051+
* exhaust address space before facing this outcome. (This is presently
1052+
* impossible due to guc.c's MAX_KILOBYTES limitation on work_mem, but
1053+
* don't rely on that at this distance.)
10521054
*/
10531055
if ((Size)newmemtupsize >=MaxAllocHugeSize /sizeof(SortTuple))
10541056
{
@@ -1067,7 +1069,7 @@ grow_memtuples(Tuplesortstate *state)
10671069
* palloc would be treating both old and new arrays as separate chunks.
10681070
* But we'll check LACKMEM explicitly below just in case.)
10691071
*/
1070-
if (state->availMem< (Size) ((newmemtupsize-memtupsize)*sizeof(SortTuple)))
1072+
if (state->availMem< (int64) ((newmemtupsize-memtupsize)*sizeof(SortTuple)))
10711073
gotonoalloc;
10721074

10731075
/* OK, do it */
@@ -1722,7 +1724,7 @@ tuplesort_getdatum(Tuplesortstate *state, bool forward,
17221724
* This is exported for use by the planner. allowedMem is in bytes.
17231725
*/
17241726
int
1725-
tuplesort_merge_order(SizeallowedMem)
1727+
tuplesort_merge_order(int64allowedMem)
17261728
{
17271729
intmOrder;
17281730

@@ -1756,7 +1758,7 @@ inittapes(Tuplesortstate *state)
17561758
intmaxTapes,
17571759
ntuples,
17581760
j;
1759-
SizetapeSpace;
1761+
int64tapeSpace;
17601762

17611763
/* Compute number of tapes to use: merge order plus 1 */
17621764
maxTapes=tuplesort_merge_order(state->allowedMem)+1;
@@ -1805,7 +1807,7 @@ inittapes(Tuplesortstate *state)
18051807
state->mergenext= (int*)palloc0(maxTapes*sizeof(int));
18061808
state->mergelast= (int*)palloc0(maxTapes*sizeof(int));
18071809
state->mergeavailslots= (int*)palloc0(maxTapes*sizeof(int));
1808-
state->mergeavailmem= (Size*)palloc0(maxTapes*sizeof(Size));
1810+
state->mergeavailmem= (int64*)palloc0(maxTapes*sizeof(int64));
18091811
state->tp_fib= (int*)palloc0(maxTapes*sizeof(int));
18101812
state->tp_runs= (int*)palloc0(maxTapes*sizeof(int));
18111813
state->tp_dummy= (int*)palloc0(maxTapes*sizeof(int));
@@ -2033,7 +2035,7 @@ mergeonerun(Tuplesortstate *state)
20332035
intsrcTape;
20342036
inttupIndex;
20352037
SortTuple*tup;
2036-
SizepriorAvail,
2038+
int64priorAvail,
20372039
spaceFreed;
20382040

20392041
/*
@@ -2107,7 +2109,7 @@ beginmerge(Tuplesortstate *state)
21072109
inttapenum;
21082110
intsrcTape;
21092111
intslotsPerTape;
2110-
SizespacePerTape;
2112+
int64spacePerTape;
21112113

21122114
/* Heap should be empty here */
21132115
Assert(state->memtupcount==0);
@@ -2228,7 +2230,7 @@ mergeprereadone(Tuplesortstate *state, int srcTape)
22282230
unsignedinttuplen;
22292231
SortTuplestup;
22302232
inttupIndex;
2231-
SizepriorAvail,
2233+
int64priorAvail,
22322234
spaceUsed;
22332235

22342236
if (!state->mergeactive[srcTape])

‎src/backend/utils/sort/tuplestore.c

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -104,8 +104,8 @@ struct Tuplestorestate
104104
boolbackward;/* store extra length words in file? */
105105
boolinterXact;/* keep open through transactions? */
106106
booltruncated;/* tuplestore_trim has removed tuples? */
107-
SizeavailMem;/* remaining memory available, in bytes */
108-
SizeallowedMem;/* total memory allowed, in bytes */
107+
int64availMem;/* remaining memory available, in bytes */
108+
int64allowedMem;/* total memory allowed, in bytes */
109109
BufFile*myfile;/* underlying file, or NULL if none */
110110
MemoryContextcontext;/* memory context for holding tuples */
111111
ResourceOwnerresowner;/* resowner for holding temp files */
@@ -550,7 +550,7 @@ grow_memtuples(Tuplestorestate *state)
550550
{
551551
intnewmemtupsize;
552552
intmemtupsize=state->memtupsize;
553-
SizememNowUsed=state->allowedMem-state->availMem;
553+
int64memNowUsed=state->allowedMem-state->availMem;
554554

555555
/* Forget it if we've already maxed out memtuples, per comment above */
556556
if (!state->growmemtuples)
@@ -561,7 +561,7 @@ grow_memtuples(Tuplestorestate *state)
561561
{
562562
/*
563563
* We've used no more than half of allowedMem; double our usage,
564-
* clamping at INT_MAX.
564+
* clamping at INT_MAX tuples.
565565
*/
566566
if (memtupsize<INT_MAX /2)
567567
newmemtupsize=memtupsize*2;
@@ -618,7 +618,9 @@ grow_memtuples(Tuplestorestate *state)
618618
/*
619619
* On a 32-bit machine, allowedMem could exceed MaxAllocHugeSize. Clamp
620620
* to ensure our request won't be rejected. Note that we can easily
621-
* exhaust address space before facing this outcome.
621+
* exhaust address space before facing this outcome. (This is presently
622+
* impossible due to guc.c's MAX_KILOBYTES limitation on work_mem, but
623+
* don't rely on that at this distance.)
622624
*/
623625
if ((Size)newmemtupsize >=MaxAllocHugeSize /sizeof(void*))
624626
{
@@ -637,7 +639,7 @@ grow_memtuples(Tuplestorestate *state)
637639
* palloc would be treating both old and new arrays as separate chunks.
638640
* But we'll check LACKMEM explicitly below just in case.)
639641
*/
640-
if (state->availMem< (Size) ((newmemtupsize-memtupsize)*sizeof(void*)))
642+
if (state->availMem< (int64) ((newmemtupsize-memtupsize)*sizeof(void*)))
641643
gotonoalloc;
642644

643645
/* OK, do it */

‎src/include/utils/tuplesort.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,7 @@ extern void tuplesort_get_stats(Tuplesortstate *state,
106106
constchar**spaceType,
107107
long*spaceUsed);
108108

109-
externinttuplesort_merge_order(SizeallowedMem);
109+
externinttuplesort_merge_order(int64allowedMem);
110110

111111
/*
112112
* These routines may only be called if randomAccess was specified 'true'.

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp