提交 058527bc 编写于 作者: S Simon Riggs 提交者: Xin Zhang

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

(cherry picked from commit cf8dc9e1)
上级 cbb4795e
......@@ -266,12 +266,13 @@ end_heap_rewrite(RewriteState state)
/* Write the last page, if any */
if (state->rs_buffer_valid)
{
PageSetChecksumInplace(state->rs_buffer, state->rs_blockno);
if (state->rs_use_wal)
log_newpage_rel(state->rs_new_rel,state->rs_blockno, state->rs_buffer);
RelationOpenSmgr(state->rs_new_rel);
PageSetChecksumInplace(state->rs_buffer, state->rs_blockno);
smgrextend(state->rs_new_rel->rd_smgr, state->rs_blockno,
(char *) state->rs_buffer, true);
}
......@@ -603,8 +604,6 @@ raw_heap_insert(RewriteState state, HeapTuple tup)
{
/* Doesn't fit, so write out the existing page */
PageSetChecksumInplace(page, state->rs_blockno);
/* XLOG stuff */
if (state->rs_use_wal)
log_newpage_rel(state->rs_new_rel, state->rs_blockno, page);
......@@ -616,6 +615,9 @@ raw_heap_insert(RewriteState state, HeapTuple tup)
* end_heap_rewrite.
*/
RelationOpenSmgr(state->rs_new_rel);
PageSetChecksumInplace(page, state->rs_blockno);
smgrextend(state->rs_new_rel->rd_smgr, state->rs_blockno,
(char *) page, true);
......
......@@ -10272,7 +10272,14 @@ copy_buffer_pool_data(Relation rel, SMgrRelation dst,
smgrread(src, blkno, buf);
PageSetChecksumInplace(page, blkno);
if (!PageIsVerified(page, blkno))
ereport(ERROR,
(errcode(ERRCODE_DATA_CORRUPTED),
errmsg("invalid page in block %u of relation %s/%s/%s",
blkno,
src->smgr_rnode.spcNode,
src->smgr_rnode.dbNode,
src->smgr_rnode.relNode)));
/* XLOG stuff */
if (useWal)
......@@ -10281,6 +10288,8 @@ copy_buffer_pool_data(Relation rel, SMgrRelation dst,
persistentSerialNum);
}
PageSetChecksumInplace(page, blkno);
// -------- MirroredLock ----------
LWLockAcquire(MirroredLock, LW_SHARED);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册