diff options
author | Simon Riggs <simon@2ndQuadrant.com> | 2013-04-07 22:16:51 +0100 |
---|---|---|
committer | Simon Riggs <simon@2ndQuadrant.com> | 2013-04-07 22:16:51 +0100 |
commit | cf8dc9e10c0d954970cbe5ca9be4c6b881cde482 (patch) | |
tree | c2916019fb2fd75b01400f1f746f62425ff1e44f /src/backend/commands/tablecmds.c | |
parent | 7844608e54a3a2e3dee461b00fd6ef028a845d7c (diff) | |
download | postgresql-cf8dc9e10c0d954970cbe5ca9be4c6b881cde482.tar.gz postgresql-cf8dc9e10c0d954970cbe5ca9be4c6b881cde482.zip |
Fix checksums for CLUSTER, VACUUM FULL etc.
In CLUSTER, VACUUM FULL and ALTER TABLE SET TABLESPACE
I erroneously set checksum before log_newpage, which
sets the LSN and invalidates the checksum. So set
checksum immediately *after* log_newpage.
Bug report Fujii Masao, Fix and patch by Jeff Davis
Diffstat (limited to 'src/backend/commands/tablecmds.c')
-rw-r--r-- | src/backend/commands/tablecmds.c | 12 |
1 files changed, 11 insertions, 1 deletions
diff --git a/src/backend/commands/tablecmds.c b/src/backend/commands/tablecmds.c index 536d232dd41..81c11997429 100644 --- a/src/backend/commands/tablecmds.c +++ b/src/backend/commands/tablecmds.c @@ -51,6 +51,7 @@ #include "commands/tablespace.h" #include "commands/trigger.h" #include "commands/typecmds.h" +#include "common/relpath.h" #include "executor/executor.h" #include "foreign/foreign.h" #include "miscadmin.h" @@ -8902,12 +8903,21 @@ copy_relation_data(SMgrRelation src, SMgrRelation dst, smgrread(src, forkNum, blkno, buf); - PageSetChecksumInplace(page, blkno); + if (!PageIsVerified(page, blkno)) + ereport(ERROR, + (errcode(ERRCODE_DATA_CORRUPTED), + errmsg("invalid page in block %u of relation %s", + blkno, + relpathbackend(src->smgr_rnode.node, + src->smgr_rnode.backend, + forkNum)))); /* XLOG stuff */ if (use_wal) log_newpage(&dst->smgr_rnode.node, forkNum, blkno, page); + PageSetChecksumInplace(page, blkno); + /* * Now write the page. We say isTemp = true even if it's not a temp * rel, because there's no need for smgr to schedule an fsync for this |