ignore_invalid_pages_v2.patch
application/octet-stream
Filename: ignore_invalid_pages_v2.patch
Type: application/octet-stream
Part: 0
Patch
Format: unified
Series: patch v2
| File | + | − |
|---|---|---|
| doc/src/sgml/config.sgml | 23 | 0 |
| src/backend/access/transam/xlogutils.c | 7 | 2 |
| src/backend/utils/misc/guc.c | 19 | 0 |
diff --git a/doc/src/sgml/config.sgml b/doc/src/sgml/config.sgml
index 5d1c90282f..be346eb06e 100644
--- a/doc/src/sgml/config.sgml
+++ b/doc/src/sgml/config.sgml
@@ -9928,6 +9928,29 @@ LOG: CleanUpLock: deleting: lock(0xb7acd844) id(24688,24696,0,0,0,1)
</listitem>
</varlistentry>
+ <varlistentry id="guc-ignore-invalid-pages" xreflabel="ignore_invalid_pages">
+ <term><varname>ignore_invalid_pages</varname> (<type>boolean</type>)
+ <indexterm>
+ <primary><varname>ignore_invalid_pages</varname> configuration parameter</primary>
+ </indexterm>
+ </term>
+ <listitem>
+ <para>
+ Detection of WAL records having references to invalid pages during
+ recovery causes <productname>PostgreSQL</productname> to report
+ an error, aborting the recovery. Setting
+ <varname>ignore_invalid_pages</varname> to <literal>on</literal>
+ causes the system to ignore the failure (but still report a warning),
+ and continue recovery. This behavior may <emphasis>cause crashes,
+ data loss, propagate or hide corruption, or other serious
+ problems</emphasis>. However, it may allow you to get past the error,
+ to finish the recovery, and to cause the server to start up.
+ The default setting is <literal>off</literal>, and it can only be
+ set at server start.
+ </para>
+ </listitem>
+ </varlistentry>
+
<varlistentry id="guc-jit-debugging-support" xreflabel="jit_debugging_support">
<term><varname>jit_debugging_support</varname> (<type>boolean</type>)
<indexterm>
diff --git a/src/backend/access/transam/xlogutils.c b/src/backend/access/transam/xlogutils.c
index 14efbf37d6..fa8e7f57d1 100644
--- a/src/backend/access/transam/xlogutils.c
+++ b/src/backend/access/transam/xlogutils.c
@@ -31,6 +31,9 @@
#include "utils/rel.h"
+/* GUC variable */
+bool ignore_invalid_pages = false;
+
/*
* During XLOG replay, we may see XLOG records for incremental updates of
* pages that no longer exist, because their relation was later dropped or
@@ -93,7 +96,8 @@ log_invalid_page(RelFileNode node, ForkNumber forkno, BlockNumber blkno,
if (reachedConsistency)
{
report_invalid_page(WARNING, node, forkno, blkno, present);
- elog(PANIC, "WAL contains references to invalid pages");
+ elog(ignore_invalid_pages ? WARNING : PANIC,
+ "WAL contains references to invalid pages");
}
/*
@@ -240,7 +244,8 @@ XLogCheckInvalidPages(void)
}
if (foundone)
- elog(PANIC, "WAL contains references to invalid pages");
+ elog(ignore_invalid_pages ? WARNING : PANIC,
+ "WAL contains references to invalid pages");
hash_destroy(invalid_page_tab);
invalid_page_tab = NULL;
diff --git a/src/backend/utils/misc/guc.c b/src/backend/utils/misc/guc.c
index 8d951ce404..465a5bcac3 100644
--- a/src/backend/utils/misc/guc.c
+++ b/src/backend/utils/misc/guc.c
@@ -123,6 +123,7 @@ extern int CommitSiblings;
extern char *default_tablespace;
extern char *temp_tablespaces;
extern bool ignore_checksum_failure;
+extern bool ignore_invalid_pages;
extern bool synchronize_seqscans;
#ifdef TRACE_SYNCSCAN
@@ -1168,6 +1169,24 @@ static struct config_bool ConfigureNamesBool[] =
false,
NULL, NULL, NULL
},
+ {
+ {"ignore_invalid_pages", PGC_POSTMASTER, DEVELOPER_OPTIONS,
+ gettext_noop("Continues recovery after an invalid pages failure."),
+ gettext_noop("Detection of WAL records having references to "
+ "invalid pages during recovery causes PostgreSQL to "
+ "report an error, aborting the recovery. Setting "
+ "ignore_invalid_pages to true causes the system to "
+ "ignore the failure (but still report a warning), "
+ "and continue recovery. This behavior may cause "
+ "crashes, data loss, propagate or hide corruption, "
+ "or other serious problems. Only has "
+ "an effect during recovery."),
+ GUC_NOT_IN_SAMPLE
+ },
+ &ignore_invalid_pages,
+ false,
+ NULL, NULL, NULL
+ },
{
{"full_page_writes", PGC_SIGHUP, WAL_SETTINGS,
gettext_noop("Writes full pages to WAL when first modified after a checkpoint."),