Tom Lane <[EMAIL PROTECTED]> writes:
> I think the combination of #ifdef and GUC variable is appropriate.

The attached patch implements this: the wal_debug GUC var is now a
boolean, and is encloded in `#ifdef WAL_DEBUG` blocks (and the
WAL_DEBUG symbol is present in pg_config_manual.h, just commented
out).

Unless anyone objects, I intend to apply this in 24 hours or so.

-Neil
Index: doc/src/sgml/runtime.sgml
===================================================================
RCS file: /Users/neilc/local/cvs/pgsql-server/doc/src/sgml/runtime.sgml,v
retrieving revision 1.227
diff -c -r1.227 runtime.sgml
*** doc/src/sgml/runtime.sgml	13 Dec 2003 23:59:06 -0000	1.227
--- doc/src/sgml/runtime.sgml	22 Dec 2003 10:30:19 -0000
***************
*** 2667,2676 ****
       </varlistentry>
  
       <varlistentry>
!       <term><varname>wal_debug</varname> (<type>integer</type>)</term>
        <listitem>
         <para>
!         If nonzero, turn on WAL-related debugging output.
         </para>
        </listitem>
       </varlistentry>
--- 2667,2679 ----
       </varlistentry>
  
       <varlistentry>
!       <term><varname>wal_debug</varname> (<type>boolean</type>)</term>
        <listitem>
         <para>
!         If true, emit WAL-related debugging output. This option is
!         only available if the <symbol>WAL_DEBUG</symbol> macro was
!         defined when <productname>PostgreSQL</productname> was
!         compiled.
         </para>
        </listitem>
       </varlistentry>
Index: doc/src/sgml/wal.sgml
===================================================================
RCS file: /Users/neilc/local/cvs/pgsql-server/doc/src/sgml/wal.sgml,v
retrieving revision 1.26
diff -c -r1.26 wal.sgml
*** doc/src/sgml/wal.sgml	29 Nov 2003 19:51:38 -0000	1.26
--- doc/src/sgml/wal.sgml	22 Dec 2003 10:01:55 -0000
***************
*** 19,28 ****
     transaction processing. Briefly, <acronym>WAL</acronym>'s central
     concept is that changes to data files (where tables and indexes
     reside) must be written only after those changes have been logged,
!    that is, when log records have been flushed to permanent
!    storage. If we follow this procedure, we do not need to flush
!    data pages to disk on every transaction commit, because we know
!    that in the event of a crash we will be able to recover the
     database using the log: any changes that have not been applied to
     the data pages will first be redone from the log records (this is
     roll-forward recovery, also known as REDO) and then changes made by
--- 19,28 ----
     transaction processing. Briefly, <acronym>WAL</acronym>'s central
     concept is that changes to data files (where tables and indexes
     reside) must be written only after those changes have been logged,
!    that is, when log records describing the changes have been flushed
!    to permanent storage. If we follow this procedure, we do not need
!    to flush data pages to disk on every transaction commit, because we
!    know that in the event of a crash we will be able to recover the
     database using the log: any changes that have not been applied to
     the data pages will first be redone from the log records (this is
     roll-forward recovery, also known as REDO) and then changes made by
***************
*** 187,193 ****
    <para>
     There will be at least one 16 MB segment file, and will normally
     not be more than 2 * <varname>checkpoint_segments</varname> + 1
!    files.  You can use this to estimate space requirements for WAL.
     Ordinarily, when old log segment files are no longer needed, they
     are recycled (renamed to become the next segments in the numbered
     sequence). If, due to a short-term peak of log output rate, there
--- 187,193 ----
    <para>
     There will be at least one 16 MB segment file, and will normally
     not be more than 2 * <varname>checkpoint_segments</varname> + 1
!    files.  You can use this to estimate space requirements for <acronym>WAL</acronym>.
     Ordinarily, when old log segment files are no longer needed, they
     are recycled (renamed to become the next segments in the numbered
     sequence). If, due to a short-term peak of log output rate, there
