summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Lane2005-10-18 22:59:37 +0000
committerTom Lane2005-10-18 22:59:37 +0000
commitb33a73226487ac1ea045c6e52b4a22d1451d0895 (patch)
tree7208b9da94290510647cc2f890dfdc840625e71f
parent48f3d7785821c4464d10f6f802129d6eaa817a7e (diff)
Improve trace_sort code to also show the total memory or disk space used.
Per request from Marc.
-rw-r--r--src/backend/utils/sort/logtape.c11
-rw-r--r--src/backend/utils/sort/tuplesort.c31
-rw-r--r--src/include/utils/logtape.h3
3 files changed, 39 insertions, 6 deletions
diff --git a/src/backend/utils/sort/logtape.c b/src/backend/utils/sort/logtape.c
index b8c760f4823..fe1bab4932f 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 2007d7a6949..1a5f30099c2 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 ffe6d6845aa..4e20ba92a2b 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 */