Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commitd9d2ca8

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 parente5e5a32 commitd9d2ca8

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+
charfinalfilename_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 intfseeko(FILE *stream, off_t offset, int whence);
3030
externoff_tftello(FILE*stream);
3131
#endif
3232

33-
#ifdefWIN32
33+
#if !defined(FRONTEND)&& (defined(WIN32)|| defined(CYGWIN))
3434
/*
3535
* Win32 doesn't have reliable rename/unlink during concurrent access
3636
*/
37-
#ifndefFRONTEND
3837
externintpgrename(constchar*from,constchar*to);
3938
externintpgunlink(constchar*path);
4039

4140
#definerename(from,to)pgrename(from, to)
4241
#defineunlink(path)pgunlink(path)
4342
#endif
4443

44+
#ifdefWIN32
4545
externintcopydir(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
intloops=0;
2929

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

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp