Re: Postmaster holding unlinked files for pg_largeobject table - Mailing list pgsql-hackers

From Alvaro Herrera
Subject Re: Postmaster holding unlinked files for pg_largeobject table
Date
Msg-id 1307652727-sup-4445@alvh.no-ip.org
Whole thread Raw
In response to Re: Postmaster holding unlinked files for pg_largeobject table  (Alvaro Herrera <alvherre@commandprompt.com>)
Responses Re: Postmaster holding unlinked files for pg_largeobject table
List pgsql-hackers
Excerpts from Alvaro Herrera's message of jue jun 09 16:34:13 -0400 2011:

> I have pushed it now.

... and it caused a failure on the buildfarm, so I panicked and reverted
it.  I think the patch below fixes it.  Let me know if you think I
should push the whole thing again.

*** a/src/backend/storage/file/fd.c
--- b/src/backend/storage/file/fd.c
***************
*** 1045,1070 **** FileSetTransient(File file) }  /*
-  * Close a file at the kernel level, but keep the VFD open
-  */
- static void
- FileKernelClose(File file)
- {
-     Vfd          *vfdP;
- 
-     Assert(FileIsValid(file));
- 
-     vfdP = &VfdCache[file];
- 
-     if (!FileIsNotOpen(file))
-     {
-         if (close(vfdP->fd))
-             elog(ERROR, "could not close file \"%s\": %m", vfdP->fileName);
-         vfdP->fd = VFD_CLOSED;
-     }
- }
- 
- /*  * close a file when done with it  */ void
--- 1045,1050 ----
***************
*** 1892,1903 **** CleanupTempFiles(bool isProcExit)                 else if (fdstate & FD_XACT_TRANSIENT)
  {                     /*
 
!                      * Close the kernel file descriptor, but also remove the
!                      * flag from the VFD.  This is to ensure that if the VFD is
!                      * reused in the future for non-transient access, we don't
!                      * close it inappropriately then.                      */
!                     FileKernelClose(i);                     VfdCache[i].fdstate &= ~FD_XACT_TRANSIENT;
}             }
 
--- 1872,1884 ----                 else if (fdstate & FD_XACT_TRANSIENT)                 {                     /*
!                      * Close the FD, and remove the entry from the LRU ring,
!                      * but also remove the flag from the VFD.  This is to
!                      * ensure that if the VFD is reused in the future for
!                      * non-transient access, we don't close it inappropriately
!                      * then.                      */
!                     LruDelete(i);                     VfdCache[i].fdstate &= ~FD_XACT_TRANSIENT;                 }
        }
 
-- 
Álvaro Herrera <alvherre@commandprompt.com>
The PostgreSQL Company - Command Prompt, Inc.
PostgreSQL Replication, Consulting, Custom Development, 24x7 support


pgsql-hackers by date:

Previous
From: Bernd Helmle
Date:
Subject: Re: tuning autovacuum
Next
From: Tom Lane
Date:
Subject: Re: [COMMITTERS] pgsql: Use "transient" files for blind writes