Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
Skip to content

Commit d9d2ca8

Browse files
committed
Adjust rename on Win32 to only link to temp name while holding lock,
then release locks and loop over renaming to active file name.
1 parent e5e5a32 commit d9d2ca8

File tree

5 files changed

+67
-27
lines changed

5 files changed

+67
-27
lines changed

src/backend/commands/user.c

Lines changed: 34 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
* Portions Copyright (c) 1996-2003, PostgreSQL Global Development Group
77
* Portions Copyright (c) 1994, Regents of the University of California
88
*
9-
* $PostgreSQL: pgsql/src/backend/commands/user.c,v 1.133 2004/01/26 22:35:32 tgl Exp $
9+
* $PostgreSQL: pgsql/src/backend/commands/user.c,v 1.134 2004/02/02 00:17:21 momjian Exp $
1010
*
1111
*-------------------------------------------------------------------------
1212
*/
@@ -139,7 +139,11 @@ write_group_file(Relation grel)
139139
bufsize = strlen(filename) + 12;
140140
tempname = (char *) palloc(bufsize);
141141
snprintf(tempname, bufsize, "%s.%d", filename, MyProcPid);
142-
142+
#if defined(WIN32) || defined(CYGWIN)
143+
filename = repalloc(filename, strlen(filename) + 1 + strlen(".new");
144+
strcat(filename, ".new");
145+
#endif
146+
143147
oumask = umask((mode_t) 077);
144148
fp = AllocateFile(tempname, "w");
145149
umask(oumask);
@@ -286,6 +290,10 @@ write_user_file(Relation urel)
286290
bufsize = strlen(filename) + 12;
287291
tempname = (char *) palloc(bufsize);
288292
snprintf(tempname, bufsize, "%s.%d", filename, MyProcPid);
293+
#if defined(WIN32) || defined(CYGWIN)
294+
filename = repalloc(filename, strlen(filename) + 1 + strlen(".new");
295+
strcat(filename, ".new");
296+
#endif
289297

290298
oumask = umask((mode_t) 077);
291299
fp = AllocateFile(tempname, "w");
@@ -457,13 +465,37 @@ AtEOXact_UpdatePasswordFile(bool isCommit)
457465
user_file_update_needed = false;
458466
write_user_file(urel);
459467
heap_close(urel, NoLock);
468+
#if defined(WIN32) || defined(CYGWIN)
469+
{
470+
/* Rename active file while not holding an exclusive lock */
471+
char *filename = user_getfilename(), *filename_new;
472+
473+
filename_new = palloc(strlen(filename) + 1 + strlen(".new")));
474+
sprintf(filename_new, "%s.new", filename);
475+
rename(filename_new, filename);
476+
pfree(filename);
477+
pfree(filename_new);
478+
}
479+
#endif
460480
}
461481

462482
if (group_file_update_needed)
463483
{
464484
group_file_update_needed = false;
465485
write_group_file(grel);
466486
heap_close(grel, NoLock);
487+
#if defined(WIN32) || defined(CYGWIN)
488+
{
489+
/* Rename active file while not holding an exclusive lock */
490+
char *filename = group_getfilename(), *filename_new;
491+
492+
filename_new = palloc(strlen(filename) + 1 + strlen(".new")));
493+
sprintf(filename_new, "%s.new", filename);
494+
rename(filename_new, filename);
495+
pfree(filename);
496+
pfree(filename_new);
497+
}
498+
#endif
467499
}
468500

469501
/*

src/backend/utils/cache/relcache.c

Lines changed: 14 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
*
99
*
1010
* IDENTIFICATION
11-
* $PostgreSQL: pgsql/src/backend/utils/cache/relcache.c,v 1.195 2004/01/26 22:35:32 tgl Exp $
11+
* $PostgreSQL: pgsql/src/backend/utils/cache/relcache.c,v 1.196 2004/02/02 00:17:21 momjian Exp $
1212
*
1313
*-------------------------------------------------------------------------
1414
*/
@@ -3358,33 +3358,28 @@ write_relcache_init_file(void)
33583358
/*
33593359
* OK, rename the temp file to its final name, deleting any
33603360
* previously-existing init file.
3361-
*
3362-
* Note: a failure here is possible under Cygwin, if some other
3363-
* backend is holding open an unlinked-but-not-yet-gone init file.
3364-
* So treat this as a noncritical failure.
33653361
*/
3366-
if (rename(tempfilename, finalfilename) < 0)
3362+
#if defined(WIN32) || defined(CYGWIN)
3363+
rename(tempfilename, finalfilename);
3364+
LWLockRelease(RelCacheInitLock);
3365+
#else
33673366
{
3368-
ereport(WARNING,
3369-
(errcode_for_file_access(),
3370-
errmsg("could not rename relation-cache initialization file \"%s\" to \"%s\": %m",
3371-
tempfilename, finalfilename),
3372-
errdetail("Continuing anyway, but there's something wrong.")));
3373-
3374-
/*
3375-
* If we fail, try to clean up the useless temp file; don't
3376-
* bother to complain if this fails too.
3377-
*/
3378-
unlink(tempfilename);
3367+
char finalfilename_new[MAXPGPATH];
3368+
3369+
snprintf(finalfilename_new, sizeof(finalfilename_new), "%s.new", finalfilename);
3370+
rename(tempfilename, finalfilename_new);
3371+
LWLockRelease(RelCacheInitLock);
3372+
/* Rename to active file after lock is released */
3373+
rename(finalfilename_new, finalfilename);
33793374
}
3375+
#endif
33803376
}
33813377
else
33823378
{
33833379
/* Delete the already-obsolete temp file */
33843380
unlink(tempfilename);
3381+
LWLockRelease(RelCacheInitLock);
33853382
}
3386-
3387-
LWLockRelease(RelCacheInitLock);
33883383
}
33893384

