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

Commit52d469b

Browse files
committed
Fix race condition if a file is removed while pg_basebackup is running.
If a relation file was removed when the server-side counterpart ofpg_basebackup was just about to open it to send it to the client, you'dget a "could not open file" error. Fix that.Backpatch to 9.1, this goes back to when pg_basebackup was introduced.
1 parent3463dac commit52d469b

File tree

1 file changed

+31
-10
lines changed

1 file changed

+31
-10
lines changed

‎src/backend/replication/basebackup.c

Lines changed: 31 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -44,8 +44,8 @@ typedef struct
4444

4545

4646
staticint64sendDir(char*path,intbasepathlen,boolsizeonly);
47-
staticvoidsendFile(char*readfilename,char*tarfilename,
48-
structstat*statbuf);
47+
staticboolsendFile(char*readfilename,char*tarfilename,
48+
structstat*statbuf,boolmissing_ok);
4949
staticvoidsendFileWithContent(constchar*filename,constchar*content);
5050
staticvoid_tarWriteHeader(constchar*filename,constchar*linktarget,
5151
structstat*statbuf);
@@ -194,7 +194,7 @@ perform_base_backup(basebackup_options *opt, DIR *tblspcdir)
194194
XLOG_CONTROL_FILE)));
195195
}
196196

197-
sendFile(XLOG_CONTROL_FILE,XLOG_CONTROL_FILE,&statbuf);
197+
sendFile(XLOG_CONTROL_FILE,XLOG_CONTROL_FILE,&statbuf, false);
198198
}
199199

200200
/*
@@ -715,11 +715,18 @@ sendDir(char *path, int basepathlen, bool sizeonly)
715715
}
716716
elseif (S_ISREG(statbuf.st_mode))
717717
{
718-
/* Add size, rounded up to 512byte block */
719-
size+= ((statbuf.st_size+511)& ~511);
718+
boolsent= false;
719+
720720
if (!sizeonly)
721-
sendFile(pathbuf,pathbuf+basepathlen+1,&statbuf);
722-
size+=512;/* Size of the header of the file */
721+
sent=sendFile(pathbuf,pathbuf+basepathlen+1,&statbuf,
722+
true);
723+
724+
if (sent||sizeonly)
725+
{
726+
/* Add size, rounded up to 512byte block */
727+
size+= ((statbuf.st_size+511)& ~511);
728+
size+=512;/* Size of the header of the file */
729+
}
723730
}
724731
else
725732
ereport(WARNING,
@@ -779,9 +786,17 @@ _tarChecksum(char *header)
779786
returnsum;
780787
}
781788

782-
/* Given the member, write the TAR header & send the file */
783-
staticvoid
784-
sendFile(char*readfilename,char*tarfilename,structstat*statbuf)
789+
/*
790+
* Given the member, write the TAR header & send the file.
791+
*
792+
* If 'missing_ok' is true, will not throw an error if the file is not found.
793+
*
794+
* Returns true if the file was successfully sent, false if 'missing_ok',
795+
* and the file did not exist.
796+
*/
797+
staticbool
798+
sendFile(char*readfilename,char*tarfilename,structstat*statbuf,
799+
boolmissing_ok)
785800
{
786801
FILE*fp;
787802
charbuf[TAR_SEND_SIZE];
@@ -791,9 +806,13 @@ sendFile(char *readfilename, char *tarfilename, struct stat * statbuf)
791806

792807
fp=AllocateFile(readfilename,"rb");
793808
if (fp==NULL)
809+
{
810+
if (errno==ENOENT&&missing_ok)
811+
return false;
794812
ereport(ERROR,
795813
(errcode_for_file_access(),
796814
errmsg("could not open file \"%s\": %m",readfilename)));
815+
}
797816

798817
/*
799818
* Some compilers will throw a warning knowing this test can never be true
@@ -847,6 +866,8 @@ sendFile(char *readfilename, char *tarfilename, struct stat * statbuf)
847866
}
848867

849868
FreeFile(fp);
869+
870+
return true;
850871
}
851872

852873

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp