提交 6d2bc0a6 编写于 作者: S 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.
上级 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">
<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>
......
......@@ -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;
}
......
......@@ -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;
......
......@@ -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."),
......
......@@ -181,7 +181,10 @@
#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
......
......@@ -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')
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册