From bc2b85d90481c317c7d4efcf5dfc8c134f6105f9 Mon Sep 17 00:00:00 2001 From: Simon Riggs Date: Wed, 21 Apr 2010 17:20:56 +0000 Subject: [PATCH] Fix oversight in collecting values for cleanup_info records. vacuum_log_cleanup_info() now generates log records with a valid latestRemovedXid set in all cases. Also be careful not to zero the value when we do a round of vacuuming part-way through lazy_scan_heap(). Incidentally, this reduces frequency of conflicts in Hot Standby. --- src/backend/access/heap/pruneheap.c | 13 +++++++++---- src/backend/commands/vacuumlazy.c | 21 ++++++++++++++------- src/include/access/heapam.h | 4 ++-- 3 files changed, 25 insertions(+), 13 deletions(-) diff --git a/src/backend/access/heap/pruneheap.c b/src/backend/access/heap/pruneheap.c index 89607f57be..0fee2845d9 100644 --- a/src/backend/access/heap/pruneheap.c +++ b/src/backend/access/heap/pruneheap.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/access/heap/pruneheap.c,v 1.22 2010/02/26 02:00:33 momjian Exp $ + * $PostgreSQL: pgsql/src/backend/access/heap/pruneheap.c,v 1.23 2010/04/21 17:20:56 sriggs Exp $ * *------------------------------------------------------------------------- */ @@ -122,8 +122,10 @@ heap_page_prune_opt(Relation relation, Buffer buffer, TransactionId OldestXmin) */ if (PageIsFull(page) || PageGetHeapFreeSpace(page) < minfree) { + TransactionId ignore = InvalidTransactionId; /* return value not needed */ + /* OK to prune */ - (void) heap_page_prune(relation, buffer, OldestXmin, true); + (void) heap_page_prune(relation, buffer, OldestXmin, true, &ignore); } /* And release buffer lock */ @@ -145,11 +147,12 @@ heap_page_prune_opt(Relation relation, Buffer buffer, TransactionId OldestXmin) * send its own new total to pgstats, and we don't want this delta applied * on top of that.) * - * Returns the number of tuples deleted from the page. + * Returns the number of tuples deleted from the page and sets + * latestRemovedXid. */ int heap_page_prune(Relation relation, Buffer buffer, TransactionId OldestXmin, - bool report_stats) + bool report_stats, TransactionId *latestRemovedXid) { int ndeleted = 0; Page page = BufferGetPage(buffer); @@ -273,6 +276,8 @@ heap_page_prune(Relation relation, Buffer buffer, TransactionId OldestXmin, if (report_stats && ndeleted > prstate.ndead) pgstat_update_heap_dead_tuples(relation, ndeleted - prstate.ndead); + *latestRemovedXid = prstate.latestRemovedXid; + /* * XXX Should we update the FSM information of this page ? * diff --git a/src/backend/commands/vacuumlazy.c b/src/backend/commands/vacuumlazy.c index 1cf1ae3e59..6e807e3b47 100644 --- a/src/backend/commands/vacuumlazy.c +++ b/src/backend/commands/vacuumlazy.c @@ -29,7 +29,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/commands/vacuumlazy.c,v 1.132 2010/02/26 02:00:40 momjian Exp $ + * $PostgreSQL: pgsql/src/backend/commands/vacuumlazy.c,v 1.133 2010/04/21 17:20:56 sriggs Exp $ * *------------------------------------------------------------------------- */ @@ -274,6 +274,8 @@ vacuum_log_cleanup_info(Relation rel, LVRelStats *vacrelstats) if (rel->rd_istemp || !XLogIsNeeded()) return; + Assert(TransactionIdIsValid(vacrelstats->latestRemovedXid)); + (void) log_heap_cleanup_info(rel->rd_node, vacrelstats->latestRemovedXid); } @@ -395,9 +397,11 @@ lazy_scan_heap(Relation onerel, LVRelStats *vacrelstats, vacrelstats); /* Remove tuples from heap */ lazy_vacuum_heap(onerel, vacrelstats); - /* Forget the now-vacuumed tuples, and press on */ + /* + * Forget the now-vacuumed tuples, and press on, but be careful + * not to reset latestRemovedXid since we want that value to be valid. + */ vacrelstats->num_dead_tuples = 0; - vacrelstats->latestRemovedXid = InvalidTransactionId; vacrelstats->num_index_scans++; } @@ -484,8 +488,8 @@ lazy_scan_heap(Relation onerel, LVRelStats *vacrelstats, * * We count tuples removed by the pruning step as removed by VACUUM. */ - tups_vacuumed += heap_page_prune(onerel, buf, OldestXmin, false); - + tups_vacuumed += heap_page_prune(onerel, buf, OldestXmin, false, + &vacrelstats->latestRemovedXid); /* * Now scan the page to collect vacuumable items and check for tuples * requiring freezing. @@ -676,9 +680,12 @@ lazy_scan_heap(Relation onerel, LVRelStats *vacrelstats, { /* Remove tuples from heap */ lazy_vacuum_page(onerel, blkno, buf, 0, vacrelstats); - /* Forget the now-vacuumed tuples, and press on */ + /* + * Forget the now-vacuumed tuples, and press on, but be careful + * not to reset latestRemovedXid since we want that value to be valid. + */ + Assert(TransactionIdIsValid(vacrelstats->latestRemovedXid)); vacrelstats->num_dead_tuples = 0; - vacrelstats->latestRemovedXid = InvalidTransactionId; vacuumed_pages++; } diff --git a/src/include/access/heapam.h b/src/include/access/heapam.h index 1f26b376f5..521f9588fe 100644 --- a/src/include/access/heapam.h +++ b/src/include/access/heapam.h @@ -7,7 +7,7 @@ * Portions Copyright (c) 1996-2010, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * - * $PostgreSQL: pgsql/src/include/access/heapam.h,v 1.148 2010/02/26 02:01:20 momjian Exp $ + * $PostgreSQL: pgsql/src/include/access/heapam.h,v 1.149 2010/04/21 17:20:56 sriggs Exp $ * *------------------------------------------------------------------------- */ @@ -144,7 +144,7 @@ extern void heap_page_prune_opt(Relation relation, Buffer buffer, TransactionId OldestXmin); extern int heap_page_prune(Relation relation, Buffer buffer, TransactionId OldestXmin, - bool report_stats); + bool report_stats, TransactionId *latestRemovedXid); extern void heap_page_prune_execute(Buffer buffer, OffsetNumber *redirected, int nredirected, OffsetNumber *nowdead, int ndead,