Re: Remove sort files - Mailing list pgsql-patches
| From | Bruce Momjian |
|---|---|
| Subject | Re: Remove sort files |
| Date | |
| Msg-id | 200105230111.f4N1BwN24369@candle.pha.pa.us Whole thread Raw |
| In response to | Re: Remove sort files ("Michael Richards" <michael@fastmail.ca>) |
| Responses |
Re: Remove sort files
|
| List | pgsql-patches |
> > The only unusual part is the use of system("find...rm...") to
> > remove the files in pg_sorttemp. Seemed cleaner than doing fancy
> > directory walking code in C.
>
> Should this figure out and use a path to the find command? Unless
> postgres sets CWD, is it possible as-is to coerce it into rming some
> files you did not intend to have rm'd? I didn't have/spend time
> looking at it with a fine toothcomb, but usually calling find and rm
> without an explicit path is a Bad Thing(tm).
I do use a full path for find:
find DataDir -...
Here is an updated patch which forces find and rm to come from /bin or
/usr/bin. Seems safer that way.
--
Bruce Momjian | http://candle.pha.pa.us
pgman@candle.pha.pa.us | (610) 853-3000
+ If your life is a hard drive, | 830 Blythe Avenue
+ Christ can be your backup. | Drexel Hill, Pennsylvania 19026
Index: configure.in
===================================================================
RCS file: /home/projects/pgsql/cvsroot/pgsql/configure.in,v
retrieving revision 1.127
diff -c -r1.127 configure.in
*** configure.in 2001/05/16 17:24:10 1.127
--- configure.in 2001/05/23 01:09:21
***************
*** 622,627 ****
--- 622,629 ----
PGAC_PATH_FLEX
AC_PROG_LN_S
AC_PROG_LD
+ AC_PROG_FIND
+ AC_PROG_RM
AC_SUBST(LD)
AC_SUBST(with_gnu_ld)
case $host_os in sysv5uw*)
Index: src/backend/postmaster/postmaster.c
===================================================================
RCS file: /home/projects/pgsql/cvsroot/pgsql/src/backend/postmaster/postmaster.c,v
retrieving revision 1.212
diff -c -r1.212 postmaster.c
*** src/backend/postmaster/postmaster.c 2001/04/19 19:09:23 1.212
--- src/backend/postmaster/postmaster.c 2001/05/23 01:09:36
***************
*** 243,248 ****
--- 243,249 ----
static void SignalChildren(int signal);
static int CountChildren(void);
static bool CreateOptsFile(int argc, char *argv[]);
+ static void RemovePgSorttemp(void);
static pid_t SSDataBase(int xlop);
***************
*** 595,600 ****
--- 596,604 ----
if (!CreateDataDirLockFile(DataDir, true))
ExitPostmaster(1);
+ /* Remove old sort files */
+ RemovePgSorttemp();
+
/*
* Establish input sockets.
*/
***************
*** 2449,2452 ****
--- 2453,2477 ----
fclose(fp);
return true;
+ }
+
+
+ /*
+ * Remove old sort files
+ */
+ static void
+ RemovePgSorttemp(void)
+ {
+ char clear_pg_sorttemp[1024];
+
+ /* Don't remove directory in case it is a symlink */
+ snprintf(clear_pg_sorttemp, sizeof(clear_pg_sorttemp),
+ "/bin/sh -c \
+ 'PATH=/bin:/usr/bin; \
+ export PATH; \
+ find \"%s\"/base -name pg_sorttemp -type d -exec sh -c \"rm -f {}/*\" \\;'",
+ DataDir);
+ /* Make sure we have the full 'find' command */
+ if (strlen(clear_pg_sorttemp)+1 < 1024)
+ system(clear_pg_sorttemp);
}
Index: src/backend/storage/file/fd.c
===================================================================
RCS file: /home/projects/pgsql/cvsroot/pgsql/src/backend/storage/file/fd.c,v
retrieving revision 1.76
diff -c -r1.76 fd.c
*** src/backend/storage/file/fd.c 2001/04/03 04:07:02 1.76
--- src/backend/storage/file/fd.c 2001/05/23 01:09:37
***************
*** 90,95 ****
--- 90,97 ----
#define VFD_CLOSED (-1)
+ #define TEMP_SORT_DIR "pg_sorttemp"
+
#define FileIsValid(file) \
((file) > 0 && (file) < (int) SizeVfdCache && VfdCache[file].fileName != NULL)
***************
*** 742,762 ****
File
OpenTemporaryFile(void)
{
! char tempfilename[64];
File file;
/*
* Generate a tempfile name that's unique within the current
* transaction
*/
! snprintf(tempfilename, sizeof(tempfilename),
! "pg_sorttemp%d.%ld", MyProcPid, tempFileCounter++);
/* Open the file */
! file = FileNameOpenFile(tempfilename,
O_RDWR | O_CREAT | O_TRUNC | PG_BINARY, 0600);
if (file <= 0)
! elog(ERROR, "Failed to create temporary file %s", tempfilename);
/* Mark it for deletion at close or EOXact */
VfdCache[file].fdstate |= FD_TEMPORARY;
--- 744,772 ----
File
OpenTemporaryFile(void)
{
! char tempfilepath[128];
File file;
/*
* Generate a tempfile name that's unique within the current
* transaction
*/
! snprintf(tempfilepath, sizeof(tempfilepath),
! "%s%c%d.%ld", TEMP_SORT_DIR, SEP_CHAR, MyProcPid,
! tempFileCounter++);
/* Open the file */
! file = FileNameOpenFile(tempfilepath,
O_RDWR | O_CREAT | O_TRUNC | PG_BINARY, 0600);
if (file <= 0)
! {
! /* mkdir could fail if some one else already created it */
! mkdir(TEMP_SORT_DIR, S_IRWXU);
! file = FileNameOpenFile(tempfilepath,
! O_RDWR | O_CREAT | O_TRUNC | PG_BINARY, 0600);
! if (file <= 0)
! elog(ERROR, "Failed to create temporary file %s", tempfilepath);
! }
/* Mark it for deletion at close or EOXact */
VfdCache[file].fdstate |= FD_TEMPORARY;
pgsql-patches by date: