diff options
author | Heikki Linnakangas <heikki.linnakangas@iki.fi> | 2020-11-10 19:25:46 +0200 |
---|---|---|
committer | Heikki Linnakangas <heikki.linnakangas@iki.fi> | 2020-11-10 19:25:46 +0200 |
commit | 72d172743e52f31bb874e3bbc07544b30bf0bb51 (patch) | |
tree | 3775ed25be95e098292081c60623171c64e946fc /src | |
parent | 3f16cb505d1d734674da2a2cbf2104ceae22f9b4 (diff) | |
download | postgresql-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.c | 21 | ||||
-rw-r--r-- | src/bin/pg_rewind/t/001_basic.pl | 1 |
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 |