OSDN Git Service

Further reductions in Hot Standby conflict processing. These
authorSimon Riggs <simon@2ndQuadrant.com>
Thu, 22 Apr 2010 02:15:45 +0000 (02:15 +0000)
committerSimon Riggs <simon@2ndQuadrant.com>
Thu, 22 Apr 2010 02:15:45 +0000 (02:15 +0000)
come from the realistion that HEAP2_CLEAN records don't
always remove user visible data, so conflict processing for
them can be skipped. Confirm validity using Assert checks,
clarify circumstances under which we log heap_cleanup_info
records. Tuning arises from bug fixing of earlier safety
check failures.

src/backend/access/heap/heapam.c
src/backend/access/heap/pruneheap.c
src/backend/commands/vacuumlazy.c

index 1f26faa..9384894 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/backend/access/heap/heapam.c,v 1.288 2010/02/26 02:00:33 momjian Exp $
+ *       $PostgreSQL: pgsql/src/backend/access/heap/heapam.c,v 1.289 2010/04/22 02:15:45 sriggs Exp $
  *
  *
  * INTERFACE ROUTINES
@@ -4106,7 +4106,7 @@ heap_xlog_cleanup_info(XLogRecPtr lsn, XLogRecord *record)
 }
 
 /*
- * Handles HEAP_CLEAN record type
+ * Handles HEAP2_CLEAN record type
  */
 static void
 heap_xlog_clean(XLogRecPtr lsn, XLogRecord *record)
@@ -4126,8 +4126,12 @@ heap_xlog_clean(XLogRecPtr lsn, XLogRecord *record)
        /*
         * We're about to remove tuples. In Hot Standby mode, ensure that there's
         * no queries running for which the removed tuples are still visible.
+        * 
+        * Not all HEAP2_CLEAN records remove tuples with xids, so we only want
+        * to conflict on the records that cause MVCC failures for user queries.
+        * If latestRemovedXid is invalid, skip conflict processing.
         */
-       if (InHotStandby)
+       if (InHotStandby && TransactionIdIsValid(xlrec->latestRemovedXid))
                ResolveRecoveryConflictWithSnapshot(xlrec->latestRemovedXid,
                                                                                        xlrec->node);
 
index 0fee284..713ee40 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/backend/access/heap/pruneheap.c,v 1.23 2010/04/21 17:20:56 sriggs Exp $
+ *       $PostgreSQL: pgsql/src/backend/access/heap/pruneheap.c,v 1.24 2010/04/22 02:15:45 sriggs Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -236,6 +236,7 @@ heap_page_prune(Relation relation, Buffer buffer, TransactionId OldestXmin,
                {
                        XLogRecPtr      recptr;
 
+                       Assert(TransactionIdIsValid(prstate.latestRemovedXid));
                        recptr = log_heap_clean(relation, buffer,
                                                                        prstate.redirected, prstate.nredirected,
                                                                        prstate.nowdead, prstate.ndead,
index 0b40476..8a135f3 100644 (file)
@@ -29,7 +29,7 @@
  *
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/backend/commands/vacuumlazy.c,v 1.134 2010/04/21 19:53:24 sriggs Exp $
+ *       $PostgreSQL: pgsql/src/backend/commands/vacuumlazy.c,v 1.135 2010/04/22 02:15:45 sriggs Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -274,12 +274,11 @@ vacuum_log_cleanup_info(Relation rel, LVRelStats *vacrelstats)
        if (rel->rd_istemp || !XLogIsNeeded())
                return;
 
-       if (vacrelstats->tuples_deleted > 0)
-       {
-               Assert(TransactionIdIsValid(vacrelstats->latestRemovedXid));
-
+       /*
+        * No need to write the record at all unless it contains a valid value
+        */
+       if (TransactionIdIsValid(vacrelstats->latestRemovedXid))
                (void) log_heap_cleanup_info(rel->rd_node, vacrelstats->latestRemovedXid);
-       }
 }
 
 /*
@@ -687,7 +686,6 @@ lazy_scan_heap(Relation onerel, LVRelStats *vacrelstats,
                         * 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;
                        vacuumed_pages++;
                }