diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index 03440cbf48ba92b240b2a61587859c8a9db7c1c8..9b590061731a2d80ebe5b136a0c53edd9164f026 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -7,7 +7,7 @@ * Portions Copyright (c) 1996-2006, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * - * $PostgreSQL: pgsql/src/backend/access/transam/xlog.c,v 1.253 2006/11/05 22:42:08 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/access/transam/xlog.c,v 1.254 2006/11/08 20:12:04 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -2140,7 +2140,9 @@ XLogFileCopy(uint32 log, uint32 seg, * caller must *not* hold the lock at call. * * Returns TRUE if file installed, FALSE if not installed because of - * exceeding max_advance limit. (Any other kind of failure causes ereport().) + * exceeding max_advance limit. On Windows, we also return FALSE if we + * can't rename the file into place because someone's got it open. + * (Any other kind of failure causes ereport().) */ static bool InstallXLogFileSegment(uint32 *log, uint32 *seg, char *tmppath, @@ -2195,10 +2197,25 @@ InstallXLogFileSegment(uint32 *log, uint32 *seg, char *tmppath, unlink(tmppath); #else if (rename(tmppath, path) < 0) + { +#ifdef WIN32 +#if !defined(__CYGWIN__) + if (GetLastError() == ERROR_ACCESS_DENIED) +#else + if (errno == EACCES) +#endif + { + if (use_lock) + LWLockRelease(ControlFileLock); + return false; + } +#endif /* WIN32 */ + ereport(ERROR, (errcode_for_file_access(), errmsg("could not rename file \"%s\" to \"%s\" (initialization of log file %u, segment %u): %m", tmppath, path, *log, *seg))); + } #endif if (use_lock) diff --git a/src/port/dirmod.c b/src/port/dirmod.c index e58384a749cbc59b8afaf0fbedca7a8cdab15277..3934b5cf7dd6c40fb8e5e940428d5ab709a7ad22 100644 --- a/src/port/dirmod.c +++ b/src/port/dirmod.c @@ -10,7 +10,7 @@ * Win32 (NT, Win2k, XP). replace() doesn't work on Win95/98/Me. * * IDENTIFICATION - * $PostgreSQL: pgsql/src/port/dirmod.c,v 1.43 2006/07/18 22:36:46 tgl Exp $ + * $PostgreSQL: pgsql/src/port/dirmod.c,v 1.44 2006/11/08 20:12:05 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -117,43 +117,28 @@ pgrename(const char *from, const char *to) int loops = 0; /* - * We need these loops because even though PostgreSQL uses flags that + * We need to loop because even though PostgreSQL uses flags that * allow rename while the file is open, other applications might have - * these files open without those flags. + * the file open without those flags. However, we won't wait + * indefinitely for someone else to close the file. */ #if defined(WIN32) && !defined(__CYGWIN__) while (!MoveFileEx(from, to, MOVEFILE_REPLACE_EXISTING)) -#endif -#ifdef __CYGWIN__ - while (rename(from, to) < 0) -#endif - { -#if defined(WIN32) && !defined(__CYGWIN__) - if (GetLastError() != ERROR_ACCESS_DENIED) -#endif -#ifdef __CYGWIN__ - if (errno != EACCES) -#endif - /* set errno? */ - return -1; - pg_usleep(100000); /* us */ - if (loops == 30) -#ifndef FRONTEND - elog(LOG, "could not rename file \"%s\" to \"%s\", continuing to try", - from, to); #else - fprintf(stderr, _("could not rename file \"%s\" to \"%s\", continuing to try\n"), - from, to); + while (rename(from, to) < 0) #endif - loops++; - } - - if (loops > 30) -#ifndef FRONTEND - elog(LOG, "completed rename of file \"%s\" to \"%s\"", from, to); + { +#if defined(WIN32) && !defined(__CYGWIN__) + if (GetLastError() != ERROR_ACCESS_DENIED) #else - fprintf(stderr, _("completed rename of file \"%s\" to \"%s\"\n"), from, to); + if (errno != EACCES) #endif + /* set errno? */ + return -1; + if (++loops > 300) /* time out after 30 sec */ + return -1; + pg_usleep(100000); /* us */ + } return 0; } @@ -167,33 +152,20 @@ pgunlink(const char *path) int loops = 0; /* - * We need these loops because even though PostgreSQL uses flags that + * We need to loop because even though PostgreSQL uses flags that * allow unlink while the file is open, other applications might have - * these files open without those flags. + * the file open without those flags. However, we won't wait + * indefinitely for someone else to close the file. */ while (unlink(path)) { if (errno != EACCES) /* set errno? */ return -1; + if (++loops > 300) /* time out after 30 sec */ + return -1; pg_usleep(100000); /* us */ - if (loops == 30) -#ifndef FRONTEND - elog(LOG, "could not remove file \"%s\", continuing to try", - path); -#else - fprintf(stderr, _("could not remove file \"%s\", continuing to try\n"), - path); -#endif - loops++; } - - if (loops > 30) -#ifndef FRONTEND - elog(LOG, "completed removal of file \"%s\"", path); -#else - fprintf(stderr, _("completed removal of file \"%s\"\n"), path); -#endif return 0; }