33903385
/*

src/backend/utils/misc/guc.c

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
* Written by Peter Eisentraut <peter_e@gmx.net>.
1111
*
1212
* IDENTIFICATION
13-
* $PostgreSQL: pgsql/src/backend/utils/misc/guc.c,v 1.182 2004/01/31 05:09:41 neilc Exp $
13+
* $PostgreSQL: pgsql/src/backend/utils/misc/guc.c,v 1.183 2004/02/02 00:17:21 momjian Exp $
1414
*
1515
*--------------------------------------------------------------------
1616
*/
@@ -3981,7 +3981,10 @@ write_nondefault_variables(GucContext context)
39813981
return;
39823982
}
39833983

3984-
/* Put new file in place, this could delay on Win32 */
3984+
/*
3985+
* Put new file in place. This could delay on Win32, but we don't hold
3986+
* any exclusive locks.
3987+
*/
39853988
rename(new_filename, filename);
39863989
free(new_filename);
39873990
free(filename);

src/include/port.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
* Portions Copyright (c) 1996-2003, PostgreSQL Global Development Group
77
* Portions Copyright (c) 1994, Regents of the University of California
88
*
9-
* $PostgreSQL: pgsql/src/include/port.h,v 1.16 2004/02/02 00:11:31 momjian Exp $
9+
* $PostgreSQL: pgsql/src/include/port.h,v 1.17 2004/02/02 00:17:23 momjian Exp $
1010
*
1111
*-------------------------------------------------------------------------
1212
*/
@@ -30,18 +30,18 @@ extern int fseeko(FILE *stream, off_t offset, int whence);
3030
extern off_t ftello(FILE *stream);
3131
#endif
3232

33-
#ifdef WIN32
33+
#if !defined(FRONTEND) && (defined(WIN32) || defined(CYGWIN))
3434
/*
3535
* Win32 doesn't have reliable rename/unlink during concurrent access
3636
*/
37-
#ifndef FRONTEND
3837
extern int pgrename(const char *from, const char *to);
3938
extern int pgunlink(const char *path);
4039

4140
#define rename(from, to) pgrename(from, to)
4241
#define unlink(path) pgunlink(path)
4342
#endif
4443

44+
#ifdef WIN32
4545
extern int copydir(char *fromdir, char *todir);
4646

4747
/* Missing rand functions */

src/port/dirmod.c

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
* Win32 (NT, Win2k, XP). replace() doesn't work on Win95/98/Me.
1111
*
1212
* IDENTIFICATION
13-
* $PostgreSQL: pgsql/src/port/dirmod.c,v 1.8 2003/11/29 19:52:13 pgsql Exp $
13+
* $PostgreSQL: pgsql/src/port/dirmod.c,v 1.9 2004/02/02 00:17:23 momjian Exp $
1414
*
1515
*-------------------------------------------------------------------------
1616
*/
@@ -27,9 +27,19 @@ pgrename(const char *from, const char *to)
2727
{
2828
int loops = 0;
2929

30+
#ifdef WIN32
3031
while (!MoveFileEx(from, to, MOVEFILE_REPLACE_EXISTING))
32+
#endif
33+
#ifdef CYGWIN
34+
while (rename(from, to) < 0)
35+
#endif
3136
{
37+
#ifdef WIN32
3238
if (GetLastError() != ERROR_ACCESS_DENIED)
39+
#endif
40+
#ifdef CYGWIN
41+
if (errno != EACCES)
42+
#endif
3343
/* set errno? */
3444
return -1;
3545
Sleep(100); /* ms */

0 commit comments

Comments
 (0)