***************
*** 254,260 ****
    <para>
     The <varname>wal_sync_method</varname> parameter determines how
     <productname>PostgreSQL</productname> will ask the kernel to force
!     WAL updates out to disk. 
     All the options should be the same as far as reliability goes,
     but it's quite platform-specific which one will be the fastest.
     Note that this parameter is irrelevant if <varname>fsync</varname>
--- 254,260 ----
    <para>
     The <varname>wal_sync_method</varname> parameter determines how
     <productname>PostgreSQL</productname> will ask the kernel to force
!     <acronym>WAL</acronym> updates out to disk. 
     All the options should be the same as far as reliability goes,
     but it's quite platform-specific which one will be the fastest.
     Note that this parameter is irrelevant if <varname>fsync</varname>
***************
*** 262,272 ****
    </para>
  
    <para>
!    Setting the <varname>wal_debug</varname> parameter to any nonzero
!    value will result in each <function>LogInsert</function> and
     <function>LogFlush</function> <acronym>WAL</acronym> call being
!    logged to the server log.  At present, it makes no difference what
!    the nonzero value is.  This option may be replaced by a more
     general mechanism in the future.
    </para>
   </sect1>
--- 262,271 ----
    </para>
  
    <para>
!    Enabling the <varname>wal_debug</varname> configuration parameter
!    will result in each <function>LogInsert</function> and
     <function>LogFlush</function> <acronym>WAL</acronym> call being
!    logged to the server log. This option may be replaced by a more
     general mechanism in the future.
    </para>
   </sect1>
Index: doc/src/sgml/ref/show.sgml
===================================================================
RCS file: /Users/neilc/local/cvs/pgsql-server/doc/src/sgml/ref/show.sgml,v
retrieving revision 1.34
diff -c -r1.34 show.sgml
*** doc/src/sgml/ref/show.sgml	29 Nov 2003 19:51:39 -0000	1.34
--- doc/src/sgml/ref/show.sgml	22 Dec 2003 10:01:55 -0000
***************
*** 172,178 ****
      .
      .
      .
!  wal_debug                     | 0
   wal_sync_method               | fdatasync
  (94 rows)
  </programlisting>
--- 172,178 ----
      .
      .
      .
!  wal_debug                     | off
   wal_sync_method               | fdatasync
  (94 rows)
  </programlisting>
Index: src/backend/access/transam/xlog.c
===================================================================
RCS file: /Users/neilc/local/cvs/pgsql-server/src/backend/access/transam/xlog.c,v
retrieving revision 1.129
diff -c -r1.129 xlog.c
*** src/backend/access/transam/xlog.c	20 Dec 2003 17:31:20 -0000	1.129
--- src/backend/access/transam/xlog.c	22 Dec 2003 10:23:13 -0000
***************
*** 86,97 ****
  /* User-settable parameters */
  int			CheckPointSegments = 3;
  int			XLOGbuffers = 8;
- int			XLOG_DEBUG = 0;
  char	   *XLOG_sync_method = NULL;
  const char	XLOG_sync_method_default[] = DEFAULT_SYNC_METHOD_STR;
  char		XLOG_archive_dir[MAXPGPATH];		/* null string means
  												 * delete 'em */
  
  /*
   * XLOGfileslop is used in the code as the allowed "fuzz" in the number of
   * preallocated XLOG segments --- we try to have at least XLOGfiles advance
--- 86,100 ----
  /* User-settable parameters */
  int			CheckPointSegments = 3;
  int			XLOGbuffers = 8;
  char	   *XLOG_sync_method = NULL;
  const char	XLOG_sync_method_default[] = DEFAULT_SYNC_METHOD_STR;
  char		XLOG_archive_dir[MAXPGPATH];		/* null string means
  												 * delete 'em */
  
