aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorHeikki Linnakangas <heikki.linnakangas@iki.fi>2020-11-10 19:25:46 +0200
committerHeikki Linnakangas <heikki.linnakangas@iki.fi>2020-11-10 19:25:46 +0200
commit72d172743e52f31bb874e3bbc07544b30bf0bb51 (patch)
tree3775ed25be95e098292081c60623171c64e946fc /src
parent3f16cb505d1d734674da2a2cbf2104ceae22f9b4 (diff)
downloadpostgresql-72d172743e52f31bb874e3bbc07544b30bf0bb51.tar.gz
postgresql-72d172743e52f31bb874e3bbc07544b30bf0bb51.zip
pg_rewind: Fix thinko in parsing target WAL.
It's entirely possible to see WAL for a relation that doesn't exist in the target anymore. That happens when the relation was dropped later. The refactoring in commit eb00f1d4b broke that case, by sanity-checking the file type in the target before checking the flag forwhether it exists there at all. I noticed this during manual testing. Modify the 001_basic.pl test so that it covers this case.
Diffstat (limited to 'src')
-rw-r--r--src/bin/pg_rewind/filemap.c21
-rw-r--r--src/bin/pg_rewind/t/001_basic.pl1
2 files changed, 13 insertions, 9 deletions
diff --git a/src/bin/pg_rewind/filemap.c b/src/bin/pg_rewind/filemap.c
index 314b064b223..ba34dbac146 100644
--- a/src/bin/pg_rewind/filemap.c
+++ b/src/bin/pg_rewind/filemap.c
@@ -324,17 +324,20 @@ process_target_wal_block_change(ForkNumber forknum, RelFileNode rnode,
{
Assert(entry->isrelfile);
- if (entry->target_type != FILE_TYPE_REGULAR)
- pg_fatal("unexpected page modification for non-regular file \"%s\"",
- entry->path);
-
- if (entry->target_exists && entry->source_exists)
+ if (entry->target_exists)
{
- off_t end_offset;
+ if (entry->target_type != FILE_TYPE_REGULAR)
+ pg_fatal("unexpected page modification for non-regular file \"%s\"",
+ entry->path);
- end_offset = (blkno_inseg + 1) * BLCKSZ;
- if (end_offset <= entry->source_size && end_offset <= entry->target_size)
- datapagemap_add(&entry->target_pages_to_overwrite, blkno_inseg);
+ if (entry->source_exists)
+ {
+ off_t end_offset;
+
+ end_offset = (blkno_inseg + 1) * BLCKSZ;
+ if (end_offset <= entry->source_size && end_offset <= entry->target_size)
+ datapagemap_add(&entry->target_pages_to_overwrite, blkno_inseg);
+ }
}
}
}
diff --git a/src/bin/pg_rewind/t/001_basic.pl b/src/bin/pg_rewind/t/001_basic.pl
index ba528e262f3..93fa09467b4 100644
--- a/src/bin/pg_rewind/t/001_basic.pl
+++ b/src/bin/pg_rewind/t/001_basic.pl
@@ -71,6 +71,7 @@ sub run_test
primary_psql("VACUUM tail_tbl");
# Drop drop_tbl. pg_rewind should copy it back.
+ primary_psql("insert into drop_tbl values ('in primary, after promotion')");
primary_psql("DROP TABLE drop_tbl");
# Before running pg_rewind, do a couple of extra tests with several