From be8a4318815640ff57afc775f118367c9a1241a8 Mon Sep 17 00:00:00 2001
From: Bruce Momjian <bruce@momjian.us>
Date: Tue, 9 Jan 2007 21:31:17 +0000
Subject: [PATCH] Add GUC log_temp_files to log the use of temporary files.

Bill Moran
---
 doc/src/sgml/config.sgml                      | 19 ++++++++++++++++++-
 src/backend/storage/file/fd.c                 | 19 +++++++++++++++++--
 src/backend/utils/misc/guc.c                  | 13 ++++++++++++-
 src/backend/utils/misc/postgresql.conf.sample |  3 +++
 src/include/utils/guc.h                       |  3 ++-
 5 files changed, 52 insertions(+), 5 deletions(-)

diff --git a/doc/src/sgml/config.sgml b/doc/src/sgml/config.sgml
index 7c02d90f2e..068a85f27b 100644
--- a/doc/src/sgml/config.sgml
+++ b/doc/src/sgml/config.sgml
@@ -1,4 +1,4 @@
-<!-- $PostgreSQL: pgsql/doc/src/sgml/config.sgml,v 1.99 2006/12/12 21:30:33 momjian Exp $ -->
+<!-- $PostgreSQL: pgsql/doc/src/sgml/config.sgml,v 1.100 2007/01/09 21:31:14 momjian Exp $ -->
 
 <chapter Id="runtime-config">
   <title>Server Configuration</title>
@@ -2920,6 +2920,23 @@ SELECT * FROM parent WHERE key = 2400;
       </listitem>
      </varlistentry>
 
+     <varlistentry id="guc-log-temp-files" xreflabel="log_temp_files">
+      <term><varname>log_temp_files</varname> (<type>integer</type>)</term>
+      <indexterm>
+       <primary><varname>log_temp_files</> configuration parameter</primary>
+      </indexterm>
+      <listitem>
+       <para>
+        Controls whether temporary files are logged when deleted.
+        A value of zero logs all temporary files, and positive
+        values log only files whose size is equal or greater than
+        the specified number of bytes.  Temporary files can be
+        created for sorts, hashes, and temporary results.  The
+        default is <literal>-1</> (off).
+       </para>
+      </listitem>
+     </varlistentry>
+
      </variablelist>
     </sect2>
    </sect1>
diff --git a/src/backend/storage/file/fd.c b/src/backend/storage/file/fd.c
index 693c2e8014..a485189f1e 100644
--- a/src/backend/storage/file/fd.c
+++ b/src/backend/storage/file/fd.c
@@ -7,7 +7,7 @@
  * Portions Copyright (c) 1994, Regents of the University of California
  *
  * IDENTIFICATION
- *	  $PostgreSQL: pgsql/src/backend/storage/file/fd.c,v 1.132 2007/01/05 22:19:37 momjian Exp $
+ *	  $PostgreSQL: pgsql/src/backend/storage/file/fd.c,v 1.133 2007/01/09 21:31:14 momjian Exp $
  *
  * NOTES:
  *
@@ -50,6 +50,7 @@
 #include "access/xact.h"
 #include "storage/fd.h"
 #include "storage/ipc.h"
+#include "utils/guc.h"
 
 
 /*
@@ -938,7 +939,8 @@ OpenTemporaryFile(bool interXact)
 void
 FileClose(File file)
 {
-	Vfd		   *vfdP;
+	Vfd			*vfdP;
+	struct stat	filestats;
 
 	Assert(FileIsValid(file));
 
@@ -968,6 +970,19 @@ FileClose(File file)
 	{
 		/* reset flag so that die() interrupt won't cause problems */
 		vfdP->fdstate &= ~FD_TEMPORARY;
