From 4942ee656ac6fdb765cd0db0086b32ab1eda8b0e Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Tue, 17 Apr 2007 20:49:39 +0000 Subject: [PATCH] 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. --- src/backend/access/heap/rewriteheap.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/backend/access/heap/rewriteheap.c b/src/backend/access/heap/rewriteheap.c index 1f4bba8a86..0783f7353d 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); -- 2.40.0