diff --git a/src/bin/pg_rewind/file_ops.c b/src/bin/pg_rewind/file_ops.c index 705383d..1b53cc1 100644 --- a/src/bin/pg_rewind/file_ops.c +++ b/src/bin/pg_rewind/file_ops.c @@ -29,7 +29,6 @@ static int dstfd = -1; static char dstpath[MAXPGPATH] = ""; -static void remove_target_file(const char *path); static void create_target_dir(const char *path); static void remove_target_dir(const char *path); static void create_target_symlink(const char *path, const char *link); @@ -134,7 +133,7 @@ remove_target(file_entry_t *entry) break; case FILE_TYPE_REGULAR: - remove_target_file(entry->path); + remove_target_file(entry->path, false); break; case FILE_TYPE_SYMLINK: @@ -165,8 +164,8 @@ create_target(file_entry_t *entry) } } -static void -remove_target_file(const char *path) +void +remove_target_file(const char *path, bool ignore_error) { char dstpath[MAXPGPATH]; @@ -174,7 +173,7 @@ remove_target_file(const char *path) return; snprintf(dstpath, sizeof(dstpath), "%s/%s", datadir_target, path); - if (unlink(dstpath) != 0) + if (unlink(dstpath) != 0 && !ignore_error) pg_fatal("could not remove file \"%s\": %s\n", dstpath, strerror(errno)); } diff --git a/src/bin/pg_rewind/file_ops.h b/src/bin/pg_rewind/file_ops.h index be580ee..d415aa2 100644 --- a/src/bin/pg_rewind/file_ops.h +++ b/src/bin/pg_rewind/file_ops.h @@ -15,6 +15,7 @@ extern void open_target_file(const char *path, bool trunc); extern void write_target_range(char *buf, off_t begin, size_t size); extern void close_target_file(void); +extern void remove_target_file(const char *path, bool ignore_error); extern void truncate_target_file(const char *path, off_t newsize); extern void create_target(file_entry_t *t); extern void remove_target(file_entry_t *t); diff --git a/src/bin/pg_rewind/libpq_fetch.c b/src/bin/pg_rewind/libpq_fetch.c index d1726d1..f8bb8dc 100644 --- a/src/bin/pg_rewind/libpq_fetch.c +++ b/src/bin/pg_rewind/libpq_fetch.c @@ -313,6 +313,7 @@ receiveFileChunks(const char *sql) pg_log(PG_DEBUG, "received null value for chunk for file \"%s\", file has been deleted\n", filename); + remove_target_file(filename, true); pg_free(filename); PQclear(res); continue;