Make CheckRequiredParameterValues() depend upon correct combination
authorSimon Riggs <simon@2ndQuadrant.com>
Fri, 23 Apr 2010 19:57:19 +0000 (19:57 +0000)
committerSimon Riggs <simon@2ndQuadrant.com>
Fri, 23 Apr 2010 19:57:19 +0000 (19:57 +0000)
of parameters. Fix bug report by Robert Haas that error message and
hint was incorrect if wrong mode parameters specified on master.
Internal changes only. Proposals for parameter simplification on
master/primary still under way.

src/backend/access/transam/xlog.c
src/include/catalog/pg_control.h

index f887dc28788fd83e40535b1778bf8bb226a5650b..ba839f941fc528263466ca2f4d8a9d8103ccbc7e 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.401 2010/04/20 11:15:06 rhaas Exp $
+ * $PostgreSQL: pgsql/src/backend/access/transam/xlog.c,v 1.402 2010/04/23 19:57:18 sriggs Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -5568,7 +5568,12 @@ CheckRequiredParameterValues(CheckPoint checkPoint)
    RecoveryRequiresIntParameter("max_locks_per_xact",
                          max_locks_per_xact, checkPoint.max_locks_per_xact);
 
-   if (!checkPoint.XLogStandbyInfoMode)
+   /*
+    * Hot Standby currently only depends upon the presence of WAL
+    * records as indicated by XLOG_MODE_HOT_STANDBY. There is no current
+    * dependency on whether archiving or streaming are enabled, if either.
+    */
+   if (!(checkPoint.XLogModeFlags & XLOG_MODE_HOT_STANDBY))
        ereport(ERROR,
                (errmsg("recovery connections cannot start because the recovery_connections "
                        "parameter is disabled on the WAL source server")));
@@ -7002,7 +7007,13 @@ CreateCheckPoint(int flags)
    checkPoint.MaxConnections = MaxConnections;
    checkPoint.max_prepared_xacts = max_prepared_xacts;
    checkPoint.max_locks_per_xact = max_locks_per_xact;
-   checkPoint.XLogStandbyInfoMode = XLogStandbyInfoActive();
+
+   if (XLogArchivingActive())
+       checkPoint.XLogModeFlags |= XLOG_MODE_ARCHIVING;
+   if (max_wal_senders > 0)
+       checkPoint.XLogModeFlags |= XLOG_MODE_STREAMING;
+   if (XLogRequestRecoveryConnections)
+       checkPoint.XLogModeFlags |= XLOG_MODE_HOT_STANDBY;
 
    /*
     * We must hold WALInsertLock while examining insert state to determine
index b2f4a5c5a46c1cf2878707c4db8bc684022d4512..4637610af79638accb77e67e2b4435f1a62faa30 100644 (file)
@@ -8,7 +8,7 @@
  * Portions Copyright (c) 1996-2010, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $PostgreSQL: pgsql/src/include/catalog/pg_control.h,v 1.51 2010/02/26 02:01:21 momjian Exp $
+ * $PostgreSQL: pgsql/src/include/catalog/pg_control.h,v 1.52 2010/04/23 19:57:19 sriggs Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -45,7 +45,7 @@ typedef struct CheckPoint
    int         MaxConnections;
    int         max_prepared_xacts;
    int         max_locks_per_xact;
-   bool        XLogStandbyInfoMode;
+   int         XLogModeFlags;
 
    /*
     * Oldest XID still running. This is only needed to initialize hot standby
@@ -65,6 +65,10 @@ typedef struct CheckPoint
 #define XLOG_BACKUP_END                    0x50
 #define XLOG_UNLOGGED                  0x60
 
+/* XLogModeFlags */
+#define XLOG_MODE_ARCHIVING                (1 << 0)
+#define XLOG_MODE_STREAMING                (1 << 1)
+#define XLOG_MODE_HOT_STANDBY          (1 << 2)
 
 /* System status indicator */
 typedef enum DBState