elog patch, step 2 - Mailing list pgsql-patches

From Bruce Momjian
Subject elog patch, step 2
Date
Msg-id 200202251747.g1PHlN921146@candle.pha.pa.us
Whole thread Raw
List pgsql-patches
Here is the meat of the elog patch, phase 2.  Someone complained the
previous patch was too large, so I removed the message changes to
INFO/LOG, STOP/PANIC, so you are seeing only the major changes.  Of
particular interest is the GUC changes for *_min_messages.  Seems to
work fine.

The next step is for me to merge the DebugLvl setting into GUC, and to
remove the DebugLvl checks from the code and have elog() do that
testing.  Should I be concerned about an elog() call for every DEBUG,
even if there is no debug level set?

--
  Bruce Momjian                        |  http://candle.pha.pa.us
  pgman@candle.pha.pa.us               |  (610) 853-3000
  +  If your life is a hard drive,     |  830 Blythe Avenue
  +  Christ can be your backup.        |  Drexel Hill, Pennsylvania 19026
Index: src/backend/utils/error/elog.c
===================================================================
RCS file: /cvsroot/pgsql/src/backend/utils/error/elog.c,v
retrieving revision 1.91
diff -c -r1.91 elog.c
*** src/backend/utils/error/elog.c    5 Nov 2001 17:46:30 -0000    1.91
--- src/backend/utils/error/elog.c    25 Feb 2002 06:57:04 -0000
***************
*** 38,43 ****
--- 38,53 ----
  #include "mb/pg_wchar.h"
  #endif

+ #define DEFAULT_SERVER_MIN_MESSAGES_STR "LOG"
+ int            server_min_messages;
+ char       *server_min_messages_str = NULL;
+ const char    server_min_messages_str_default[] = DEFAULT_SERVER_MIN_MESSAGES_STR;
+
+ #define DEFAULT_CLIENT_MIN_MESSAGES_STR "INFO"
+ int            client_min_messages;
+ char       *client_min_messages_str = NULL;
+ const char    client_min_messages_str_default[] = DEFAULT_CLIENT_MIN_MESSAGES_STR;
+
  #ifdef ENABLE_SYSLOG
  /*
   * 0 = only stdout/stderr
***************
*** 109,115 ****
       * Note that we use malloc() not palloc() because we want to retain
       * control if we run out of memory.  palloc() would recursively call
       * elog(ERROR), which would be all right except if we are working on a
!      * FATAL or REALLYFATAL error.    We'd lose track of the fatal condition
       * and report a mere ERROR to outer loop, which would be a Bad Thing.
       * So, we substitute an appropriate message in-place, without
       * downgrading the level if it's above ERROR.
--- 119,125 ----
       * Note that we use malloc() not palloc() because we want to retain
       * control if we run out of memory.  palloc() would recursively call
       * elog(ERROR), which would be all right except if we are working on a
!      * FATAL or PANIC error.    We'd lose track of the fatal condition
       * and report a mere ERROR to outer loop, which would be a Bad Thing.
       * So, we substitute an appropriate message in-place, without
       * downgrading the level if it's above ERROR.
***************
*** 131,136 ****
--- 141,151 ----
      /* size of the prefix needed for timestamp and pid, if enabled */
      size_t        timestamp_size;

+
+     /* Check for old elog calls.  Codes were renumbered in 7.3. 2002-02-24 */
+     if (lev < DEBUG)
+         elog(FATAL, "Pre-7.3 object file made an elog() call.  Recompile.");
+
      /* Save error str before calling any function that might change errno */
      errorstr = useful_strerror(errno);

***************
*** 142,154 ****
          lev = FATAL;

      /*
!      * If we are inside a critical section, all errors become REALLYFATAL
       * errors.    See miscadmin.h.
       */
      if (lev == ERROR || lev == FATAL)
      {
          if (CritSectionCount > 0)
!             lev = REALLYFATAL;
      }

      prefix = elog_message_prefix(lev);
--- 157,169 ----
          lev = FATAL;

      /*
!      * If we are inside a critical section, all errors become PANIC
       * errors.    See miscadmin.h.
       */
      if (lev == ERROR || lev == FATAL)
      {
          if (CritSectionCount > 0)
!             lev = PANIC;
      }

      prefix = elog_message_prefix(lev);
