Augment WAL records for btree delete with GetOldestXmin() to reduce
authorSimon Riggs <simon@2ndQuadrant.com>
Fri, 29 Jan 2010 18:39:05 +0000 (18:39 +0000)
committerSimon Riggs <simon@2ndQuadrant.com>
Fri, 29 Jan 2010 18:39:05 +0000 (18:39 +0000)
false positives during Hot Standby conflict processing. Simple
patch to enhance conflict processing, following previous discussions.
Controlled by parameter minimize_standby_conflicts = on | off, with
default off allows measurement of performance impact to see whether
it should be set on all the time.

doc/src/sgml/config.sgml
src/backend/access/nbtree/nbtpage.c
src/backend/access/transam/xlog.c
src/backend/utils/misc/guc.c
src/backend/utils/misc/postgresql.conf.sample
src/include/access/xlog.h

index 71097ee21c8c7c373fcdce8789e89e9e68e45cd0..c8c30c984155c323ce8551c235c9d2ce018bf825 100644 (file)
@@ -1,4 +1,4 @@
-<!-- $PostgreSQL: pgsql/doc/src/sgml/config.sgml,v 1.246 2010/01/26 16:33:40 tgl Exp $ -->
+<!-- $PostgreSQL: pgsql/doc/src/sgml/config.sgml,v 1.247 2010/01/29 18:39:05 sriggs Exp $ -->
 
 <chapter Id="runtime-config">
   <title>Server Configuration</title>
@@ -1840,6 +1840,22 @@ archive_command = 'copy "%p" "C:\\server\\archivedir\\%f"'  # Windows
       </listitem>
      </varlistentry>
 
+     <varlistentry id="minimize-standby-conflicts" xreflabel="minimize_standby_conflicts">
+      <term><varname>minimize_standby_conflicts</varname> (<type>boolean</type>)</term>
+      <indexterm>
+       <primary><varname>minimize_standby_conflicts</> configuration parameter</primary>
+      </indexterm>
+      <listitem>
+       <para>
+        Generates additional information to the transaction log (WAL) to minimize
+        the number of false positive cancelations caused by recovery conflicts on
+        a standby server that consumes WAL data from this server.
+        There is additional performance cost to enabling this parameter.
+        Parameter has no effect during recovery, only in normal running.
+       </para>
+      </listitem>
+     </varlistentry>
+
      </variablelist>
     </sect2>
    </sect1>
index 7cd76e10cf30a811ba0a7dd50df659bb43935141..5fa4724602f1ab4fc1763bce752325fc94531c1d 100644 (file)
@@ -9,7 +9,7 @@
  *
  *
  * IDENTIFICATION
- *   $PostgreSQL: pgsql/src/backend/access/nbtree/nbtpage.c,v 1.115 2010/01/02 16:57:35 momjian Exp $
+ *   $PostgreSQL: pgsql/src/backend/access/nbtree/nbtpage.c,v 1.116 2010/01/29 18:39:05 sriggs Exp $
  *
  * NOTES
  *    Postgres btree pages look like ordinary relation pages.  The opaque
@@ -29,6 +29,7 @@
 #include "storage/freespace.h"
 #include "storage/indexfsm.h"
 #include "storage/lmgr.h"
+#include "storage/procarray.h"
 #include "utils/inval.h"
 #include "utils/snapmgr.h"
 