+ #ifdef WAL_DEBUG
+ bool		XLOG_DEBUG = false;
+ #endif
+ 
  /*
   * XLOGfileslop is used in the code as the allowed "fuzz" in the number of
   * preallocated XLOG segments --- we try to have at least XLOGfiles advance
***************
*** 766,771 ****
--- 769,775 ----
  		MyProc->logRec = RecPtr;
  	}
  
+ #ifdef WAL_DEBUG
  	if (XLOG_DEBUG)
  	{
  		char		buf[8192];
***************
*** 779,784 ****
--- 783,789 ----
  		}
  		elog(LOG, "%s", buf);
  	}
+ #endif
  
  	/* Record begin of record in appropriate places */
  	if (!no_tran)
***************
*** 1074,1081 ****
--- 1079,1088 ----
  					 openLogSeg >= (RedoRecPtr.xrecoff / XLogSegSize) +
  					 (uint32) CheckPointSegments))
  				{
+ #ifdef WAL_DEBUG
  					if (XLOG_DEBUG)
  						elog(LOG, "time for a checkpoint, signaling postmaster");
+ #endif
  					SendPostmasterSignal(PMSIGNAL_DO_CHECKPOINT);
  				}
  			}
***************
*** 1214,1224 ****
--- 1221,1233 ----
  	if (XLByteLE(record, LogwrtResult.Flush))
  		return;
  
+ #ifdef WAL_DEBUG
  	if (XLOG_DEBUG)
  		elog(LOG, "xlog flush request %X/%X; write %X/%X; flush %X/%X",
  			 record.xlogid, record.xrecoff,
  			 LogwrtResult.Write.xlogid, LogwrtResult.Write.xrecoff,
  			 LogwrtResult.Flush.xlogid, LogwrtResult.Flush.xrecoff);
+ #endif
  
  	START_CRIT_SECTION();
  
***************
*** 2613,2621 ****
--- 2622,2632 ----
  
  	/* This is just to allow attaching to startup process with a debugger */
  #ifdef XLOG_REPLAY_DELAY
+ #ifdef WAL_DEBUG
  	if (XLOG_DEBUG && ControlFile->state != DB_SHUTDOWNED)
  		sleep(60);
  #endif
+ #endif
  
  	/*
  	 * Get the last valid checkpoint record.  If the latest one according
***************
*** 2742,2747 ****
--- 2753,2760 ----
  					ShmemVariableCache->nextXid = record->xl_xid;
  					TransactionIdAdvance(ShmemVariableCache->nextXid);
  				}
+ 
+ #ifdef WAL_DEBUG
  				if (XLOG_DEBUG)
  				{
  					char		buf[8192];
***************
*** 2755,2760 ****
--- 2768,2774 ----
  								record->xl_info, XLogRecGetData(record));
  					elog(LOG, "%s", buf);
  				}
+ #endif
  
  				if (record->xl_info & XLR_BKP_BLOCK_MASK)
  					RestoreBkpBlocks(record, EndRecPtr);
Index: src/backend/utils/misc/guc.c
===================================================================
RCS file: /Users/neilc/local/cvs/pgsql-server/src/backend/utils/misc/guc.c,v
retrieving revision 1.175
diff -c -r1.175 guc.c
*** src/backend/utils/misc/guc.c	3 Dec 2003 18:52:00 -0000	1.175
--- src/backend/utils/misc/guc.c	22 Dec 2003 10:24:46 -0000
***************
*** 336,352 ****
   * TO ADD AN OPTION:
   *
   * 1. Declare a global variable of type bool, int, double, or char*
!  * and make use of it.
   *
   * 2. Decide at what times it's safe to set the option. See guc.h for
!  * details.
   *
   * 3. Decide on a name, a default value, upper and lower bounds (if
!  * applicable), etc.
   *
   * 4. Add a record below.
   *
!  * 5. Add it to src/backend/utils/misc/postgresql.conf.sample.
   *
   * 6. Add it to src/bin/psql/tab-complete.c, if it's a USERSET option.
   *
--- 336,353 ----
   * TO ADD AN OPTION:
   *
   * 1. Declare a global variable of type bool, int, double, or char*
!  *    and make use of it.
   *
   * 2. Decide at what times it's safe to set the option. See guc.h for
!  *    details.
   *
   * 3. Decide on a name, a default value, upper and lower bounds (if
!  *    applicable), etc.
   *
   * 4. Add a record below.
   *
!  * 5. Add it to src/backend/utils/misc/postgresql.conf.sample, if
!  *    appropriate
   *
   * 6. Add it to src/bin/psql/tab-complete.c, if it's a USERSET option.
   *
***************
*** 862,867 ****
--- 863,880 ----
  #endif
  	},
  
+ #ifdef WAL_DEBUG
+ 	{
+ 		{"wal_debug", PGC_SUSET, DEVELOPER_OPTIONS,
+ 			gettext_noop("Emit WAL-related debugging output."),
+ 			NULL,
+ 			GUC_NOT_IN_SAMPLE
+ 		},
+ 		&XLOG_DEBUG,
+ 		false, NULL, NULL
+ 	},
+ #endif
+ 
  	/* End-of-list marker */
  	{
  		{NULL, 0, 0, NULL, NULL}, NULL, false, NULL, NULL
***************
*** 1169,1184 ****
  		},
  		&XLOGbuffers,
  		8, 4, INT_MAX, NULL, NULL