***************
*** 167,178 ****
       * vsnprintf won't know what to do with %m).  To keep space
       * calculation simple, we only allow one %m.
       */
!     space_needed = timestamp_size + strlen(prefix)
!         + strlen(fmt) + strlen(errorstr) + 1;

      if (copy_lineno)
      {
!         /* translator: This string will be truncated at 31 characters. */
          snprintf(copylineno_buf, 32, gettext("copy: line %d, "), copy_lineno);
          space_needed += strlen(copylineno_buf);
      }
--- 182,196 ----
       * vsnprintf won't know what to do with %m).  To keep space
       * calculation simple, we only allow one %m.
       */
!     space_needed = timestamp_size + strlen(prefix) +
!                    strlen(fmt) + strlen(errorstr) + 1;

      if (copy_lineno)
      {
!         /*
!          * Prints the failure line of the COPY.  Wow, what a hack!  bjm
!          * Translators:  Error message will be truncated at 31 characters.
!          */
          snprintf(copylineno_buf, 32, gettext("copy: line %d, "), copy_lineno);
          space_needed += strlen(copylineno_buf);
      }
***************
*** 184,190 ****
          {
              /* We're up against it, convert to out-of-memory error */
              fmt_buf = fmt_fixedbuf;
!             if (lev != FATAL && lev != REALLYFATAL)
              {
                  lev = ERROR;
                  prefix = elog_message_prefix(lev);
--- 202,208 ----
          {
              /* We're up against it, convert to out-of-memory error */
              fmt_buf = fmt_fixedbuf;
!             if (lev != FATAL && lev != PANIC)
              {
                  lev = ERROR;
                  prefix = elog_message_prefix(lev);
***************
*** 213,219 ****
      if (copy_lineno)
      {
          strcat(fmt_buf, copylineno_buf);
!         if (lev == ERROR || lev == FATAL || lev == REALLYFATAL)
              copy_lineno = 0;
      }

--- 231,237 ----
      if (copy_lineno)
      {
          strcat(fmt_buf, copylineno_buf);
!         if (lev == ERROR || lev == FATAL || lev == PANIC)
              copy_lineno = 0;
      }

***************
*** 281,287 ****
          {
              /* We're up against it, convert to out-of-memory error */
              msg_buf = msg_fixedbuf;
!             if (lev != FATAL && lev != REALLYFATAL)
              {
                  lev = ERROR;
                  prefix = elog_message_prefix(lev);
--- 299,305 ----
          {
              /* We're up against it, convert to out-of-memory error */
              msg_buf = msg_fixedbuf;
!             if (lev != FATAL && lev != PANIC)
              {
                  lev = ERROR;
                  prefix = elog_message_prefix(lev);
***************
*** 312,317 ****
--- 330,339 ----
              case DEBUG:
                  syslog_level = LOG_DEBUG;
                  break;
+             case LOG:
+             case INFO:
+                 syslog_level = LOG_INFO;
+                 break;
              case NOTICE:
                  syslog_level = LOG_NOTICE;
                  break;
***************
*** 321,327 ****
              case FATAL:
                  syslog_level = LOG_ERR;
                  break;
!             case REALLYFATAL:
              default:
                  syslog_level = LOG_CRIT;
                  break;
--- 343,349 ----
              case FATAL:
                  syslog_level = LOG_ERR;
                  break;
!             case PANIC:
              default:
                  syslog_level = LOG_CRIT;
                  break;
***************
*** 334,344 ****
      /* syslog doesn't want a trailing newline, but other destinations do */
      strcat(msg_buf, "\n");

!     /* write to terminal */
!     if (Use_syslog <= 1 || whereToSendOutput == Debug)
          write(2, msg_buf, strlen(msg_buf));

!     if (lev > DEBUG && whereToSendOutput == Remote)
      {
          /* Send IPC message to the front-end program */
          MemoryContext oldcxt;
--- 356,371 ----
      /* syslog doesn't want a trailing newline, but other destinations do */
      strcat(msg_buf, "\n");

!     /* Write to server logs or server terminal */
!     if ((lev >= server_min_messages ||
!         /* INFO/LOG priority are reversed for server.  Handle this */
!         (lev == LOG && server_min_messages == INFO)) &&
!         (lev != INFO || server_min_messages != LOG) &&
!         (Use_syslog <= 1 || whereToSendOutput == Debug))
          write(2, msg_buf, strlen(msg_buf));

!     /* Should we output to the client too? */
!     if (lev >= client_min_messages || whereToSendOutput == Remote)
      {
          /* Send IPC message to the front-end program */
          MemoryContext oldcxt;
***************
*** 351,357 ****
           */
          oldcxt = MemoryContextSwitchTo(ErrorContext);

!         if (lev == NOTICE)
              /* exclude the timestamp from msg sent to frontend */
              send_notice_to_frontend(msg_buf + timestamp_size);
          else
--- 378,384 ----
           */
          oldcxt = MemoryContextSwitchTo(ErrorContext);

!         if (lev <= NOTICE)
              /* exclude the timestamp from msg sent to frontend */
              send_notice_to_frontend(msg_buf + timestamp_size);
          else
***************
*** 414,420 ****
           * Guard against infinite loop from elog() during error recovery.
           */
          if (InError)
!             elog(REALLYFATAL, "elog: error during error recovery, giving up!");
          InError = true;

          /*
--- 441,447 ----
           * Guard against infinite loop from elog() during error recovery.
           */
          if (InError)
!             elog(PANIC, "elog: error during error recovery, giving up!");
          InError = true;

          /*
***************
*** 423,429 ****
          siglongjmp(Warn_restart, 1);
      }

!     if (lev == FATAL || lev == REALLYFATAL)
      {
          /*
           * Serious crash time. Postmaster will observe nonzero process
--- 450,456 ----
          siglongjmp(Warn_restart, 1);
      }

!     if (lev == FATAL || lev == PANIC)
      {
          /*
           * Serious crash time. Postmaster will observe nonzero process
***************
*** 673,682 ****
  {
      StringInfoData buf;

!     AssertArg(type == NOTICE || type == ERROR);

      pq_beginmessage(&buf);
!     pq_sendbyte(&buf, type == NOTICE ? 'N' : 'E');
      pq_sendstring(&buf, msg);
      pq_endmessage(&buf);

--- 700,709 ----
  {
      StringInfoData buf;

!     AssertArg(type <= ERROR);

      pq_beginmessage(&buf);
!     pq_sendbyte(&buf, type != ERROR ? 'N' : 'E'); /* No reason to add INFO */
      pq_sendstring(&buf, msg);
      pq_endmessage(&buf);

***************
*** 734,739 ****
--- 761,772 ----
          case DEBUG:
              prefix = gettext("DEBUG:  ");
              break;
+         case LOG:
+             prefix = gettext("LOG:  ");
+             break;
+         case INFO:
+             prefix = gettext("INFO:  ");
+             break;
          case NOTICE:
              prefix = gettext("NOTICE:  ");
              break;
***************
*** 741,753 ****
              prefix = gettext("ERROR:  ");
              break;
          case FATAL:
!             prefix = gettext("FATAL 1:  ");
              break;
!         case REALLYFATAL:
!             prefix = gettext("FATAL 2:  ");
              break;
      }

      Assert(prefix != NULL);
      return prefix;
  }
--- 774,859 ----
              prefix = gettext("ERROR:  ");
              break;
          case FATAL:
!             prefix = gettext("FATAL:  ");
              break;
!         case PANIC:
!             prefix = gettext("PANIC:  ");
              break;
      }

      Assert(prefix != NULL);
      return prefix;
  }
+
+
+ /*
+  * GUC support routines
+  */
+
+ bool
+ check_server_min_messages(const char *lev)
+ {
+     if (strcasecmp(lev, "debug") == 0 ||
+         strcasecmp(lev, "log") == 0 ||
+         strcasecmp(lev, "info") == 0 ||
+         strcasecmp(lev, "notice") == 0 ||
+         strcasecmp(lev, "error") == 0 ||
+         strcasecmp(lev, "fatal") == 0 ||
+         strcasecmp(lev, "panic") == 0)
+         return true;
+     return false;
+ }
+
+ void
+ assign_server_min_messages(const char *lev)
+ {
+     if (strcasecmp(lev, "debug") == 0)
+         server_min_messages = DEBUG;
+     else if (strcasecmp(lev, "log") == 0)
+         server_min_messages = LOG;
+     else if (strcasecmp(lev, "info") == 0)
+         server_min_messages = INFO;
+     else if (strcasecmp(lev, "notice") == 0)
+         server_min_messages = NOTICE;
+     else if (strcasecmp(lev, "error") == 0)
+         server_min_messages = ERROR;
+     else if (strcasecmp(lev, "fatal") == 0)
+         server_min_messages = FATAL;
+     else if (strcasecmp(lev, "panic") == 0)
+         server_min_messages = PANIC;
+     else
+         /* Can't get here unless guc.c screwed up */
+         elog(ERROR, "bogus server_min_messages %s", lev);
+ }
+
+ bool
+ check_client_min_messages(const char *lev)
+ {
+     if (strcasecmp(lev, "debug") == 0 ||
+         strcasecmp(lev, "log") == 0 ||
+         strcasecmp(lev, "info") == 0 ||
+         strcasecmp(lev, "notice") == 0 ||
+         strcasecmp(lev, "error") == 0)
+         return true;
+     return false;
+ }
+
+ void
+ assign_client_min_messages(const char *lev)
+ {
+     if (strcasecmp(lev, "debug") == 0)
+         client_min_messages = DEBUG;
+     else if (strcasecmp(lev, "log") == 0)
+         client_min_messages = LOG;
+     else if (strcasecmp(lev, "info") == 0)
+         client_min_messages = INFO;
+     else if (strcasecmp(lev, "notice") == 0)
+         client_min_messages = NOTICE;
+     else if (strcasecmp(lev, "error") == 0)
+         client_min_messages = ERROR;
+     else
+         /* Can't get here unless guc.c screwed up */
+         elog(ERROR, "bogus client_min_messages %s", lev);
+ }
+
+
Index: src/backend/utils/hash/dynahash.c
===================================================================
RCS file: /cvsroot/pgsql/src/backend/utils/hash/dynahash.c,v
retrieving revision 1.40
diff -c -r1.40 dynahash.c
*** src/backend/utils/hash/dynahash.c    28 Oct 2001 06:25:54 -0000    1.40
--- src/backend/utils/hash/dynahash.c    25 Feb 2002 06:57:09 -0000
***************
*** 933,939 ****
       * systemwide restart.    Otherwise, just shut down this one backend.
       */
      if (hashp->isshared)
!         elog(STOP, "Hash table '%s' corrupted", hashp->tabname);
      else
          elog(FATAL, "Hash table '%s' corrupted", hashp->tabname);
  }
--- 933,939 ----
       * systemwide restart.    Otherwise, just shut down this one backend.
       */
      if (hashp->isshared)
!         elog(PANIC, "Hash table '%s' corrupted", hashp->tabname);
      else
          elog(FATAL, "Hash table '%s' corrupted", hashp->tabname);
  }
Index: src/backend/utils/misc/guc.c
===================================================================
RCS file: /cvsroot/pgsql/src/backend/utils/misc/guc.c,v
retrieving revision 1.59
diff -c -r1.59 guc.c
*** src/backend/utils/misc/guc.c    23 Feb 2002 01:31:36 -0000    1.59
--- src/backend/utils/misc/guc.c    25 Feb 2002 06:57:10 -0000
***************
*** 37,42 ****
--- 37,43 ----
  #include "storage/proc.h"
  #include "tcop/tcopprot.h"
  #include "utils/datetime.h"
+ #include "utils/elog.h"
  #include "pgstat.h"


***************
*** 554,559 ****
--- 555,566 ----
              ConfigureNamesString[] =
  {
      {
+         "client_min_messages", PGC_USERSET, PGC_S_DEFAULT, &client_min_messages_str,
+         client_min_messages_str_default, check_client_min_messages,
+         assign_client_min_messages
+     },
+
+     {
          "default_transaction_isolation", PGC_USERSET, PGC_S_DEFAULT, &default_iso_level_string,
          "read committed", check_defaultxactisolevel, assign_defaultxactisolevel
      },
***************
*** 566,571 ****
--- 573,584 ----
      {
          "krb_server_keyfile", PGC_POSTMASTER, PGC_S_DEFAULT, &pg_krb_server_keyfile,
          PG_KRB_SRVTAB, NULL, NULL
+     },
+
+     {
+         "server_min_messages", PGC_USERSET, PGC_S_DEFAULT, &server_min_messages_str,
+         server_min_messages_str_default, check_server_min_messages,
+         assign_server_min_messages
      },

  #ifdef ENABLE_SYSLOG
Index: src/backend/utils/misc/postgresql.conf.sample
===================================================================
RCS file: /cvsroot/pgsql/src/backend/utils/misc/postgresql.conf.sample,v
retrieving revision 1.29
diff -c -r1.29 postgresql.conf.sample
*** src/backend/utils/misc/postgresql.conf.sample    18 Feb 2002 06:42:54 -0000    1.29
--- src/backend/utils/misc/postgresql.conf.sample    25 Feb 2002 06:57:10 -0000
***************
*** 108,115 ****


  #
! #    Debug display
  #
  #silent_mode = false

  #log_connections = false
--- 108,120 ----


  #
! #    Message display
  #
+
+ #server_min_messages = log    # Values, in order of decreasing detail:
+                 #  debug, info, log, notice, error, fatal, panic
+ #client_min_messages = log    # Values, in order of decreasing detail:
+                 #  debug, log, info, notice, error
  #silent_mode = false

  #log_connections = false
Index: src/include/utils/elog.h
===================================================================
RCS file: /cvsroot/pgsql/src/include/utils/elog.h,v
retrieving revision 1.30
diff -c -r1.30 elog.h
*** src/include/utils/elog.h    5 Nov 2001 17:46:36 -0000    1.30
--- src/include/utils/elog.h    25 Feb 2002 06:57:10 -0000
***************
*** 15,29 ****
  #define ELOG_H

  /* Error level codes */
! #define NOTICE    0                /* random info, sent to frontend */
! #define ERROR    (-1)            /* user error - return to known state */
! #define FATAL    1                /* fatal error - abort process */
! #define REALLYFATAL 2            /* take down the other backends with me */
! #define DEBUG    (-2)            /* debug message */
!
! /* temporary nonsense... */
! #define STOP    REALLYFATAL
! #define LOG        DEBUG

  /* Configurable parameters */
  #ifdef ENABLE_SYSLOG
--- 15,27 ----
  #define ELOG_H

  /* Error level codes */
! #define DEBUG    10                /* sent only to server logs, label DEBUG */
! #define LOG        11                /* sent only to server logs, label LOG */
! #define INFO    12                /* sent only to client */
! #define NOTICE    13                /* important, sent to both */
! #define ERROR    14                /* user error - return to known state */
! #define FATAL    15                /* fatal error - abort process */
! #define PANIC    16                /* take down the other backends with me */

  /* Configurable parameters */
  #ifdef ENABLE_SYSLOG
***************
*** 32,37 ****
--- 30,39 ----
  extern bool Log_timestamp;
  extern bool Log_pid;

+ extern char       *server_min_messages_str;
+ extern char       *client_min_messages_str;
+ extern const char server_min_messages_str_default[];
+ extern const char client_min_messages_str_default[];

  extern void
  elog(int lev, const char *fmt,...)
***************
*** 40,44 ****
--- 42,51 ----
  __attribute__((format(printf, 2, 3)));

  extern int    DebugFileOpen(void);
+
+ extern bool check_server_min_messages(const char *lev);
+ extern void assign_server_min_messages(const char *lev);
+ extern bool check_client_min_messages(const char *lev);
+ extern void assign_client_min_messages(const char *lev);

  #endif   /* ELOG_H */

pgsql-patches by date:

Previous
From: Bill Studenmund
Date:
Subject: Re: Patch to add CREATE OPERATOR CLASS
Next
From: Bruce Momjian
Date:
Subject: Re: Patch to add CREATE OPERATOR CLASS