aboutsummaryrefslogtreecommitdiff
path: root/src/backend/access/heap/rewriteheap.c
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2007-04-17 20:49:39 +0000
committerTom Lane <tgl@sss.pgh.pa.us>2007-04-17 20:49:39 +0000
commit4942ee656ac6fdb765cd0db0086b32ab1eda8b0e (patch)
tree7a7afc40519945d432adbc97175ca63a0de278e6 /src/backend/access/heap/rewriteheap.c
parent6c2c6682f69fb449fb80dc4e26fc29af1a9e61e6 (diff)
downloadpostgresql-4942ee656ac6fdb765cd0db0086b32ab1eda8b0e.tar.gz
postgresql-4942ee656ac6fdb765cd0db0086b32ab1eda8b0e.zip
Don't assume rd_smgr stays open across all of a rewriteheap operation;
doing so can result in crash if an sinval reset occurs meanwhile. I believe this explains intermittent buildfarm failures in cluster test.
Diffstat (limited to 'src/backend/access/heap/rewriteheap.c')
-rw-r--r--src/backend/access/heap/rewriteheap.c5
1 files changed, 3 insertions, 2 deletions
diff --git a/src/backend/access/heap/rewriteheap.c b/src/backend/access/heap/rewriteheap.c
index 1f4bba8a866..0783f7353dc 100644
--- a/src/backend/access/heap/rewriteheap.c
+++ b/src/backend/access/heap/rewriteheap.c
@@ -96,7 +96,7 @@
* Portions Copyright (c) 1994-5, Regents of the University of California
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/backend/access/heap/rewriteheap.c,v 1.1 2007/04/08 01:26:27 tgl Exp $
+ * $PostgreSQL: pgsql/src/backend/access/heap/rewriteheap.c,v 1.2 2007/04/17 20:49:39 tgl Exp $
*
*-------------------------------------------------------------------------
*/
@@ -203,7 +203,6 @@ begin_heap_rewrite(Relation new_heap, TransactionId oldest_xmin,
state->rs_buffer = (Page) palloc(BLCKSZ);
/* new_heap needn't be empty, just locked */
state->rs_blockno = RelationGetNumberOfBlocks(new_heap);
- /* Note: we assume RelationGetNumberOfBlocks did RelationOpenSmgr for us */
state->rs_buffer_valid = false;
state->rs_use_wal = use_wal;
state->rs_oldest_xmin = oldest_xmin;
@@ -267,6 +266,7 @@ end_heap_rewrite(RewriteState state)
log_newpage(&state->rs_new_rel->rd_node,
state->rs_blockno,
state->rs_buffer);
+ RelationOpenSmgr(state->rs_new_rel);
smgrextend(state->rs_new_rel->rd_smgr, state->rs_blockno,
(char *) state->rs_buffer, true);
}
@@ -586,6 +586,7 @@ raw_heap_insert(RewriteState state, HeapTuple tup)
* temp table, because there's no need for smgr to schedule an
* fsync for this write; we'll do it ourselves before committing.
*/
+ RelationOpenSmgr(state->rs_new_rel);
smgrextend(state->rs_new_rel->rd_smgr, state->rs_blockno,
(char *) page, true);