Commit 6d2bc0a6 authored by Simon Riggs's avatar Simon Riggs

Augment WAL records for btree delete with GetOldestXmin() to reduce

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.
parent d0cfc018
<!-- $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"> <chapter Id="runtime-config">
<title>Server Configuration</title> <title>Server Configuration</title>
...@@ -1840,6 +1840,22 @@ archive_command = 'copy "%p" "C:\\server\\archivedir\\%f"' # Windows ...@@ -1840,6 +1840,22 @@ archive_command = 'copy "%p" "C:\\server\\archivedir\\%f"' # Windows
</listitem> </listitem>
</varlistentry> </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> </variablelist>
</sect2> </sect2>
</sect1> </sect1>
......
...@@ -9,7 +9,7 @@ ...@@ -9,7 +9,7 @@
* *
* *
* IDENTIFICATION * 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 * NOTES
* Postgres btree pages look like ordinary relation pages. The opaque * Postgres btree pages look like ordinary relation pages. The opaque
...@@ -29,6 +29,7 @@ ...@@ -29,6 +29,7 @@
#include "storage/freespace.h" #include "storage/freespace.h"
#include "storage/indexfsm.h" #include "storage/indexfsm.h"
#include "storage/lmgr.h" #include "storage/lmgr.h"
#include "storage/procarray.h"
#include "utils/inval.h" #include "utils/inval.h"
#include "utils/snapmgr.h" #include "utils/snapmgr.h"
...@@ -671,9 +672,18 @@ _bt_delitems(Relation rel, Buffer buf, ...@@ -671,9 +672,18 @@ _bt_delitems(Relation rel, Buffer buf,
{ {
Page page = BufferGetPage(buf); Page page = BufferGetPage(buf);
BTPageOpaque opaque; BTPageOpaque opaque;
TransactionId latestRemovedXid = InvalidTransactionId;
Assert(isVacuum || lastBlockVacuumed == 0); 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 */ /* No ereport(ERROR) until changes are logged */
START_CRIT_SECTION(); START_CRIT_SECTION();
...@@ -721,13 +731,7 @@ _bt_delitems(Relation rel, Buffer buf, ...@@ -721,13 +731,7 @@ _bt_delitems(Relation rel, Buffer buf,
xlrec_delete.node = rel->rd_node; xlrec_delete.node = rel->rd_node;
xlrec_delete.block = BufferGetBlockNumber(buf); xlrec_delete.block = BufferGetBlockNumber(buf);
/* xlrec_delete.latestRemovedXid = latestRemovedXid;
* 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;
rdata[0].data = (char *) &xlrec_delete; rdata[0].data = (char *) &xlrec_delete;
rdata[0].len = SizeOfBtreeDelete; rdata[0].len = SizeOfBtreeDelete;
} }
......
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
* Portions Copyright (c) 1996-2010, PostgreSQL Global Development Group * Portions Copyright (c) 1996-2010, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California * 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; ...@@ -71,6 +71,7 @@ bool XLogArchiveMode = false;
char *XLogArchiveCommand = NULL; char *XLogArchiveCommand = NULL;
bool XLogRequestRecoveryConnections = true; bool XLogRequestRecoveryConnections = true;
int MaxStandbyDelay = 30; int MaxStandbyDelay = 30;
bool MinimizeStandbyConflicts = false;
bool fullPageWrites = true; bool fullPageWrites = true;
bool log_checkpoints = false; bool log_checkpoints = false;
int sync_method = DEFAULT_SYNC_METHOD; int sync_method = DEFAULT_SYNC_METHOD;
......
...@@ -10,7 +10,7 @@ ...@@ -10,7 +10,7 @@
* Written by Peter Eisentraut <peter_e@gmx.net>. * Written by Peter Eisentraut <peter_e@gmx.net>.
* *
* IDENTIFICATION * 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[] = ...@@ -1222,6 +1222,17 @@ static struct config_bool ConfigureNamesBool[] =
true, NULL, NULL 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, {"allow_system_table_mods", PGC_POSTMASTER, DEVELOPER_OPTIONS,
gettext_noop("Allows modifications of the structure of system tables."), gettext_noop("Allows modifications of the structure of system tables."),
......
...@@ -181,7 +181,10 @@ ...@@ -181,7 +181,10 @@
#archive_timeout = 0 # force a logfile segment switch after this #archive_timeout = 0 # force a logfile segment switch after this
# number of seconds; 0 disables # number of seconds; 0 disables
# - Hot Standby -
#recovery_connections = on # allows connections during recovery #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 #max_standby_delay = 30 # max acceptable standby lag (s) to help queries
# complete without conflict; -1 disables # complete without conflict; -1 disables
......
...@@ -6,7 +6,7 @@ ...@@ -6,7 +6,7 @@
* Portions Copyright (c) 1996-2010, PostgreSQL Global Development Group * Portions Copyright (c) 1996-2010, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California * 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 #ifndef XLOG_H
#define XLOG_H #define XLOG_H
...@@ -183,6 +183,7 @@ extern int XLogArchiveTimeout; ...@@ -183,6 +183,7 @@ extern int XLogArchiveTimeout;
extern bool log_checkpoints; extern bool log_checkpoints;
extern bool XLogRequestRecoveryConnections; extern bool XLogRequestRecoveryConnections;
extern int MaxStandbyDelay; extern int MaxStandbyDelay;
extern bool MinimizeStandbyConflicts;
#define XLogArchivingActive() (XLogArchiveMode) #define XLogArchivingActive() (XLogArchiveMode)
#define XLogArchiveCommandSet() (XLogArchiveCommand[0] != '\0') #define XLogArchiveCommandSet() (XLogArchiveCommand[0] != '\0')
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment