Re: odd output in restore mode - Mailing list pgsql-hackers

From Bruce Momjian
Subject Re: odd output in restore mode
Date
Msg-id 200806302211.m5UMB3B21422@momjian.us
Whole thread Raw
In response to odd output in restore mode  (Andrew Dunstan <andrew@dunslane.net>)
List pgsql-hackers
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  <bruce@momjian.us>        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);

pgsql-hackers by date:

Previous
From: Tom Lane
Date:
Subject: Re: Fairly serious bug induced by latest guc enum changes
Next
From: Bruce Momjian
Date:
Subject: Re: odd output in restore mode