diff options
author | Robert Haas <rhaas@postgresql.org> | 2017-09-22 14:28:22 -0400 |
---|---|---|
committer | Robert Haas <rhaas@postgresql.org> | 2017-09-22 14:33:18 -0400 |
commit | 1a44df007c9b9adc5e6082fc90fe68e615d38ecd (patch) | |
tree | 16c5bc54d5370cd0a14537718ffe77d3ecabb670 | |
parent | c08c98df3d30c0d773d5624860145fb4215b84fb (diff) | |
download | postgresql-1a44df007c9b9adc5e6082fc90fe68e615d38ecd.tar.gz postgresql-1a44df007c9b9adc5e6082fc90fe68e615d38ecd.zip |
For wal_consistency_checking, mask page checksum as well as page LSN.
If the LSN is different, the checksum will be different, too.
Ashwin Agrawal, reviewed by Michael Paquier and Kuntal Ghosh
Discussion: http://postgr.es/m/CALfoeis5iqrAU-+JAN+ZzXkpPr7+-0OAGv7QUHwFn=-wDy4o4Q@mail.gmail.com
-rw-r--r-- | src/backend/access/brin/brin_xlog.c | 2 | ||||
-rw-r--r-- | src/backend/access/common/bufmask.c | 8 | ||||
-rw-r--r-- | src/backend/access/gin/ginxlog.c | 2 | ||||
-rw-r--r-- | src/backend/access/gist/gistxlog.c | 4 | ||||
-rw-r--r-- | src/backend/access/hash/hash_xlog.c | 2 | ||||
-rw-r--r-- | src/backend/access/heap/heapam.c | 2 | ||||
-rw-r--r-- | src/backend/access/nbtree/nbtxlog.c | 2 | ||||
-rw-r--r-- | src/backend/access/spgist/spgxlog.c | 2 | ||||
-rw-r--r-- | src/backend/access/transam/generic_xlog.c | 2 | ||||
-rw-r--r-- | src/backend/commands/sequence.c | 2 | ||||
-rw-r--r-- | src/include/access/bufmask.h | 2 |
11 files changed, 16 insertions, 14 deletions
diff --git a/src/backend/access/brin/brin_xlog.c b/src/backend/access/brin/brin_xlog.c index dff7198a39e..60daa54a95b 100644 --- a/src/backend/access/brin/brin_xlog.c +++ b/src/backend/access/brin/brin_xlog.c @@ -332,7 +332,7 @@ brin_mask(char *pagedata, BlockNumber blkno) { Page page = (Page) pagedata; - mask_page_lsn(page); + mask_page_lsn_and_checksum(page); mask_page_hint_bits(page); diff --git a/src/backend/access/common/bufmask.c b/src/backend/access/common/bufmask.c index 10253d33545..d880aef7bad 100644 --- a/src/backend/access/common/bufmask.c +++ b/src/backend/access/common/bufmask.c @@ -23,15 +23,17 @@ * mask_page_lsn * * In consistency checks, the LSN of the two pages compared will likely be - * different because of concurrent operations when the WAL is generated - * and the state of the page when WAL is applied. + * different because of concurrent operations when the WAL is generated and + * the state of the page when WAL is applied. Also, mask out checksum as + * masking anything else on page means checksum is not going to match as well. */ void -mask_page_lsn(Page page) +mask_page_lsn_and_checksum(Page page) { PageHeader phdr = (PageHeader) page; PageXLogRecPtrSet(phdr->pd_lsn, (uint64) MASK_MARKER); + phdr->pd_checksum = MASK_MARKER; } /* diff --git a/src/backend/access/gin/ginxlog.c b/src/backend/access/gin/ginxlog.c index 7ba04e324f6..92cafe950b6 100644 --- a/src/backend/access/gin/ginxlog.c +++ b/src/backend/access/gin/ginxlog.c @@ -770,7 +770,7 @@ gin_mask(char *pagedata, BlockNumber blkno) Page page = (Page) pagedata; GinPageOpaque opaque; - mask_page_lsn(page); + mask_page_lsn_and_checksum(page); opaque = GinPageGetOpaque(page); mask_page_hint_bits(page); diff --git a/src/backend/access/gist/gistxlog.c b/src/backend/access/gist/gistxlog.c index 4f4fe8fab53..7fd91ce640a 100644 --- a/src/backend/access/gist/gistxlog.c +++ b/src/backend/access/gist/gistxlog.c @@ -352,14 +352,14 @@ gist_mask(char *pagedata, BlockNumber blkno) { Page page = (Page) pagedata; - mask_page_lsn(page); + mask_page_lsn_and_checksum(page); mask_page_hint_bits(page); mask_unused_space(page); /* * NSN is nothing but a special purpose LSN. Hence, mask it for the same - * reason as mask_page_lsn. + * reason as mask_page_lsn_and_checksum. */ GistPageSetNSN(page, (uint64) MASK_MARKER); diff --git a/src/backend/access/hash/hash_xlog.c b/src/backend/access/hash/hash_xlog.c index 67a856c1427..f19f6fdfafa 100644 --- a/src/backend/access/hash/hash_xlog.c +++ b/src/backend/access/hash/hash_xlog.c @@ -1263,7 +1263,7 @@ hash_mask(char *pagedata, BlockNumber blkno) HashPageOpaque opaque; int pagetype; - mask_page_lsn(page); + mask_page_lsn_and_checksum(page); mask_page_hint_bits(page); mask_unused_space(page); diff --git a/src/backend/access/heap/heapam.c b/src/backend/access/heap/heapam.c index e61dd771d0c..2d321171fad 100644 --- a/src/backend/access/heap/heapam.c +++ b/src/backend/access/heap/heapam.c @@ -9149,7 +9149,7 @@ heap_mask(char *pagedata, BlockNumber blkno) Page page = (Page) pagedata; OffsetNumber off; - mask_page_lsn(page); + mask_page_lsn_and_checksum(page); mask_page_hint_bits(page); mask_unused_space(page); diff --git a/src/backend/access/nbtree/nbtxlog.c b/src/backend/access/nbtree/nbtxlog.c index ac60db0d490..d67241c2832 100644 --- a/src/backend/access/nbtree/nbtxlog.c +++ b/src/backend/access/nbtree/nbtxlog.c @@ -1040,7 +1040,7 @@ btree_mask(char *pagedata, BlockNumber blkno) Page page = (Page) pagedata; BTPageOpaque maskopaq; - mask_page_lsn(page); + mask_page_lsn_and_checksum(page); mask_page_hint_bits(page); mask_unused_space(page); diff --git a/src/backend/access/spgist/spgxlog.c b/src/backend/access/spgist/spgxlog.c index c440d217159..87def79ee5d 100644 --- a/src/backend/access/spgist/spgxlog.c +++ b/src/backend/access/spgist/spgxlog.c @@ -1034,7 +1034,7 @@ spg_mask(char *pagedata, BlockNumber blkno) { Page page = (Page) pagedata; - mask_page_lsn(page); + mask_page_lsn_and_checksum(page); mask_page_hint_bits(page); diff --git a/src/backend/access/transam/generic_xlog.c b/src/backend/access/transam/generic_xlog.c index fbc6810c2f2..3adbf7b9494 100644 --- a/src/backend/access/transam/generic_xlog.c +++ b/src/backend/access/transam/generic_xlog.c @@ -541,7 +541,7 @@ generic_redo(XLogReaderState *record) void generic_mask(char *page, BlockNumber blkno) { - mask_page_lsn(page); + mask_page_lsn_and_checksum(page); mask_unused_space(page); } diff --git a/src/backend/commands/sequence.c b/src/backend/commands/sequence.c index 62937124efe..5c2ce789468 100644 --- a/src/backend/commands/sequence.c +++ b/src/backend/commands/sequence.c @@ -1941,7 +1941,7 @@ ResetSequenceCaches(void) void seq_mask(char *page, BlockNumber blkno) { - mask_page_lsn(page); + mask_page_lsn_and_checksum(page); mask_unused_space(page); } diff --git a/src/include/access/bufmask.h b/src/include/access/bufmask.h index 95c6c3ae020..6a24c947efc 100644 --- a/src/include/access/bufmask.h +++ b/src/include/access/bufmask.h @@ -23,7 +23,7 @@ /* Marker used to mask pages consistently */ #define MASK_MARKER 0 -extern void mask_page_lsn(Page page); +extern void mask_page_lsn_and_checksum(Page page); extern void mask_page_hint_bits(Page page); extern void mask_unused_space(Page page); extern void mask_lp_flags(Page page); |