If create/drop database are going to call closeAllVfds(), they ought

to do it at the last moment before calling system() ... not at some
randomly-chosen earlier point in the routine ...
This commit is contained in:
Tom Lane 2000-06-02 04:04:54 +00:00
parent b659ab07a2
commit 664dd614d9
1 changed files with 19 additions and 17 deletions

View File

@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/commands/dbcommands.c,v 1.56 2000/05/30 00:49:43 momjian Exp $
* $Header: /cvsroot/pgsql/src/backend/commands/dbcommands.c,v 1.57 2000/06/02 04:04:54 tgl Exp $
*
*-------------------------------------------------------------------------
*/
@ -55,6 +55,7 @@ createdb(const char *dbname, const char *dbpath, int encoding)
char *loc;
char locbuf[512];
int4 user_id;
int ret;
bool use_super,
use_createdb;
Relation pg_database_rel;
@ -90,12 +91,6 @@ createdb(const char *dbname, const char *dbpath, int encoding)
"This may be due to a character that is not allowed or because the chosen "
"path isn't permitted for databases", dbpath);
/*
* close virtual file descriptors so the kernel has more available for
* the system() calls
*/
closeAllVfds();
/*
* Insert a new tuple into pg_database
*/
@ -133,6 +128,12 @@ createdb(const char *dbname, const char *dbpath, int encoding)
heap_close(pg_database_rel, NoLock);
/*
* Close virtual file descriptors so the kernel has more available for
* the mkdir() and system() calls below.
*/
closeAllVfds();
/* Copy the template database to the new location */
if (mkdir(loc, S_IRWXU) != 0)
@ -140,14 +141,15 @@ createdb(const char *dbname, const char *dbpath, int encoding)
snprintf(buf, sizeof(buf), "cp %s%cbase%ctemplate1%c* '%s'",
DataDir, SEP_CHAR, SEP_CHAR, SEP_CHAR, loc);
ret = system(buf);
/* Some versions of SunOS seem to return ECHILD after a system() call */
#if defined(sun)
if (system(buf) != 0 && errno != ECHILD)
if (ret != 0 && errno != ECHILD)
#else
if (system(buf) != 0)
if (ret != 0)
#endif
{
int ret;
/* Failed, so try to clean up the created directory ... */
snprintf(buf, sizeof(buf), "rm -rf '%s'", loc);
ret = system(buf);
#if defined(sun)
@ -209,12 +211,6 @@ dropdb(const char *dbname)
"This may be due to a character that is not allowed or because the chosen "
"path isn't permitted for databases", path);
/*
* close virtual file descriptors so the kernel has more available for
* the system() calls
*/
closeAllVfds();
/*
* Obtain exclusive lock on pg_database. We need this to ensure that
* no new backend starts up in the target database while we are
@ -277,6 +273,12 @@ dropdb(const char *dbname)
*/
DropBuffers(db_id);
/*
* Close virtual file descriptors so the kernel has more available for
* the system() call below.
*/
closeAllVfds();
/*
* Remove the database's subdirectory and everything in it.
*/