From b33a73226487ac1ea045c6e52b4a22d1451d0895 Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Tue, 18 Oct 2005 22:59:37 +0000 Subject: [PATCH] Improve trace_sort code to also show the total memory or disk space used. Per request from Marc. --- src/backend/utils/sort/logtape.c | 11 ++++++++++- src/backend/utils/sort/tuplesort.c | 31 ++++++++++++++++++++++++++---- src/include/utils/logtape.h | 3 ++- 3 files changed, 39 insertions(+), 6 deletions(-) diff --git a/src/backend/utils/sort/logtape.c b/src/backend/utils/sort/logtape.c index b8c760f482..fe1bab4932 100644 --- a/src/backend/utils/sort/logtape.c +++ b/src/backend/utils/sort/logtape.c @@ -64,7 +64,7 @@ * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/utils/sort/logtape.c,v 1.16 2005/10/15 02:49:37 momjian Exp $ + * $PostgreSQL: pgsql/src/backend/utils/sort/logtape.c,v 1.17 2005/10/18 22:59:37 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -925,3 +925,12 @@ LogicalTapeTell(LogicalTapeSet *lts, int tapenum, *blocknum = lt->curBlockNumber; *offset = lt->pos; } + +/* + * Obtain total disk space currently used by a LogicalTapeSet, in blocks. + */ +long +LogicalTapeSetBlocks(LogicalTapeSet *lts) +{ + return lts->nFileBlocks; +} diff --git a/src/backend/utils/sort/tuplesort.c b/src/backend/utils/sort/tuplesort.c index 2007d7a694..1a5f30099c 100644 --- a/src/backend/utils/sort/tuplesort.c +++ b/src/backend/utils/sort/tuplesort.c @@ -78,7 +78,7 @@ * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/utils/sort/tuplesort.c,v 1.52 2005/10/15 02:49:37 momjian Exp $ + * $PostgreSQL: pgsql/src/backend/utils/sort/tuplesort.c,v 1.53 2005/10/18 22:59:37 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -134,6 +134,7 @@ struct Tuplesortstate TupSortStatus status; /* enumerated value as shown above */ bool randomAccess; /* did caller request random access? */ long availMem; /* remaining memory available, in bytes */ + long allowedMem; /* total memory allowed, in bytes */ LogicalTapeSet *tapeset; /* logtape.c object for tapes in a temp file */ /* @@ -433,7 +434,8 @@ tuplesort_begin_common(int workMem, bool randomAccess) state->status = TSS_INITIAL; state->randomAccess = randomAccess; - state->availMem = workMem * 1024L; + state->allowedMem = workMem * 1024L; + state->availMem = state->allowedMem; state->tapeset = NULL; state->memtupcount = 0; @@ -582,9 +584,24 @@ void tuplesort_end(Tuplesortstate *state) { int i; +#ifdef TRACE_SORT + long spaceUsed; +#endif if (state->tapeset) + { +#ifdef TRACE_SORT + spaceUsed = LogicalTapeSetBlocks(state->tapeset); +#endif LogicalTapeSetClose(state->tapeset); + } + else + { +#ifdef TRACE_SORT + spaceUsed = (state->allowedMem - state->availMem + 1023) / 1024; +#endif + } + if (state->memtuples) { for (i = 0; i < state->memtupcount; i++) @@ -604,8 +621,14 @@ tuplesort_end(Tuplesortstate *state) #ifdef TRACE_SORT if (trace_sort) - elog(NOTICE, "sort ended: %s", - pg_rusage_show(&state->ru_start)); + { + if (state->tapeset) + elog(NOTICE, "external sort ended, %ld disk blocks used: %s", + spaceUsed, pg_rusage_show(&state->ru_start)); + else + elog(NOTICE, "internal sort ended, %ld KB used: %s", + spaceUsed, pg_rusage_show(&state->ru_start)); + } #endif pfree(state); diff --git a/src/include/utils/logtape.h b/src/include/utils/logtape.h index ffe6d6845a..4e20ba92a2 100644 --- a/src/include/utils/logtape.h +++ b/src/include/utils/logtape.h @@ -8,7 +8,7 @@ * Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * - * $PostgreSQL: pgsql/src/include/utils/logtape.h,v 1.12 2004/12/31 22:03:46 pgsql Exp $ + * $PostgreSQL: pgsql/src/include/utils/logtape.h,v 1.13 2005/10/18 22:59:37 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -38,5 +38,6 @@ extern bool LogicalTapeSeek(LogicalTapeSet *lts, int tapenum, long blocknum, int offset); extern void LogicalTapeTell(LogicalTapeSet *lts, int tapenum, long *blocknum, int *offset); +extern long LogicalTapeSetBlocks(LogicalTapeSet *lts); #endif /* LOGTAPE_H */