Index: src/backend/access/transam/clog.c
===================================================================
RCS file: /projects/cvsroot/pgsql/src/backend/access/transam/clog.c,v
retrieving revision 1.40
diff -c -r1.40 clog.c
*** src/backend/access/transam/clog.c	4 Oct 2006 00:29:49 -0000	1.40
--- src/backend/access/transam/clog.c	30 Oct 2006 14:32:14 -0000
***************
*** 68,74 ****
  
  static int	ZeroCLOGPage(int pageno, bool writeXlog);
  static bool CLOGPagePrecedes(int page1, int page2);
! static void WriteZeroPageXlogRec(int pageno);
  
  
  /*
--- 68,74 ----
  
  static int	ZeroCLOGPage(int pageno, bool writeXlog);
  static bool CLOGPagePrecedes(int page1, int page2);
! static void WriteClogXlogRec(int pageno, int rectype);
  
  
  /*
***************
*** 198,204 ****
  	slotno = SimpleLruZeroPage(ClogCtl, pageno);
  
  	if (writeXlog)
! 		WriteZeroPageXlogRec(pageno);
  
  	return slotno;
  }
--- 198,204 ----
  	slotno = SimpleLruZeroPage(ClogCtl, pageno);
  
  	if (writeXlog)
! 		WriteClogXlogRec(pageno, CLOG_ZEROPAGE);
  
  	return slotno;
  }
***************
*** 338,343 ****
--- 338,345 ----
  	/* Perform a CHECKPOINT */
  	RequestCheckpoint(true, false);
  
+ 	WriteClogXlogRec(cutoffPage, CLOG_TRUNCATE);
+ 
  	/* Now we can remove the old CLOG segment(s) */
  	SimpleLruTruncate(ClogCtl, cutoffPage);
  }
***************
*** 375,389 ****
   * (Besides which, this is normally done just before entering a transaction.)
   */
  static void
! WriteZeroPageXlogRec(int pageno)
  {
  	XLogRecData rdata;
  
  	rdata.data = (char *) (&pageno);
  	rdata.len = sizeof(int);
  	rdata.buffer = InvalidBuffer;
  	rdata.next = NULL;
! 	(void) XLogInsert(RM_CLOG_ID, CLOG_ZEROPAGE | XLOG_NO_TRAN, &rdata);
  }
  
  /*
--- 377,393 ----
   * (Besides which, this is normally done just before entering a transaction.)
   */
  static void
! WriteClogXlogRec(int pageno, int rectype)
  {
  	XLogRecData rdata;
  
+     Assert(rectype == CLOG_ZEROPAGE || rectype == CLOG_TRUNCATE);
+ 
  	rdata.data = (char *) (&pageno);
  	rdata.len = sizeof(int);
  	rdata.buffer = InvalidBuffer;
  	rdata.next = NULL;
! 	(void) XLogInsert(RM_CLOG_ID, rectype | XLOG_NO_TRAN, &rdata);
  }
  
  /*
***************
*** 409,414 ****
--- 413,432 ----
  
  		LWLockRelease(CLogControlLock);
  	}
+     else if (info == CLOG_TRUNCATE)
+     {
+ 		int			pageno;
+ 
+ 		memcpy(&pageno, XLogRecGetData(record), sizeof(int));
+ 
+ 		LWLockAcquire(CLogControlLock, LW_EXCLUSIVE);
+ 
+     	SimpleLruTruncate(ClogCtl, pageno);
+ 
+ 		LWLockRelease(CLogControlLock);
+     }
+     else
+ 		elog(PANIC, "clog_redo: unknown op code %u", info);
  }
  
  void
***************
*** 423,428 ****
  		memcpy(&pageno, rec, sizeof(int));
  		appendStringInfo(buf, "zeropage: %d", pageno);
  	}
! 	else
  		appendStringInfo(buf, "UNKNOWN");
  }
--- 441,453 ----
  		memcpy(&pageno, rec, sizeof(int));
  		appendStringInfo(buf, "zeropage: %d", pageno);
  	}
!     else if (info == CLOG_TRUNCATE)
!     {
! 		int			pageno;
! 
! 		memcpy(&pageno, rec, sizeof(int));
! 		appendStringInfo(buf, "truncate prior to: %d", pageno);
!     }
!     else
  		appendStringInfo(buf, "UNKNOWN");
  }
Index: src/include/access/clog.h
===================================================================
RCS file: /projects/cvsroot/pgsql/src/include/access/clog.h,v
retrieving revision 1.17
diff -c -r1.17 clog.h
*** src/include/access/clog.h	24 Mar 2006 04:32:13 -0000	1.17
--- src/include/access/clog.h	30 Oct 2006 14:32:35 -0000
***************
*** 46,51 ****
--- 46,52 ----
  
  /* XLOG stuff */
  #define CLOG_ZEROPAGE		0x00
+ #define CLOG_TRUNCATE       0x01
  
  extern void clog_redo(XLogRecPtr lsn, XLogRecord *record);
  extern void clog_desc(StringInfo buf, uint8 xl_info, char *rec);
