Andrew Dunstan wrote:
> 
> I have just been working on setting up a continuous recovery failover 
> system, and noticed some odd log lines, shown below. (Using 8.3).
> 
> First note that our parsing of recovery.conf in xlog.c is pretty bad, 
> and at least we need to document the quirks if it's not going to be 
> fixed. log_restartpoints is said to be boolean, but when I set it to an 
> unquoted true I got a fatal error, while a quoted 'on' sets it to false, 
> as seen. Ick. What is more, I apparently managed to get the recovery 

I have fixed the boolean problem with the attached, applied patch.  It
exposes guc.c::parse_bool() for use in xlog.c.

I assume all the other problems you reported have been corrected.

-- 
  Bruce Momjian  <[EMAIL PROTECTED]>        http://momjian.us
  EnterpriseDB                             http://enterprisedb.com

  + If your life is a hard drive, Christ can be your backup. +
Index: src/backend/access/transam/xlog.c
===================================================================
RCS file: /cvsroot/pgsql/src/backend/access/transam/xlog.c,v
retrieving revision 1.314
diff -c -c -r1.314 xlog.c
*** src/backend/access/transam/xlog.c	12 Jun 2008 09:12:30 -0000	1.314
--- src/backend/access/transam/xlog.c	30 Jun 2008 22:10:07 -0000
***************
*** 4523,4535 ****
  			/*
  			 * does nothing if a recovery_target is not also set
  			 */
! 			if (strcmp(tok2, "true") == 0)
! 				recoveryTargetInclusive = true;
! 			else
! 			{
! 				recoveryTargetInclusive = false;
! 				tok2 = "false";
! 			}
  			ereport(LOG,
  					(errmsg("recovery_target_inclusive = %s", tok2)));
  		}
--- 4523,4532 ----
  			/*
  			 * does nothing if a recovery_target is not also set
  			 */
! 			if (!parse_bool(tok2, &recoveryTargetInclusive))
! 				  ereport(ERROR,
! 							(errcode(ERRCODE_INVALID_PARAMETER_VALUE),
! 					  errmsg("parameter \"recovery_target_inclusive\" requires a Boolean value")));
  			ereport(LOG,
  					(errmsg("recovery_target_inclusive = %s", tok2)));
  		}
***************
*** 4538,4550 ****
  			/*
  			 * does nothing if a recovery_target is not also set
  			 */
! 			if (strcmp(tok2, "true") == 0)
! 				recoveryLogRestartpoints = true;
! 			else
! 			{
! 				recoveryLogRestartpoints = false;
! 				tok2 = "false";
! 			}
  			ereport(LOG,
  					(errmsg("log_restartpoints = %s", tok2)));
  		}
--- 4535,4544 ----
  			/*
  			 * does nothing if a recovery_target is not also set
  			 */
! 			if (!parse_bool(tok2, &recoveryLogRestartpoints))
! 				  ereport(ERROR,
! 							(errcode(ERRCODE_INVALID_PARAMETER_VALUE),
! 					  errmsg("parameter \"log_restartpoints\" requires a Boolean value")));
  			ereport(LOG,
  					(errmsg("log_restartpoints = %s", tok2)));
  		}
Index: src/backend/utils/misc/guc.c
===================================================================
RCS file: /cvsroot/pgsql/src/backend/utils/misc/guc.c,v
retrieving revision 1.457
diff -c -c -r1.457 guc.c
*** src/backend/utils/misc/guc.c	30 Jun 2008 10:58:47 -0000	1.457
--- src/backend/utils/misc/guc.c	30 Jun 2008 22:10:07 -0000
***************
*** 3991,3997 ****
   * If the string parses okay, return true, else false.
   * If okay and result is not NULL, return the value in *result.
   */
! static bool
  parse_bool(const char *value, bool *result)
  {
  	size_t		len = strlen(value);
--- 3991,3997 ----
   * If the string parses okay, return true, else false.
   * If okay and result is not NULL, return the value in *result.
   */
! bool
  parse_bool(const char *value, bool *result)
  {
  	size_t		len = strlen(value);
Index: src/include/utils/guc.h
===================================================================
RCS file: /cvsroot/pgsql/src/include/utils/guc.h,v
retrieving revision 1.96
diff -c -c -r1.96 guc.h
*** src/include/utils/guc.h	28 May 2008 09:04:06 -0000	1.96
--- src/include/utils/guc.h	30 Jun 2008 22:10:07 -0000
***************
*** 223,228 ****
--- 223,229 ----
  extern void AtEOXact_GUC(bool isCommit, int nestLevel);
  extern void BeginReportingGUCOptions(void);
  extern void ParseLongOption(const char *string, char **name, char **value);
+ extern bool parse_bool(const char *value, bool *result);
  extern bool set_config_option(const char *name, const char *value,
  				  GucContext context, GucSource source,
  				  GucAction action, bool changeVal);
-- 
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

Reply via email to