Fix pg_ctl restart bug - Mailing list pgsql-patches

From Bruce Momjian
Subject Fix pg_ctl restart bug
Date
Msg-id 200806260247.m5Q2l7906260@momjian.us
Whole thread Raw
Responses Re: Fix pg_ctl restart bug  (Tom Lane <tgl@sss.pgh.pa.us>)
List pgsql-patches
We document 'pg_ctl restart' to preserve any command-line arguments
passed when the server was started:

    Restarting the server is almost equivalent to stopping the
    server and starting it again except that <command>pg_ctl</command>
    saves and reuses the command line options that were passed
    to the previously running instance.  To restart

However, as of 2004-10-15, this has not worked.  :-(  The attached patch
is the one that caused the bug --- on non-Unix systems, SYSTEMQUOTE is
"", meaning zero-length string.  I should have seen the bug when I
applied the contributed patch in 2004.

The second attached applied patch fixes the problem.

--
  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/postmaster/postmaster.c
===================================================================
RCS file: /cvsroot/pgsql/src/backend/postmaster/postmaster.c,v
retrieving revision 1.433
retrieving revision 1.434
diff -c -r1.433 -r1.434
*** src/backend/postmaster/postmaster.c    14 Oct 2004 20:23:45 -0000    1.433
--- src/backend/postmaster/postmaster.c    15 Oct 2004 04:54:31 -0000    1.434
***************
*** 3301,3307 ****

      fprintf(fp, "%s", fullprogname);
      for (i = 1; i < argc; i++)
!         fprintf(fp, " '%s'", argv[i]);
      fputs("\n", fp);

      if (fclose(fp))
--- 3301,3307 ----

      fprintf(fp, "%s", fullprogname);
      for (i = 1; i < argc; i++)
!         fprintf(fp, " %s%s%s", SYSTEMQUOTE, argv[i], SYSTEMQUOTE);
      fputs("\n", fp);

      if (fclose(fp))
Index: src/bin/pg_ctl/pg_ctl.c
===================================================================
RCS file: /cvsroot/pgsql/src/bin/pg_ctl/pg_ctl.c,v
retrieving revision 1.37
retrieving revision 1.38
diff -c -r1.37 -r1.38
*** src/bin/pg_ctl/pg_ctl.c    15 Oct 2004 04:32:14 -0000    1.37
--- src/bin/pg_ctl/pg_ctl.c    15 Oct 2004 04:54:33 -0000    1.38
***************
*** 501,507 ****
              {
                  char       *arg1;

!                 arg1 = strchr(optline, '\'');
                  if (arg1 == NULL || arg1 == optline)
                      post_opts = "";
                  else
--- 501,507 ----
              {
                  char       *arg1;

!                 arg1 = strchr(optline, *SYSTEMQUOTE);
                  if (arg1 == NULL || arg1 == optline)
                      post_opts = "";
                  else
Index: src/backend/postmaster/postmaster.c
===================================================================
RCS file: /cvsroot/pgsql/src/backend/postmaster/postmaster.c,v
retrieving revision 1.560
diff -c -c -r1.560 postmaster.c
*** src/backend/postmaster/postmaster.c    26 Jun 2008 01:35:45 -0000    1.560
--- src/backend/postmaster/postmaster.c    26 Jun 2008 02:41:04 -0000
***************
*** 4184,4190 ****

      fprintf(fp, "%s", fullprogname);
      for (i = 1; i < argc; i++)
!         fprintf(fp, " " SYSTEMQUOTE "%s" SYSTEMQUOTE, argv[i]);
      fputs("\n", fp);

      if (fclose(fp))
--- 4184,4190 ----

      fprintf(fp, "%s", fullprogname);
      for (i = 1; i < argc; i++)
!         fprintf(fp, " \"%s\"", argv[i]);
      fputs("\n", fp);

      if (fclose(fp))
Index: src/bin/pg_ctl/pg_ctl.c
===================================================================
RCS file: /cvsroot/pgsql/src/bin/pg_ctl/pg_ctl.c,v
retrieving revision 1.100
diff -c -c -r1.100 pg_ctl.c
*** src/bin/pg_ctl/pg_ctl.c    26 Jun 2008 01:35:45 -0000    1.100
--- src/bin/pg_ctl/pg_ctl.c    26 Jun 2008 02:41:04 -0000
***************
*** 573,583 ****
  {
      if (post_opts == NULL)
      {
-         char      **optlines;
-
          post_opts = "";        /* defatult */
          if (ctl_command == RESTART_COMMAND)
          {
              optlines = readfile(postopts_file);
              if (optlines == NULL)
              {
--- 573,583 ----
  {
      if (post_opts == NULL)
      {
          post_opts = "";        /* defatult */
          if (ctl_command == RESTART_COMMAND)
          {
+             char      **optlines;
+
              optlines = readfile(postopts_file);
              if (optlines == NULL)
              {
***************
*** 593,612 ****
              else
              {
                  int            len;
!                 char       *optline = NULL;
                  char       *arg1;

                  optline = optlines[0];
                  len = strcspn(optline, "\r\n");
                  optline[len] = '\0';

!                 arg1 = strchr(optline, *SYSTEMQUOTE);
!                 if (arg1 == NULL || arg1 == optline)
!                     post_opts = "";
!                 else
                  {
!                     *(arg1 - 1) = '\0'; /* this should be a space */
!                     post_opts = arg1;
                  }
                  if (postgres_path != NULL)
                      postgres_path = optline;
--- 593,618 ----
              else
              {
                  int            len;
!                 char       *optline;
                  char       *arg1;

                  optline = optlines[0];
+                 /* trim off line endings */
                  len = strcspn(optline, "\r\n");
                  optline[len] = '\0';

!                 for (arg1 = optline; *arg1; arg1++)
                  {
!                     /*
!                      * Are we at the first option, as defined by space,
!                      * double-quote, and a dash?
!                      */
!                     if (*arg1 == ' ' && *(arg1+1) == '"' && *(arg1+2) == '-')
!                     {
!                         *arg1 = '\0';    /* terminate so we get only program name */
!                         post_opts = arg1 + 1; /* point past whitespace */
!                         break;
!                     }
                  }
                  if (postgres_path != NULL)
                      postgres_path = optline;

pgsql-patches by date:

Previous
From: Bruce Momjian
Date:
Subject: Re: [BUGS] BUG #4128: The postmaster.opts.default file is begin ignored
Next
From: Tom Lane
Date:
Subject: Re: Fix pg_ctl restart bug