- 	},
- 
- 	{
- 		{"wal_debug", PGC_SUSET, DEVELOPER_OPTIONS,
- 			gettext_noop("If nonzero, WAL-related debugging output is logged."),
- 			NULL,
- 			GUC_NOT_IN_SAMPLE
- 		},
- 		&XLOG_DEBUG,
- 		0, 0, 16, NULL, NULL
  	},
  
  	{
--- 1182,1187 ----
Index: src/include/pg_config_manual.h
===================================================================
RCS file: /Users/neilc/local/cvs/pgsql-server/src/include/pg_config_manual.h,v
retrieving revision 1.8
diff -c -r1.8 pg_config_manual.h
*** src/include/pg_config_manual.h	29 Nov 2003 22:40:53 -0000	1.8
--- src/include/pg_config_manual.h	22 Dec 2003 10:28:29 -0000
***************
*** 225,230 ****
--- 225,236 ----
  /* #define LOCK_DEBUG */
  
  /*
+  * Enable debugging print statements for WAL-related operations; see
+  * also the wal_debug GUC var.
+  */
+ /* #define WAL_DEBUG */
+ 
+ /*
   * Other debug #defines (documentation, anyone?)
   */
  /* #define IPORTAL_DEBUG  */
Index: src/include/access/xlog.h
===================================================================
RCS file: /Users/neilc/local/cvs/pgsql-server/src/include/access/xlog.h,v
retrieving revision 1.46
diff -c -r1.46 xlog.h
*** src/include/access/xlog.h	12 Dec 2003 18:45:10 -0000	1.46
--- src/include/access/xlog.h	22 Dec 2003 10:17:07 -0000
***************
*** 189,198 ****
  extern int	CheckPointSegments;
  extern int	CheckPointWarning;
  extern int	XLOGbuffers;
- extern int	XLOG_DEBUG;
  extern char *XLOG_sync_method;
  extern const char XLOG_sync_method_default[];
  
  
  extern XLogRecPtr XLogInsert(RmgrId rmid, uint8 info, XLogRecData *rdata);
  extern void XLogFlush(XLogRecPtr RecPtr);
--- 189,200 ----
  extern int	CheckPointSegments;
  extern int	CheckPointWarning;
  extern int	XLOGbuffers;
  extern char *XLOG_sync_method;
  extern const char XLOG_sync_method_default[];
  
+ #ifdef WAL_DEBUG
+ extern bool	XLOG_DEBUG;
+ #endif
  
  extern XLogRecPtr XLogInsert(RmgrId rmid, uint8 info, XLogRecData *rdata);
  extern void XLogFlush(XLogRecPtr RecPtr);
---------------------------(end of broadcast)---------------------------
TIP 7: don't forget to increase your free space map settings

Reply via email to