]> granicus.if.org Git - postgresql/commitdiff
For wal_consistency_checking, mask page checksum as well as page LSN.
authorRobert Haas <rhaas@postgresql.org>
Fri, 22 Sep 2017 18:28:22 +0000 (14:28 -0400)
committerRobert Haas <rhaas@postgresql.org>
Fri, 22 Sep 2017 18:28:22 +0000 (14:28 -0400)
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

src/backend/access/brin/brin_xlog.c
src/backend/access/common/bufmask.c
src/backend/access/gin/ginxlog.c
src/backend/access/gist/gistxlog.c
src/backend/access/hash/hash_xlog.c
src/backend/access/heap/heapam.c
src/backend/access/nbtree/nbtxlog.c
src/backend/access/spgist/spgxlog.c
src/backend/access/transam/generic_xlog.c
src/backend/commands/sequence.c
src/include/access/bufmask.h

index dff7198a39e6116bad787b7204dfa49cfc0ef7b2..60daa54a95bbfd7d164b1b17fdd8cadfa5241f1f 100644 (file)
@@ -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);
 
index 10253d33545f20e0a9e55deeb52ab855787e849a..d880aef7badbec2d6fa431a6cedece7775458b15 100644 (file)
  * 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;
 }
 
 /*
index 7ba04e324f64c042f5b0041be39d07a9dd9abe9d..92cafe950b6f2ae57cab979bfe18edfe3bab8c1a 100644 (file)
@@ -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);
index 4f4fe8fab533fcf41cb8cef11c0fdeb09fe96f46..7fd91ce640a294e05cbde77a2324bf98a4a33897 100644 (file)
@@ -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);
 
index 67a856c1427c540ffe0221fd66fb3504b0528d4c..f19f6fdfafab17ee93c2a6d7da182894e785fa59 100644 (file)
@@ -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);
index d20f0381f3bc23f99c505ef8609d63240ac5d44b..d03f544d2654e199db5bb890d1abd8f9f42d486f 100644 (file)
@@ -9166,7 +9166,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);
index 4afdf4736f01b9b21326b0289de5bce2e63414e2..82337f8ef288a4d3d043d6d11acc12c4bc765ddc 100644 (file)
@@ -1034,7 +1034,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);
index c440d2171591e8caef8a30dc1d1e913de231a2c9..87def79ee5d1b835ada45739ff8c990eecd7223e 100644 (file)
@@ -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);
 
index fbc6810c2f28c285cebf6e171831a8fc4b92f710..3adbf7b9494f00889afd0b98375dd15e4d9aa4fd 100644 (file)
@@ -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);
 }
index 62937124efeba489aa139ba40a323eac5f04128c..5c2ce789468463e353d0418f5c8ad53fca7eb24e 100644 (file)
@@ -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);
 }
index 95c6c3ae020f6e851a37eeae2fc68abf50a446c2..6a24c947efcd0e0a41351c131dce77e73f8d2fe9 100644 (file)
@@ -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);