mirror of
https://github.com/postgres/postgres.git
synced 2025-07-08 11:42:09 +03:00
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
This commit is contained in:
@ -273,14 +273,15 @@ 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(&state->rs_new_rel->rd_node,
|
||||
MAIN_FORKNUM,
|
||||
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, MAIN_FORKNUM, state->rs_blockno,
|
||||
(char *) state->rs_buffer, true);
|
||||
}
|
||||
@ -616,8 +617,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(&state->rs_new_rel->rd_node,
|
||||
@ -632,6 +631,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, MAIN_FORKNUM,
|
||||
state->rs_blockno, (char *) page, true);
|
||||
|
||||
|
Reference in New Issue
Block a user