pg_rewind_corrupt_wal.patch
application/octet-stream
Filename: pg_rewind_corrupt_wal.patch
Type: application/octet-stream
Part: 0
Patch
Format: unified
| File | + | − |
|---|---|---|
| src/bin/pg_rewind/file_ops.c | 4 | 5 |
| src/bin/pg_rewind/file_ops.h | 1 | 0 |
| src/bin/pg_rewind/libpq_fetch.c | 1 | 0 |
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;