Fix elog logic so that error messages displayed during initdb (or
authorTom Lane
Sat, 25 Nov 2000 19:09:22 +0000 (19:09 +0000)
committerTom Lane
Sat, 25 Nov 2000 19:09:22 +0000 (19:09 +0000)
other standalone-backend situations) are not duplicated.  Remove some
dead code, add some comments, too.

src/backend/utils/error/elog.c

index 9b8c2fd21c83467c5e01bfc2b067c8f87cc23f76..fcd8613a7dcba0ddaf4e1a372b266d958f519b7d 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *   $Header: /cvsroot/pgsql/src/backend/utils/error/elog.c,v 1.68 2000/11/25 04:38:00 momjian Exp $
+ *   $Header: /cvsroot/pgsql/src/backend/utils/error/elog.c,v 1.69 2000/11/25 19:09:22 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -77,7 +77,6 @@ static const char * print_timestamp(void);
 static const char * print_pid(void);
 
 static int Debugfile = -1;
-static int Err_file = -1;
 static int ElogDebugIndentLevel = 0;
 
 /*--------------------
@@ -329,6 +328,7 @@ elog(int lev, const char *fmt, ...)
     */
 
 #ifdef ENABLE_SYSLOG
+   /* Write to syslog, if enabled */
    if (Use_syslog >= 1)
    {
        int syslog_level;
@@ -364,31 +364,11 @@ elog(int lev, const char *fmt, ...)
 
    len = strlen(msg_buf);
 
+   /* Write to debug file, if open and enabled */
+   /* NOTE: debug file is typically pointed at stderr */
    if (Debugfile >= 0 && Use_syslog <= 1)
        write(Debugfile, msg_buf, len);
 
-   /*
-    * If there's an error log file other than our channel to the
-    * front-end program, write to it first.  This is important because
-    * there's a bug in the socket code on ultrix.  If the front end has
-    * gone away (so the channel to it has been closed at the other end),
-    * then writing here can cause this backend to exit without warning
-    * that is, write() does an exit(). In this case, our only hope of
-    * finding out what's going on is if Err_file was set to some disk
-    * log.  This is a major pain.  (It's probably also long-dead code...
-    * does anyone still use ultrix?)
-    */
-   if (lev > DEBUG && Err_file >= 0 &&
-       Debugfile != Err_file && Use_syslog <= 1)
-   {
-       if (write(Err_file, msg_buf, len) < 0)
-       {
-           write(open("/dev/console", O_WRONLY, 0666), msg_buf, len);
-           lev = REALLYFATAL;
-       }
-       fsync(Err_file);
-   }
-
 #ifndef PG_STANDALONE
 
    if (lev > DEBUG && whereToSendOutput == Remote)
@@ -429,9 +409,11 @@ elog(int lev, const char *fmt, ...)
 
        /*
         * We are running as an interactive backend, so just send the
-        * message to stderr.
+        * message to stderr.  But don't send a duplicate if Debugfile
+        * write, above, already sent to stderr.
         */
-       fputs(msg_buf, stderr);
+       if (Debugfile != fileno(stderr))
+           fputs(msg_buf, stderr);
    }
 
 #endif  /* !PG_STANDALONE */
@@ -511,11 +493,16 @@ DebugFileOpen(void)
    int         fd,
                istty;
 
-   Err_file = Debugfile = -1;
+   Debugfile = -1;
    ElogDebugIndentLevel = 0;
 
    if (OutputFileName[0])
    {
+       /*
+        * A debug-output file name was given.
+        *
+        * Make sure we can write the file, and find out if it's a tty.
+        */
        if ((fd = open(OutputFileName, O_CREAT | O_APPEND | O_WRONLY,
                       0666)) < 0)
            elog(FATAL, "DebugFileOpen: open of %s: %m",
@@ -523,21 +510,23 @@ DebugFileOpen(void)
        istty = isatty(fd);
        close(fd);
 
+       /*
+        * Redirect our stderr to the debug output file.
+        */
+       if (!freopen(OutputFileName, "a", stderr))
+           elog(FATAL, "DebugFileOpen: %s reopen as stderr: %m",
+                OutputFileName);
+       Debugfile = fileno(stderr);
        /*
         * If the file is a tty and we're running under the postmaster,
         * try to send stdout there as well (if it isn't a tty then stderr
         * will block out stdout, so we may as well let stdout go wherever
         * it was going before).
         */
-       if (istty &&
-           IsUnderPostmaster &&
-           !freopen(OutputFileName, "a", stdout))
-           elog(FATAL, "DebugFileOpen: %s reopen as stdout: %m",
-                OutputFileName);
-       if (!freopen(OutputFileName, "a", stderr))
-           elog(FATAL, "DebugFileOpen: %s reopen as stderr: %m",
-                OutputFileName);
-       Err_file = Debugfile = fileno(stderr);
+       if (istty && IsUnderPostmaster)
+           if (!freopen(OutputFileName, "a", stdout))
+               elog(FATAL, "DebugFileOpen: %s reopen as stdout: %m",
+                    OutputFileName);
        return Debugfile;
    }
 
@@ -555,7 +544,7 @@ DebugFileOpen(void)
    if (fd < 0)
        elog(FATAL, "DebugFileOpen: could not open debugging file");
 
-   Err_file = Debugfile = fd;
+   Debugfile = fd;
    return Debugfile;
 }