Bruce Momjian wrote:
> 
> I can confirm this bug report now.  I see it happens with:
> 
>       pg_ctl -D /u/pg/data restart
> 
> You have to use '-D' and 'restart' to cause -D to duplicate in
> postmaster.opts on every restart.  It should be fixed because excessive
> restarts could exceed the maximum command length, causing the server not
> to restart.
> 
> The problem was actually introduced here:
>       
>       revision 1.31
>       date: 2003/02/14 22:18:25;  author: momjian;  state: Exp;  lines: +7 -4
>       Propogate pg_ctl -D to the postmaster as a -D flag for identification by
>       ps for multiple postmasters, for Kevin Brown.
> 
> It added -D to the command line so 'ps' showed it, rather than just
> passing it via PGDATA.  Of course on restart we should not be adding it
> again.
> 
> I am attaching a patch which fixes the problem by not adding the -D
> display addition when doing a restart.  It is not needed for restart
> because the -D comes from the postmaster.opts file.
> 
> We are packaging 7.4.5 now so I will wait to apply this after the
> release.

Patch applied.  It will appear in 7.4.6.

> Looking at 8.0 CVS, I see we are no longer adding the -D argument to
> postmaster start, meaning 'ps' will not display the -D to distinguish
> multiple postmasters.  Seems I should fix that too.

I have applied the following patch to propogate pg_ctl -D to the
postmaster command line.  This worked in 7.4.X and should continue
working in 8.0.

-- 
  Bruce Momjian                        |  http://candle.pha.pa.us
  [EMAIL PROTECTED]               |  (610) 359-1001
  +  If your life is a hard drive,     |  13 Roberts Road
  +  Christ can be your backup.        |  Newtown Square, Pennsylvania 19073
Index: src/bin/pg_ctl/pg_ctl.c
===================================================================
RCS file: /cvsroot/pgsql-server/src/bin/pg_ctl/pg_ctl.c,v
retrieving revision 1.26
diff -c -c -r1.26 pg_ctl.c
*** src/bin/pg_ctl/pg_ctl.c     28 Aug 2004 21:01:38 -0000      1.26
--- src/bin/pg_ctl/pg_ctl.c     28 Aug 2004 21:57:29 -0000
***************
*** 67,72 ****
--- 67,73 ----
  static int    sig = SIGTERM;  /* default */
  static CtlCommand ctl_command = NO_COMMAND;
  static char *pg_data = NULL;
+ static char *pgdata_opt = NULL;
  static char *post_opts = NULL;
  static const char *progname;
  static char *log_file = NULL;
***************
*** 309,327 ****
         */
        if (log_file != NULL)
  #ifndef WIN32
!               snprintf(cmd, MAXPGPATH, "%s\"%s\" %s < \"%s\" >> \"%s\" 2>&1 &%s",
  #else
!               snprintf(cmd, MAXPGPATH, "%sSTART /B \"\" \"%s\" %s < \"%s\" >> \"%s\" 
2>&1%s",
  #endif
!                                SYSTEMQUOTE, postgres_path, post_opts, DEVNULL, 
log_file,
!                                SYSTEMQUOTE);
        else
  #ifndef WIN32
!               snprintf(cmd, MAXPGPATH, "%s\"%s\" %s < \"%s\" 2>&1 &%s",
  #else
!               snprintf(cmd, MAXPGPATH, "%sSTART /B \"\" \"%s\" %s < \"%s\" 2>&1%s",
  #endif
!                                SYSTEMQUOTE, postgres_path, post_opts, DEVNULL, 
SYSTEMQUOTE);
  
        return system(cmd);
  }
--- 310,329 ----
         */
        if (log_file != NULL)
  #ifndef WIN32
!               snprintf(cmd, MAXPGPATH, "%s\"%s\" %s%s < \"%s\" >> \"%s\" 2>&1 &%s",
  #else
!               snprintf(cmd, MAXPGPATH, "%sSTART /B \"\" \"%s\" %s%s < \"%s\" >> 
\"%s\" 2>&1%s",
  #endif
!                               SYSTEMQUOTE, postgres_path, pgdata_opt, post_opts,
!                               DEVNULL, log_file, SYSTEMQUOTE);
        else
  #ifndef WIN32
!               snprintf(cmd, MAXPGPATH, "%s\"%s\" %s%s < \"%s\" 2>&1 &%s",
  #else
!               snprintf(cmd, MAXPGPATH, "%sSTART /B \"\" \"%s\" %s%s < \"%s\" 2>&1%s",
  #endif
!                               SYSTEMQUOTE, postgres_path, pgdata_opt, post_opts,
!                               DEVNULL, SYSTEMQUOTE);
  
        return system(cmd);
  }
***************
*** 494,499 ****
--- 496,505 ----
                }
        }
  
+       /* No -D or -D already added during server start */
+       if (ctl_command == RESTART_COMMAND || pgdata_opt == NULL)
+               pgdata_opt = "";        
+       
        if (postgres_path == NULL)
        {
                char       *postmaster_path;
***************
*** 1210,1215 ****
--- 1216,1224 ----
                                        env_var = xmalloc(len + 8);
                                        snprintf(env_var, len + 8, "PGDATA=%s", 
optarg);
                                        putenv(env_var);
+                                       /* Show -D for easier postmaster 'ps' 
identification */
+                                       pgdata_opt = xmalloc(len + 7);
+                                       snprintf(pgdata_opt, len + 7, "-D \"%s\" ", 
optarg);
                                        break;
                                }
                                case 'l':
---------------------------(end of broadcast)---------------------------
TIP 9: the planner will ignore your desire to choose an index scan if your
      joining column's datatypes do not match

Reply via email to