diff options
Diffstat (limited to 'src/backend/access/heap/rewriteheap.c')
-rw-r--r-- | src/backend/access/heap/rewriteheap.c | 25 |
1 files changed, 20 insertions, 5 deletions
diff --git a/src/backend/access/heap/rewriteheap.c b/src/backend/access/heap/rewriteheap.c index be389c647aa..fe8edeedae7 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.4 2007/05/16 16:36:56 alvherre Exp $ + * $PostgreSQL: pgsql/src/backend/access/heap/rewriteheap.c,v 1.5 2007/05/17 15:28:29 alvherre Exp $ * *------------------------------------------------------------------------- */ @@ -123,6 +123,8 @@ typedef struct RewriteStateData bool rs_use_wal; /* must we WAL-log inserts? */ TransactionId rs_oldest_xmin; /* oldest xmin used by caller to * determine tuple visibility */ + TransactionId rs_freeze_xid; /* Xid that will be used as freeze + * cutoff point */ MemoryContext rs_cxt; /* for hash tables and entries and * tuples in them */ HTAB *rs_unresolved_tups; /* unmatched A tuples */ @@ -171,6 +173,7 @@ static void raw_heap_insert(RewriteState state, HeapTuple tup); * * new_heap new, locked heap relation to insert tuples to * oldest_xmin xid used by the caller to determine which tuples are dead + * freeze_xid xid before which tuples will be frozen * use_wal should the inserts to the new heap be WAL-logged? * * Returns an opaque RewriteState, allocated in current memory context, @@ -178,7 +181,7 @@ static void raw_heap_insert(RewriteState state, HeapTuple tup); */ RewriteState begin_heap_rewrite(Relation new_heap, TransactionId oldest_xmin, - bool use_wal) + TransactionId freeze_xid, bool use_wal) { RewriteState state; MemoryContext rw_cxt; @@ -206,6 +209,7 @@ begin_heap_rewrite(Relation new_heap, TransactionId oldest_xmin, state->rs_buffer_valid = false; state->rs_use_wal = use_wal; state->rs_oldest_xmin = oldest_xmin; + state->rs_freeze_xid = freeze_xid; state->rs_cxt = rw_cxt; /* Initialize hash tables used to track update chains */ @@ -292,7 +296,9 @@ end_heap_rewrite(RewriteState state) /* * Add a tuple to the new heap. * - * Visibility information is copied from the original tuple. + * Visibility information is copied from the original tuple, except that + * we "freeze" very-old tuples. Note that since we scribble on new_tuple, + * it had better be temp storage not a pointer to the original tuple. * * state opaque state as returned by begin_heap_rewrite * old_tuple original tuple in the old heap @@ -324,6 +330,17 @@ rewrite_heap_tuple(RewriteState state, old_tuple->t_data->t_infomask & HEAP_XACT_MASK; /* + * While we have our hands on the tuple, we may as well freeze any + * very-old xmin or xmax, so that future VACUUM effort can be saved. + * + * Note we abuse heap_freeze_tuple() a bit here, since it's expecting + * to be given a pointer to a tuple in a disk buffer. It happens + * though that we can get the right things to happen by passing + * InvalidBuffer for the buffer. + */ + heap_freeze_tuple(new_tuple->t_data, state->rs_freeze_xid, InvalidBuffer); + + /* * Invalid ctid means that ctid should point to the tuple itself. * We'll override it later if the tuple is part of an update chain. */ @@ -538,8 +555,6 @@ raw_heap_insert(RewriteState state, HeapTuple tup) OffsetNumber newoff; HeapTuple heaptup; - heap_freeze_tuple(tup->t_data, state->rs_oldest_xmin, InvalidBuffer); - /* * If the new tuple is too big for storage or contains already toasted * out-of-line attributes from some other relation, invoke the toaster. |