aboutsummaryrefslogtreecommitdiff
path: root/src/backend/access/transam/xlog.c
diff options
context:
space:
mode:
authorHeikki Linnakangas <heikki.linnakangas@iki.fi>2010-02-12 07:36:44 +0000
committerHeikki Linnakangas <heikki.linnakangas@iki.fi>2010-02-12 07:36:44 +0000
commit9fa01f6c8acbae4568f5e7b3d682235dd67c3a74 (patch)
treea97ff53c2cbe1a4358362faaff5813c8a6f80c83 /src/backend/access/transam/xlog.c
parent7e30c0067cffca642c3ced975a0e1814e86191b1 (diff)
downloadpostgresql-9fa01f6c8acbae4568f5e7b3d682235dd67c3a74.tar.gz
postgresql-9fa01f6c8acbae4568f5e7b3d682235dd67c3a74.zip
Check for partial WAL files in standby mode. If restore_command restores
a partial WAL file, assume it's because the file is just being copied to the archive and treat it the same as "file not found" in standby mode. pg_standby has a similar check, so it seems reasonable to have the same level of protection in the built-in standby mode.
Diffstat (limited to 'src/backend/access/transam/xlog.c')
-rw-r--r--src/backend/access/transam/xlog.c31
1 files changed, 23 insertions, 8 deletions
diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c
index ac0f6861d01..d628ec708b0 100644
--- a/src/backend/access/transam/xlog.c
+++ b/src/backend/access/transam/xlog.c
@@ -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.370 2010/02/10 08:25:25 heikki Exp $
+ * $PostgreSQL: pgsql/src/backend/access/transam/xlog.c,v 1.371 2010/02/12 07:36:44 heikki Exp $
*
*-------------------------------------------------------------------------
*/
@@ -2891,21 +2891,36 @@ RestoreArchivedFile(char *path, const char *xlogfname,
/*
* command apparently succeeded, but let's make sure the file is
* really there now and has the correct size.
- *
- * XXX I made wrong-size a fatal error to ensure the DBA would notice
- * it, but is that too strong? We could try to plow ahead with a
- * local copy of the file ... but the problem is that there probably
- * isn't one, and we'd incorrectly conclude we've reached the end of
- * WAL and we're done recovering ...
*/
if (stat(xlogpath, &stat_buf) == 0)
{
if (expectedSize > 0 && stat_buf.st_size != expectedSize)
- ereport(FATAL,
+ {
+ int elevel;
+
+ /*
+ * If we find a partial file in standby mode, we assume it's
+ * because it's just being copied to the archive, and keep
+ * trying.
+ *
+ * Otherwise treat a wrong-sized file as FATAL to ensure the
+ * DBA would notice it, but is that too strong? We could try
+ * to plow ahead with a local copy of the file ... but the
+ * problem is that there probably isn't one, and we'd
+ * incorrectly conclude we've reached the end of WAL and
+ * we're done recovering ...
+ */
+ if (StandbyMode && stat_buf.st_size < expectedSize)
+ elevel = DEBUG1;
+ else
+ elevel = FATAL;
+ ereport(elevel,
(errmsg("archive file \"%s\" has wrong size: %lu instead of %lu",
xlogfname,
(unsigned long) stat_buf.st_size,
(unsigned long) expectedSize)));
+ return false;
+ }
else
{
ereport(LOG,