diff options
Diffstat (limited to 'src/backend/access/transam/xlog.c')
-rw-r--r-- | src/backend/access/transam/xlog.c | 56 |
1 files changed, 30 insertions, 26 deletions
diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index 53ded25ed01..331809a3b91 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -7,7 +7,7 @@ * Portions Copyright (c) 1996-2009, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * - * $PostgreSQL: pgsql/src/backend/access/transam/xlog.c,v 1.352 2009/09/10 09:42:10 heikki Exp $ + * $PostgreSQL: pgsql/src/backend/access/transam/xlog.c,v 1.353 2009/09/13 18:32:07 heikki Exp $ * *------------------------------------------------------------------------- */ @@ -2262,12 +2262,14 @@ XLogFileInit(uint32 log, uint32 seg, *use_existent, &max_advance, use_lock)) { - /* No need for any more future segments... */ + /* + * No need for any more future segments, or InstallXLogFileSegment() + * failed to rename the file into place. If the rename failed, opening + * the file below will fail. + */ unlink(tmppath); } - elog(DEBUG2, "done creating and filling new WAL file"); - /* Set flag to tell caller there was no existent file */ *use_existent = false; @@ -2280,6 +2282,8 @@ XLogFileInit(uint32 log, uint32 seg, errmsg("could not open file \"%s\" (log file %u, segment %u): %m", path, log, seg))); + elog(DEBUG2, "done creating and filling new WAL file"); + return fd; } @@ -2409,10 +2413,9 @@ XLogFileCopy(uint32 log, uint32 seg, * place. This should be TRUE except during bootstrap log creation. The * caller must *not* hold the lock at call. * - * Returns TRUE if file installed, FALSE if not installed because of - * 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().) + * Returns TRUE if the file was installed successfully. FALSE indicates that + * max_advance limit was exceeded, or an error occurred while renaming the + * file into place. */ static bool InstallXLogFileSegment(uint32 *log, uint32 *seg, char *tmppath, @@ -2460,31 +2463,26 @@ InstallXLogFileSegment(uint32 *log, uint32 *seg, char *tmppath, */ #if HAVE_WORKING_LINK if (link(tmppath, path) < 0) - ereport(ERROR, + { + if (use_lock) + LWLockRelease(ControlFileLock); + ereport(LOG, (errcode_for_file_access(), errmsg("could not link file \"%s\" to \"%s\" (initialization of log file %u, segment %u): %m", tmppath, path, *log, *seg))); + return false; + } 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, + if (use_lock) + LWLockRelease(ControlFileLock); + ereport(LOG, (errcode_for_file_access(), errmsg("could not rename file \"%s\" to \"%s\" (initialization of log file %u, segment %u): %m", tmppath, path, *log, *seg))); + return false; } #endif @@ -3128,19 +3126,25 @@ RemoveOldXlogFiles(uint32 log, uint32 seg, XLogRecPtr endptr) */ snprintf(newpath, MAXPGPATH, "%s.deleted", path); if (rename(path, newpath) != 0) - ereport(ERROR, + { + ereport(LOG, (errcode_for_file_access(), - errmsg("could not rename old transaction log file \"%s\"", + errmsg("could not rename old transaction log file \"%s\": %m", path))); + continue; + } rc = unlink(newpath); #else rc = unlink(path); #endif if (rc != 0) - ereport(ERROR, + { + ereport(LOG, (errcode_for_file_access(), errmsg("could not remove old transaction log file \"%s\": %m", path))); + continue; + } CheckpointStats.ckpt_segs_removed++; } |