@@ -44,8 +44,8 @@ typedef struct
4444
4545
4646static int64 sendDir (char * path ,int basepathlen ,bool sizeonly );
47- static void sendFile (char * readfilename ,char * tarfilename ,
48- struct stat * statbuf );
47+ static bool sendFile (char * readfilename ,char * tarfilename ,
48+ struct stat * statbuf , bool missing_ok );
4949static void sendFileWithContent (const char * filename ,const char * content );
5050static void _tarWriteHeader (const char * filename ,const char * linktarget ,
5151struct stat * statbuf );
@@ -199,7 +199,7 @@ perform_base_backup(basebackup_options *opt, DIR *tblspcdir)
199199XLOG_CONTROL_FILE )));
200200}
201201
202- sendFile (XLOG_CONTROL_FILE ,XLOG_CONTROL_FILE ,& statbuf );
202+ sendFile (XLOG_CONTROL_FILE ,XLOG_CONTROL_FILE ,& statbuf , false );
203203}
204204
205205/*
@@ -712,11 +712,18 @@ sendDir(char *path, int basepathlen, bool sizeonly)
712712}
713713else if (S_ISREG (statbuf .st_mode ))
714714{
715- /* Add size, rounded up to 512byte block */
716- size += (( statbuf . st_size + 511 ) & ~ 511 );
715+ bool sent = false;
716+
717717if (!sizeonly )
718- sendFile (pathbuf ,pathbuf + basepathlen + 1 ,& statbuf );
719- size += 512 ;/* Size of the header of the file */
718+ sent = sendFile (pathbuf ,pathbuf + basepathlen + 1 ,& statbuf ,
719+ true);
720+
721+ if (sent || sizeonly )
722+ {
723+ /* Add size, rounded up to 512byte block */
724+ size += ((statbuf .st_size + 511 )& ~511 );
725+ size += 512 ;/* Size of the header of the file */
726+ }
720727}
721728else
722729ereport (WARNING ,
@@ -776,9 +783,17 @@ _tarChecksum(char *header)
776783return sum ;
777784}
778785
779- /* Given the member, write the TAR header & send the file */
780- static void
781- sendFile (char * readfilename ,char * tarfilename ,struct stat * statbuf )
786+ /*
787+ * Given the member, write the TAR header & send the file.
788+ *
789+ * If 'missing_ok' is true, will not throw an error if the file is not found.
790+ *
791+ * Returns true if the file was successfully sent, false if 'missing_ok',
792+ * and the file did not exist.
793+ */
794+ static bool
795+ sendFile (char * readfilename ,char * tarfilename ,struct stat * statbuf ,
796+ bool missing_ok )
782797{
783798FILE * fp ;
784799char buf [TAR_SEND_SIZE ];
@@ -788,9 +803,13 @@ sendFile(char *readfilename, char *tarfilename, struct stat * statbuf)
788803
789804fp = AllocateFile (readfilename ,"rb" );
790805if (fp == NULL )
806+ {
807+ if (errno == ENOENT && missing_ok )
808+ return false;
791809ereport (ERROR ,
792810(errcode_for_file_access (),
793811errmsg ("could not open file \"%s\": %m" ,readfilename )));
812+ }
794813
795814/*
796815 * Some compilers will throw a warning knowing this test can never be true
@@ -844,6 +863,8 @@ sendFile(char *readfilename, char *tarfilename, struct stat * statbuf)
844863}
845864
846865FreeFile (fp );
866+
867+ return true;
847868}
848869
849870