1
0
mirror of https://github.com/postgres/postgres.git synced 2025-06-30 21:42:05 +03:00

Add GUC temp_tablespaces to provide a default location for temporary

objects.

Jaime Casanova
This commit is contained in:
Bruce Momjian
2007-01-25 04:35:11 +00:00
parent 5af6b2abe9
commit 148ea5cbea
10 changed files with 272 additions and 16 deletions

View File

@ -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.134 2007/01/09 22:03:51 momjian Exp $
* $PostgreSQL: pgsql/src/backend/storage/file/fd.c,v 1.135 2007/01/25 04:35:10 momjian Exp $
*
* NOTES:
*
@ -46,6 +46,8 @@
#include <unistd.h>
#include <fcntl.h>
#include "commands/tablespace.h"
#include "miscadmin.h"
#include "access/xact.h"
#include "storage/fd.h"
@ -76,6 +78,7 @@
*/
#define FD_MINFREE 10
#define OIDCHARS 10 /* max chars printed by %u */
/*
* A number of platforms allow individual processes to open many more files
@ -880,13 +883,51 @@ OpenTemporaryFile(bool interXact)
{
char tempfilepath[MAXPGPATH];
File file;
Oid oid;
char *path;
int pathlen;
/*
* Generate a tempfile name that should be unique within the current
* database instance.
* Take a look what should be the path of the temporary file
*/
snprintf(tempfilepath, sizeof(tempfilepath),
"%s/%s%d.%ld", PG_TEMP_FILES_DIR, PG_TEMP_FILE_PREFIX,
oid = GetTempTablespace();
if (oid != InvalidOid)
{
/*
* As we got a valid tablespace, try to create the
* file there
*/
pathlen = strlen("pg_tblspc/") + OIDCHARS + 1;
path = (char *) palloc(pathlen);
snprintf(path, pathlen, "pg_tblspc/%u", oid );
/*
* Generate a tempfile name that should be unique within the current
* database instance.
*/
snprintf(tempfilepath, sizeof(tempfilepath),
"%s/%s%d.%ld", path, PG_TEMP_FILE_PREFIX,
MyProcPid, tempFileCounter++);
pfree(path);
file = PathNameOpenFile(tempfilepath,
O_RDWR | O_CREAT | O_TRUNC | PG_BINARY,
0600);
}
/*
* Create a normal temporary file if no tablespace returned or
* couldn't create the file in the tablespace "oid"
*/
if (oid == InvalidOid || file <= 0)
{
path = PG_TEMP_FILES_DIR;
/*
* Generate a tempfile name that should be unique within the current
* database instance.
*/
snprintf(tempfilepath, sizeof(tempfilepath),
"%s/%s%d.%ld", path, PG_TEMP_FILE_PREFIX,
MyProcPid, tempFileCounter++);
/*
@ -918,7 +959,8 @@ OpenTemporaryFile(bool interXact)
if (file <= 0)
elog(ERROR, "could not create temporary file \"%s\": %m",
tempfilepath);
}
}
}
/* Mark it for deletion at close */
VfdCache[file].fdstate |= FD_TEMPORARY;
@ -1292,6 +1334,20 @@ TryAgain:
errno = save_errno;
}
/*
* TEMPORARY hack to log the Windows error code on fopen failures, in
* hopes of diagnosing some hard-to-reproduce problems.
*/
#ifdef WIN32
{
int save_errno = errno;
elog(LOG, "Windows fopen(\"%s\",\"%s\") failed: code %lu, errno %d",
name, mode, GetLastError(), save_errno);
errno = save_errno;
}
#endif
return NULL;
}