On Mon, 2006-11-27 at 18:26 -0500, Tom Lane wrote:
> [ studies code a bit more... ]  I'm also wondering whether the forced
> pg_control update at each xlog seg switch is worth its keep.  Offhand
> it
> seems like the checkpoint pointer is enough; why are we maintaining
> logId/logSeg in pg_control?

We maintain the values in shared memory to allow us to determine whether
or not its time to checkpoint, and also to ensure that there is one and
only one call to checkpoint. So we need to keep track of this somewhere
and that may as well be where it already is.

However, that doesn't mean we need to update the file on disk each time
we switch xlog files, so I've removed the UpdateControlFile() at that
point. That fsync was done while holding WALWriteLock() so removing it
should be good for a few extra points of speed - at least we know there
were some problems in that area.

-- 
  Simon Riggs             
  EnterpriseDB   http://www.enterprisedb.com

Index: src/backend/access/transam/xlog.c
===================================================================
RCS file: /projects/cvsroot/pgsql/src/backend/access/transam/xlog.c,v
retrieving revision 1.258
diff -c -r1.258 xlog.c
*** src/backend/access/transam/xlog.c	30 Nov 2006 18:29:11 -0000	1.258
--- src/backend/access/transam/xlog.c	5 Dec 2006 19:44:42 -0000
***************
*** 1545,1554 ****
  				(ControlFile->logId == openLogId &&
  				 ControlFile->logSeg < openLogSeg + 1))
  			{
  				ControlFile->logId = openLogId;
  				ControlFile->logSeg = openLogSeg + 1;
  				ControlFile->time = time(NULL);
- 				UpdateControlFile();
  
  				/*
  				 * Signal bgwriter to start a checkpoint if it's been too long
--- 1545,1560 ----
  				(ControlFile->logId == openLogId &&
  				 ControlFile->logSeg < openLogSeg + 1))
  			{
+                 /*
+                  * We update shared memory, but not the control file on disk
+                  * This allows us to keep track of whether to checkpoint
+                  * without needing to pay the cost of fsyncing files.
+                  * We do update it at checkpoint time however, but that
+                  * part is handled by the bgwriter in CreateCheckpoint()
+                  */
  				ControlFile->logId = openLogId;
  				ControlFile->logSeg = openLogSeg + 1;
  				ControlFile->time = time(NULL);
  
  				/*
  				 * Signal bgwriter to start a checkpoint if it's been too long
---------------------------(end of broadcast)---------------------------
TIP 6: explain analyze is your friend

Reply via email to