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/access/heap/rewriteheap.c | |
parent | 7844608e54a3a2e3dee461b00fd6ef028a845d7c (diff) |
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/access/heap/rewriteheap.c')
-rw-r--r-- | src/backend/access/heap/rewriteheap.c | 10 |
1 files changed, 6 insertions, 4 deletions
diff --git a/src/backend/access/heap/rewriteheap.c b/src/backend/access/heap/rewriteheap.c index 8a22eccf87a..a3aad3adf91 100644 --- a/src/backend/access/heap/rewriteheap.c +++ b/src/backend/access/heap/rewriteheap.c @@ -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); |