commit 2d7524e2fa2810fee5c63cb84cae70b8317bf1d5
Author: Heikki Linnakangas <heikki.linnakangas@iki.fi>
Date:   Fri Sep 9 14:08:29 2016 +0300

    temp file access tracing

diff --git a/src/backend/utils/sort/logtape.c b/src/backend/utils/sort/logtape.c
index 05d7697..cededac 100644
--- a/src/backend/utils/sort/logtape.c
+++ b/src/backend/utils/sort/logtape.c
@@ -77,8 +77,20 @@
 
 #include "postgres.h"
 
+/* #define TRACE_BUFFER_WRITES */
+#define TRACE_BUFFER_READS
+
+#if defined(TRACE_BUFFER_WRITES) || defined(TRACE_BUFFER_READS)
+#define TRACE_BUFFER_ACCESS
+#endif
+
+
 #include "storage/buffile.h"
 #include "utils/logtape.h"
+#ifdef TRACE_BUFFER_ACCESS
+#include "storage/fd.h"
+#include "tcop/tcopprot.h"
+#endif
 
 /*
  * Block indexes are "long"s, so we can fit this many per indirect block.
@@ -169,6 +181,10 @@ struct LogicalTapeSet
 	int			nFreeBlocks;	/* # of currently free blocks */
 	int			freeBlocksLen;	/* current allocated length of freeBlocks[] */
 
+#ifdef TRACE_BUFFER_ACCESS
+	FILE *tracefile;
+#endif
+
 	/* The array of logical tapes. */
 	int			nTapes;			/* # of logical tapes in set */
 	LogicalTape tapes[FLEXIBLE_ARRAY_MEMBER];	/* has nTapes nentries */
@@ -211,6 +227,9 @@ ltsWriteBlock(LogicalTapeSet *lts, long blocknum, void *buffer)
 				(errcode_for_file_access(),
 				 errmsg("could not write block %ld of temporary file: %m",
 						blocknum)));
+#ifdef TRACE_BUFFER_WRITES
+	fprintf(lts->tracefile, "1 %ld\n", blocknum);
+#endif
 }
 
 /*
@@ -228,6 +247,10 @@ ltsReadBlock(LogicalTapeSet *lts, long blocknum, void *buffer)
 				(errcode_for_file_access(),
 				 errmsg("could not read block %ld of temporary file: %m",
 						blocknum)));
+
+#ifdef TRACE_BUFFER_READS
+	fprintf(lts->tracefile, "0 %ld\n", blocknum);
+#endif
 }
 
 /*
@@ -602,6 +625,16 @@ LogicalTapeSetCreate(int ntapes)
 		lt->pos = 0;
 		lt->nbytes = 0;
 	}
+
+#ifdef TRACE_BUFFER_ACCESS
+	lts->tracefile = AllocateFile("logtape-trace", "w+");
+	if (lts->tracefile == NULL)
+		elog(ERROR, "could not open file \"logtape-trace\": %m");
+
+	fprintf(lts->tracefile, "# LogTapeSet with %d tapes allocated\n", ntapes);
+	fprintf(lts->tracefile, "# Query: %s\n", debug_query_string);
+#endif
+
 	return lts;
 }
 
@@ -630,6 +663,10 @@ LogicalTapeSetClose(LogicalTapeSet *lts)
 	}
 	pfree(lts->freeBlocks);
 	pfree(lts);
+
+#ifdef TRACE_BUFFER_ACCESS
+	(void) FreeFile(lts->tracefile);
+#endif
 }
 
 /*