+		PG_TRACE1(temp__file__cleanup, vfdP->fileName);
+		if (log_temp_files >= 0)
+		{
+			if (stat(vfdP->fileName, &filestats) == 0)
+			{
+				if (filestats.st_size >= log_temp_files)
+					ereport(LOG,
+						(errmsg("temp file: path \"%s\" size %lu",
+						 vfdP->fileName, (unsigned long)filestats.st_size)));
+			}
+			else
+				elog(LOG, "Could not stat \"%s\": %m", vfdP->fileName);
+		}
 		if (unlink(vfdP->fileName))
 			elog(LOG, "failed to unlink \"%s\": %m",
 				 vfdP->fileName);
diff --git a/src/backend/utils/misc/guc.c b/src/backend/utils/misc/guc.c
index e2ad24f7f4..4d4ef07d2c 100644
--- a/src/backend/utils/misc/guc.c
+++ b/src/backend/utils/misc/guc.c
@@ -10,7 +10,7 @@
  * Written by Peter Eisentraut <peter_e@gmx.net>.
  *
  * IDENTIFICATION
- *	  $PostgreSQL: pgsql/src/backend/utils/misc/guc.c,v 1.365 2007/01/05 22:19:46 momjian Exp $
+ *	  $PostgreSQL: pgsql/src/backend/utils/misc/guc.c,v 1.366 2007/01/09 21:31:14 momjian Exp $
  *
  *--------------------------------------------------------------------
  */
@@ -182,6 +182,7 @@ int			log_min_error_statement = ERROR;
 int			log_min_messages = NOTICE;
 int			client_min_messages = NOTICE;
 int			log_min_duration_statement = -1;
+int			log_temp_files = -1;
 
 int			num_temp_buffers = 1000;
 
@@ -1660,6 +1661,16 @@ static struct config_int ConfigureNamesInt[] =
 		&server_version_num,
 		PG_VERSION_NUM, PG_VERSION_NUM, PG_VERSION_NUM, NULL, NULL
 	},
+				
+	{
+		{"log_temp_files", PGC_USERSET, LOGGING_WHAT,
+			gettext_noop("Log the use of temporary files larger than this size."),
+			gettext_noop("Zero logs all files. The default is -1 (turning this feature off)."),
+			NULL
+		},
+		&log_temp_files,
+		-1, -1, INT_MAX, NULL, NULL
+	},
 
 	/* End-of-list marker */
 	{
diff --git a/src/backend/utils/misc/postgresql.conf.sample b/src/backend/utils/misc/postgresql.conf.sample
index 196cae54a3..989126477d 100644
--- a/src/backend/utils/misc/postgresql.conf.sample
+++ b/src/backend/utils/misc/postgresql.conf.sample
@@ -333,6 +333,9 @@
 #log_statement = 'none'			# none, ddl, mod, all
 #log_hostname = off
 
+#log_temp_files = -1			# Log temporary files equal or larger
+					# than the specified number of bytes.  
+					# -1 disables;  0 logs all temp files
 
 #---------------------------------------------------------------------------
 # RUNTIME STATISTICS
diff --git a/src/include/utils/guc.h b/src/include/utils/guc.h
index e1fc64e868..d324d66c22 100644
--- a/src/include/utils/guc.h
+++ b/src/include/utils/guc.h
@@ -7,7 +7,7 @@
  * Copyright (c) 2000-2007, PostgreSQL Global Development Group
  * Written by Peter Eisentraut <peter_e@gmx.net>.
  *
- * $PostgreSQL: pgsql/src/include/utils/guc.h,v 1.77 2007/01/05 22:19:59 momjian Exp $
+ * $PostgreSQL: pgsql/src/include/utils/guc.h,v 1.78 2007/01/09 21:31:17 momjian Exp $
  *--------------------------------------------------------------------
  */
 #ifndef GUC_H
@@ -123,6 +123,7 @@ extern int	log_min_error_statement;
 extern int	log_min_messages;
 extern int	client_min_messages;
 extern int	log_min_duration_statement;
+extern int	log_temp_files;
 
 extern int	num_temp_buffers;
 
-- 
2.40.0