Tom Lane wrote:
> Alvaro Herrera <[EMAIL PROTECTED]> writes:
> > Ah -- like this?
> 
> +1, but there are two kinds of temp files in that module, and only
> one of them is relevant here.  Call it something like
> have_xact_temporary_files to make things clearer.

Ok, so that's what I called it.

Simon wrote:

> if test should include
>         || isProcExit
> 
> so you don't skip non-transactional temp files at proc exit when there
> weren't any created in the last transaction.

Yep, I noticed that too.  Thanks.

Should I backpatch this to 8.3?

-- 
Alvaro Herrera                                http://www.CommandPrompt.com/
PostgreSQL Replication, Consulting, Custom Development, 24x7 support
Index: src/backend/storage/file/fd.c
===================================================================
RCS file: /home/alvherre/Code/cvs/pgsql/src/backend/storage/file/fd.c,v
retrieving revision 1.143
diff -c -p -r1.143 fd.c
*** src/backend/storage/file/fd.c	1 Jan 2008 19:45:51 -0000	1.143
--- src/backend/storage/file/fd.c	17 Sep 2008 22:58:32 -0000
*************** static int	max_safe_fds = 32;	/* default
*** 121,126 ****
--- 121,132 ----
  #define FD_TEMPORARY		(1 << 0)	/* T = delete when closed */
  #define FD_XACT_TEMPORARY	(1 << 1)	/* T = delete at eoXact */
  
+ /*
+  * Flag to tell whether it's worth scanning VfdCache looking for temp files to
+  * close
+  */
+ static bool		have_xact_temporary_files = false;
+ 
  typedef struct vfd
  {
  	signed short fd;			/* current FD, or VFD_CLOSED if none */
*************** OpenTemporaryFile(bool interXact)
*** 889,894 ****
--- 895,903 ----
  	{
  		VfdCache[file].fdstate |= FD_XACT_TEMPORARY;
  		VfdCache[file].create_subid = GetCurrentSubTransactionId();
+ 
+ 		/* ensure cleanup happens at eoxact */
+ 		have_xact_temporary_files = true;
  	}
  
  	return file;
*************** AtEOSubXact_Files(bool isCommit, SubTran
*** 1603,1609 ****
  {
  	Index		i;
  
! 	if (SizeVfdCache > 0)
  	{
  		Assert(FileIsNotOpen(0));		/* Make sure ring not corrupted */
  		for (i = 1; i < SizeVfdCache; i++)
--- 1612,1618 ----
  {
  	Index		i;
  
! 	if (have_xact_temporary_files)
  	{
  		Assert(FileIsNotOpen(0));		/* Make sure ring not corrupted */
  		for (i = 1; i < SizeVfdCache; i++)
*************** CleanupTempFiles(bool isProcExit)
*** 1679,1685 ****
  {
  	Index		i;
  
! 	if (SizeVfdCache > 0)
  	{
  		Assert(FileIsNotOpen(0));		/* Make sure ring not corrupted */
  		for (i = 1; i < SizeVfdCache; i++)
--- 1688,1698 ----
  {
  	Index		i;
  
! 	/*
! 	 * Careful here: at proc_exit we need extra cleanup, not just
! 	 * xact_temporary files.
! 	 */
! 	if (isProcExit || have_xact_temporary_files)
  	{
  		Assert(FileIsNotOpen(0));		/* Make sure ring not corrupted */
  		for (i = 1; i < SizeVfdCache; i++)
*************** CleanupTempFiles(bool isProcExit)
*** 1697,1702 ****
--- 1710,1717 ----
  					FileClose(i);
  			}
  		}
+ 
+ 		have_xact_temporary_files = false;
  	}
  
  	while (numAllocatedDescs > 0)
-- 
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

Reply via email to