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