@@ -671,9 +672,18 @@ _bt_delitems(Relation rel, Buffer buf,
 {
    Page        page = BufferGetPage(buf);
    BTPageOpaque opaque;
+   TransactionId latestRemovedXid = InvalidTransactionId;
 
    Assert(isVacuum || lastBlockVacuumed == 0);
 
+   /*
+    * If allowed, calculate an accurate latestRemovedXid, otherwise
+    * pass InvalidTransactionId which can cause false positive
+    * conflicts to be assessed when we replay this WAL record.
+    */
+   if (!isVacuum && XLogStandbyInfoActive() && MinimizeStandbyConflicts)
+       latestRemovedXid = GetOldestXmin(false, true);
+
    /* No ereport(ERROR) until changes are logged */
    START_CRIT_SECTION();
 
@@ -721,13 +731,7 @@ _bt_delitems(Relation rel, Buffer buf,
            xlrec_delete.node = rel->rd_node;
            xlrec_delete.block = BufferGetBlockNumber(buf);
 
-           /*
-            * XXX: We would like to set an accurate latestRemovedXid, but
-            * there is no easy way of obtaining a useful value. So we punt
-            * and store InvalidTransactionId, which forces the standby to
-            * wait for/cancel all currently running transactions.
-            */
-           xlrec_delete.latestRemovedXid = InvalidTransactionId;
+           xlrec_delete.latestRemovedXid = latestRemovedXid;
            rdata[0].data = (char *) &xlrec_delete;
            rdata[0].len = SizeOfBtreeDelete;
        }
index 5bee1d8837d260fcacfaed6466eeb5c765ca4120..8aa7976e3e3ca37c398b9a9e5399d814c44e25e7 100644 (file)
@@ -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/backend/access/transam/xlog.c,v 1.364 2010/01/28 19:17:22 heikki Exp $
+ * $PostgreSQL: pgsql/src/backend/access/transam/xlog.c,v 1.365 2010/01/29 18:39:05 sriggs Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -71,6 +71,7 @@ bool      XLogArchiveMode = false;
 char      *XLogArchiveCommand = NULL;
 bool       XLogRequestRecoveryConnections = true;
 int            MaxStandbyDelay = 30;
+bool       MinimizeStandbyConflicts = false;
 bool       fullPageWrites = true;
 bool       log_checkpoints = false;
 int            sync_method = DEFAULT_SYNC_METHOD;
index 00ea55d597906ec0ac1bdd265b629b0690fc7055..adf9f72b3596aa7ea8e9f05559034b5cf217a694 100644 (file)
@@ -10,7 +10,7 @@
  * Written by Peter Eisentraut <peter_e@gmx.net>.
  *
  * IDENTIFICATION
- *   $PostgreSQL: pgsql/src/backend/utils/misc/guc.c,v 1.536 2010/01/26 16:33:40 tgl Exp $
+ *   $PostgreSQL: pgsql/src/backend/utils/misc/guc.c,v 1.537 2010/01/29 18:39:05 sriggs Exp $
  *
  *--------------------------------------------------------------------
  */
@@ -1222,6 +1222,17 @@ static struct config_bool ConfigureNamesBool[] =
        true, NULL, NULL
    },
 
+   {
+       {"minimize_standby_conflicts", PGC_POSTMASTER, WAL_SETTINGS,
+           gettext_noop("Additional information is added to WAL records to"
+                        " minimize the number of false positive cancelations"
+                        " caused by recovery conflicts on WAL standby nodes."),
+           NULL
+       },
+       &MinimizeStandbyConflicts,
+       false, NULL, NULL
+   },
+
    {
        {"allow_system_table_mods", PGC_POSTMASTER, DEVELOPER_OPTIONS,
            gettext_noop("Allows modifications of the structure of system tables."),
index 95cab4d64fd61a9ad1b92997e6f86cb361e679e8..928ccc76edf85a011c7ed87fdde64cbc4857b728 100644 (file)
 #archive_timeout = 0       # force a logfile segment switch after this
                # number of seconds; 0 disables
 
+# - Hot Standby -
+
 #recovery_connections = on # allows connections during recovery
+#minimize_standby_conflicts = on # additional WAL info to avoid conflicts
 #max_standby_delay = 30        # max acceptable standby lag (s) to help queries
                # complete without conflict; -1 disables
 
index d7aeb2fe06bedbdc8b085760cd0631db5a86e608..546452f282f30fac6e1375b510990a318ae09fda 100644 (file)
@@ -6,7 +6,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/xlog.h,v 1.99 2010/01/28 07:31:42 heikki Exp $
+ * $PostgreSQL: pgsql/src/include/access/xlog.h,v 1.100 2010/01/29 18:39:05 sriggs Exp $
  */
 #ifndef XLOG_H
 #define XLOG_H
@@ -183,6 +183,7 @@ extern int  XLogArchiveTimeout;
 extern bool log_checkpoints;
 extern bool XLogRequestRecoveryConnections;
 extern int MaxStandbyDelay;
+extern bool MinimizeStandbyConflicts;
 
 #define XLogArchivingActive()  (XLogArchiveMode)
 #define XLogArchiveCommandSet() (XLogArchiveCommand[0] != '\0')