diff options
author | Bruce Momjian <bruce@momjian.us> | 2004-02-02 00:17:23 +0000 |
---|---|---|
committer | Bruce Momjian <bruce@momjian.us> | 2004-02-02 00:17:23 +0000 |
commit | d9d2ca8e8ebb1b1a593d3fe3942370c5d035c990 (patch) | |
tree | 60df3c075012a0229f0c4f0843ae4b2ab38dd139 /src/backend | |
parent | e5e5a323ca4485179b647ae333dc4dc6a2e0793d (diff) | |
download | postgresql-d9d2ca8e8ebb1b1a593d3fe3942370c5d035c990.tar.gz postgresql-d9d2ca8e8ebb1b1a593d3fe3942370c5d035c990.zip |
Adjust rename on Win32 to only link to temp name while holding lock,
then release locks and loop over renaming to active file name.
Diffstat (limited to 'src/backend')
-rw-r--r-- | src/backend/commands/user.c | 36 | ||||
-rw-r--r-- | src/backend/utils/cache/relcache.c | 33 | ||||
-rw-r--r-- | src/backend/utils/misc/guc.c | 7 |
3 files changed, 53 insertions, 23 deletions
diff --git a/src/backend/commands/user.c b/src/backend/commands/user.c index 6a9ba6f529a..33eb3c39b2f 100644 --- a/src/backend/commands/user.c +++ b/src/backend/commands/user.c @@ -6,7 +6,7 @@ * Portions Copyright (c) 1996-2003, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * - * $PostgreSQL: pgsql/src/backend/commands/user.c,v 1.133 2004/01/26 22:35:32 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/commands/user.c,v 1.134 2004/02/02 00:17:21 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -139,7 +139,11 @@ write_group_file(Relation grel) bufsize = strlen(filename) + 12; tempname = (char *) palloc(bufsize); snprintf(tempname, bufsize, "%s.%d", filename, MyProcPid); - +#if defined(WIN32) || defined(CYGWIN) + filename = repalloc(filename, strlen(filename) + 1 + strlen(".new"); + strcat(filename, ".new"); +#endif + oumask = umask((mode_t) 077); fp = AllocateFile(tempname, "w"); umask(oumask); @@ -286,6 +290,10 @@ write_user_file(Relation urel) bufsize = strlen(filename) + 12; tempname = (char *) palloc(bufsize); snprintf(tempname, bufsize, "%s.%d", filename, MyProcPid); +#if defined(WIN32) || defined(CYGWIN) + filename = repalloc(filename, strlen(filename) + 1 + strlen(".new"); + strcat(filename, ".new"); +#endif oumask = umask((mode_t) 077); fp = AllocateFile(tempname, "w"); @@ -457,6 +465,18 @@ AtEOXact_UpdatePasswordFile(bool isCommit) user_file_update_needed = false; write_user_file(urel); heap_close(urel, NoLock); +#if defined(WIN32) || defined(CYGWIN) + { + /* Rename active file while not holding an exclusive lock */ + char *filename = user_getfilename(), *filename_new; + + filename_new = palloc(strlen(filename) + 1 + strlen(".new"))); + sprintf(filename_new, "%s.new", filename); + rename(filename_new, filename); + pfree(filename); + pfree(filename_new); + } +#endif } if (group_file_update_needed) @@ -464,6 +484,18 @@ AtEOXact_UpdatePasswordFile(bool isCommit) group_file_update_needed = false; write_group_file(grel); heap_close(grel, NoLock); +#if defined(WIN32) || defined(CYGWIN) + { + /* Rename active file while not holding an exclusive lock */ + char *filename = group_getfilename(), *filename_new; + + filename_new = palloc(strlen(filename) + 1 + strlen(".new"))); + sprintf(filename_new, "%s.new", filename); + rename(filename_new, filename); + pfree(filename); + pfree(filename_new); + } +#endif } /* diff --git a/src/backend/utils/cache/relcache.c b/src/backend/utils/cache/relcache.c index fa8e2ac4d7b..37b81f1244f 100644 --- a/src/backend/utils/cache/relcache.c +++ b/src/backend/utils/cache/relcache.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/utils/cache/relcache.c,v 1.195 2004/01/26 22:35:32 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/utils/cache/relcache.c,v 1.196 2004/02/02 00:17:21 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -3358,33 +3358,28 @@ write_relcache_init_file(void) /* * OK, rename the temp file to its final name, deleting any * previously-existing init file. - * - * Note: a failure here is possible under Cygwin, if some other - * backend is holding open an unlinked-but-not-yet-gone init file. - * So treat this as a noncritical failure. */ - if (rename(tempfilename, finalfilename) < 0) +#if defined(WIN32) || defined(CYGWIN) + rename(tempfilename, finalfilename); + LWLockRelease(RelCacheInitLock); +#else { - ereport(WARNING, - (errcode_for_file_access(), - errmsg("could not rename relation-cache initialization file \"%s\" to \"%s\": %m", - tempfilename, finalfilename), - errdetail("Continuing anyway, but there's something wrong."))); - - /* - * If we fail, try to clean up the useless temp file; don't - * bother to complain if this fails too. - */ - unlink(tempfilename); + char finalfilename_new[MAXPGPATH]; + + snprintf(finalfilename_new, sizeof(finalfilename_new), "%s.new", finalfilename); + rename(tempfilename, finalfilename_new); + LWLockRelease(RelCacheInitLock); + /* Rename to active file after lock is released */ + rename(finalfilename_new, finalfilename); } +#endif } else { /* Delete the already-obsolete temp file */ unlink(tempfilename); + LWLockRelease(RelCacheInitLock); } - - LWLockRelease(RelCacheInitLock); } /* diff --git a/src/backend/utils/misc/guc.c b/src/backend/utils/misc/guc.c index 9e7264c9b32..ebc17830d3c 100644 --- a/src/backend/utils/misc/guc.c +++ b/src/backend/utils/misc/guc.c @@ -10,7 +10,7 @@ * Written by Peter Eisentraut <peter_e@gmx.net>. * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/utils/misc/guc.c,v 1.182 2004/01/31 05:09:41 neilc Exp $ + * $PostgreSQL: pgsql/src/backend/utils/misc/guc.c,v 1.183 2004/02/02 00:17:21 momjian Exp $ * *-------------------------------------------------------------------- */ @@ -3981,7 +3981,10 @@ write_nondefault_variables(GucContext context) return; } - /* Put new file in place, this could delay on Win32 */ + /* + * Put new file in place. This could delay on Win32, but we don't hold + * any exclusive locks. + */ rename(new_filename, filename); free(new_filename); free(filename); |