SLRU API tweak

Started by Kevin Grittnerabout 15 years ago2 messages
#1Kevin Grittner
Kevin.Grittner@wicourts.gov
1 attachment(s)

Attached is a small patch to avoid putting an opaque structure into
the slru.h file and using it in an external function call where
external callers must always specify NULL.

-Kevin

Attachments:

slru-1.patchtext/plain; name=slru-1.patchDownload
*** a/src/backend/access/transam/clog.c
--- b/src/backend/access/transam/clog.c
***************
*** 445,451 **** BootStrapCLOG(void)
  	slotno = ZeroCLOGPage(0, false);
  
  	/* Make sure it's written out */
! 	SimpleLruWritePage(ClogCtl, slotno, NULL);
  	Assert(!ClogCtl->shared->page_dirty[slotno]);
  
  	LWLockRelease(CLogControlLock);
--- 445,451 ----
  	slotno = ZeroCLOGPage(0, false);
  
  	/* Make sure it's written out */
! 	SimpleLruWritePage(ClogCtl, slotno);
  	Assert(!ClogCtl->shared->page_dirty[slotno]);
  
  	LWLockRelease(CLogControlLock);
***************
*** 698,704 **** clog_redo(XLogRecPtr lsn, XLogRecord *record)
  		LWLockAcquire(CLogControlLock, LW_EXCLUSIVE);
  
  		slotno = ZeroCLOGPage(pageno, false);
! 		SimpleLruWritePage(ClogCtl, slotno, NULL);
  		Assert(!ClogCtl->shared->page_dirty[slotno]);
  
  		LWLockRelease(CLogControlLock);
--- 698,704 ----
  		LWLockAcquire(CLogControlLock, LW_EXCLUSIVE);
  
  		slotno = ZeroCLOGPage(pageno, false);
! 		SimpleLruWritePage(ClogCtl, slotno);
  		Assert(!ClogCtl->shared->page_dirty[slotno]);
  
  		LWLockRelease(CLogControlLock);
*** a/src/backend/access/transam/multixact.c
--- b/src/backend/access/transam/multixact.c
***************
*** 1454,1460 **** BootStrapMultiXact(void)
  	slotno = ZeroMultiXactOffsetPage(0, false);
  
  	/* Make sure it's written out */
! 	SimpleLruWritePage(MultiXactOffsetCtl, slotno, NULL);
  	Assert(!MultiXactOffsetCtl->shared->page_dirty[slotno]);
  
  	LWLockRelease(MultiXactOffsetControlLock);
--- 1454,1460 ----
  	slotno = ZeroMultiXactOffsetPage(0, false);
  
  	/* Make sure it's written out */
! 	SimpleLruWritePage(MultiXactOffsetCtl, slotno);
  	Assert(!MultiXactOffsetCtl->shared->page_dirty[slotno]);
  
  	LWLockRelease(MultiXactOffsetControlLock);
***************
*** 1465,1471 **** BootStrapMultiXact(void)
  	slotno = ZeroMultiXactMemberPage(0, false);
  
  	/* Make sure it's written out */
! 	SimpleLruWritePage(MultiXactMemberCtl, slotno, NULL);
  	Assert(!MultiXactMemberCtl->shared->page_dirty[slotno]);
  
  	LWLockRelease(MultiXactMemberControlLock);
--- 1465,1471 ----
  	slotno = ZeroMultiXactMemberPage(0, false);
  
  	/* Make sure it's written out */
! 	SimpleLruWritePage(MultiXactMemberCtl, slotno);
  	Assert(!MultiXactMemberCtl->shared->page_dirty[slotno]);
  
  	LWLockRelease(MultiXactMemberControlLock);
***************
*** 1986,1992 **** multixact_redo(XLogRecPtr lsn, XLogRecord *record)
  		LWLockAcquire(MultiXactOffsetControlLock, LW_EXCLUSIVE);
  
  		slotno = ZeroMultiXactOffsetPage(pageno, false);
! 		SimpleLruWritePage(MultiXactOffsetCtl, slotno, NULL);
  		Assert(!MultiXactOffsetCtl->shared->page_dirty[slotno]);
  
  		LWLockRelease(MultiXactOffsetControlLock);
--- 1986,1992 ----
  		LWLockAcquire(MultiXactOffsetControlLock, LW_EXCLUSIVE);
  
  		slotno = ZeroMultiXactOffsetPage(pageno, false);
! 		SimpleLruWritePage(MultiXactOffsetCtl, slotno);
  		Assert(!MultiXactOffsetCtl->shared->page_dirty[slotno]);
  
  		LWLockRelease(MultiXactOffsetControlLock);
***************
*** 2001,2007 **** multixact_redo(XLogRecPtr lsn, XLogRecord *record)
  		LWLockAcquire(MultiXactMemberControlLock, LW_EXCLUSIVE);
  
  		slotno = ZeroMultiXactMemberPage(pageno, false);
! 		SimpleLruWritePage(MultiXactMemberCtl, slotno, NULL);
  		Assert(!MultiXactMemberCtl->shared->page_dirty[slotno]);
  
  		LWLockRelease(MultiXactMemberControlLock);
--- 2001,2007 ----
  		LWLockAcquire(MultiXactMemberControlLock, LW_EXCLUSIVE);
  
  		slotno = ZeroMultiXactMemberPage(pageno, false);
! 		SimpleLruWritePage(MultiXactMemberCtl, slotno);
  		Assert(!MultiXactMemberCtl->shared->page_dirty[slotno]);
  
  		LWLockRelease(MultiXactMemberControlLock);
*** a/src/backend/access/transam/slru.c
--- b/src/backend/access/transam/slru.c
***************
*** 78,83 **** typedef struct SlruFlushData
--- 78,85 ----
  	int			segno[MAX_FLUSH_BUFFERS];		/* their log seg#s */
  } SlruFlushData;
  
+ typedef struct SlruFlushData *SlruFlush;
+ 
  /*
   * Macro to mark a buffer slot "most recently used".  Note multiple evaluation
   * of arguments!
***************
*** 123,128 **** static int	slru_errno;
--- 125,131 ----
  
  static void SimpleLruZeroLSNs(SlruCtl ctl, int slotno);
  static void SimpleLruWaitIO(SlruCtl ctl, int slotno);
+ static void SlruInternalWritePage(SlruCtl ctl, int slotno, SlruFlush fdata);
  static bool SlruPhysicalReadPage(SlruCtl ctl, int pageno, int slotno);
  static bool SlruPhysicalWritePage(SlruCtl ctl, int pageno, int slotno,
  					  SlruFlush fdata);
***************
*** 486,492 **** SimpleLruReadPage_ReadOnly(SlruCtl ctl, int pageno, TransactionId xid)
   * Control lock must be held at entry, and will be held at exit.
   */
  void
! SimpleLruWritePage(SlruCtl ctl, int slotno, SlruFlush fdata)
  {
  	SlruShared	shared = ctl->shared;
  	int			pageno = shared->page_number[slotno];
--- 489,505 ----
   * Control lock must be held at entry, and will be held at exit.
   */
  void
! SimpleLruWritePage(SlruCtl ctl, int slotno)
! {
! 	SlruInternalWritePage(ctl, slotno, NULL);
! }
! 
! /*
!  * Page write for internal use, with option to specify a non-NULL SlruFlush
!  * value.  Currently a non-NULL value is only specified in SimpleLruFlush.
!  */
! static void
! SlruInternalWritePage(SlruCtl ctl, int slotno, SlruFlush fdata)
  {
  	SlruShared	shared = ctl->shared;
  	int			pageno = shared->page_number[slotno];
***************
*** 975,981 **** SlruSelectLRUPage(SlruCtl ctl, int pageno)
  		 * we wait for the existing I/O to complete.
  		 */
  		if (shared->page_status[bestslot] == SLRU_PAGE_VALID)
! 			SimpleLruWritePage(ctl, bestslot, NULL);
  		else
  			SimpleLruWaitIO(ctl, bestslot);
  
--- 988,994 ----
  		 * we wait for the existing I/O to complete.
  		 */
  		if (shared->page_status[bestslot] == SLRU_PAGE_VALID)
! 			SlruInternalWritePage(ctl, bestslot, NULL);
  		else
  			SimpleLruWaitIO(ctl, bestslot);
  
***************
*** 1009,1015 **** SimpleLruFlush(SlruCtl ctl, bool checkpoint)
  
  	for (slotno = 0; slotno < shared->num_slots; slotno++)
  	{
! 		SimpleLruWritePage(ctl, slotno, &fdata);
  
  		/*
  		 * When called during a checkpoint, we cannot assert that the slot is
--- 1022,1028 ----
  
  	for (slotno = 0; slotno < shared->num_slots; slotno++)
  	{
! 		SlruInternalWritePage(ctl, slotno, &fdata);
  
  		/*
  		 * When called during a checkpoint, we cannot assert that the slot is
***************
*** 1114,1120 **** restart:;
  		 * keep the logic the same as it was.)
  		 */
  		if (shared->page_status[slotno] == SLRU_PAGE_VALID)
! 			SimpleLruWritePage(ctl, slotno, NULL);
  		else
  			SimpleLruWaitIO(ctl, slotno);
  		goto restart;
--- 1127,1133 ----
  		 * keep the logic the same as it was.)
  		 */
  		if (shared->page_status[slotno] == SLRU_PAGE_VALID)
! 			SlruInternalWritePage(ctl, slotno, NULL);
  		else
  			SimpleLruWaitIO(ctl, slotno);
  		goto restart;
*** a/src/backend/access/transam/subtrans.c
--- b/src/backend/access/transam/subtrans.c
***************
*** 205,211 **** BootStrapSUBTRANS(void)
  	slotno = ZeroSUBTRANSPage(0);
  
  	/* Make sure it's written out */
! 	SimpleLruWritePage(SubTransCtl, slotno, NULL);
  	Assert(!SubTransCtl->shared->page_dirty[slotno]);
  
  	LWLockRelease(SubtransControlLock);
--- 205,211 ----
  	slotno = ZeroSUBTRANSPage(0);
  
  	/* Make sure it's written out */
! 	SimpleLruWritePage(SubTransCtl, slotno);
  	Assert(!SubTransCtl->shared->page_dirty[slotno]);
  
  	LWLockRelease(SubtransControlLock);
*** a/src/backend/commands/async.c
--- b/src/backend/commands/async.c
***************
*** 507,513 **** AsyncShmemInit(void)
  		LWLockAcquire(AsyncCtlLock, LW_EXCLUSIVE);
  		slotno = SimpleLruZeroPage(AsyncCtl, QUEUE_POS_PAGE(QUEUE_HEAD));
  		/* This write is just to verify that pg_notify/ is writable */
! 		SimpleLruWritePage(AsyncCtl, slotno, NULL);
  		LWLockRelease(AsyncCtlLock);
  	}
  }
--- 507,513 ----
  		LWLockAcquire(AsyncCtlLock, LW_EXCLUSIVE);
  		slotno = SimpleLruZeroPage(AsyncCtl, QUEUE_POS_PAGE(QUEUE_HEAD));
  		/* This write is just to verify that pg_notify/ is writable */
! 		SimpleLruWritePage(AsyncCtl, slotno);
  		LWLockRelease(AsyncCtlLock);
  	}
  }
*** a/src/include/access/slru.h
--- b/src/include/access/slru.h
***************
*** 133,141 **** typedef struct SlruCtlData
  
  typedef SlruCtlData *SlruCtl;
  
- /* Opaque struct known only in slru.c */
- typedef struct SlruFlushData *SlruFlush;
- 
  
  extern Size SimpleLruShmemSize(int nslots, int nlsns);
  extern void SimpleLruInit(SlruCtl ctl, const char *name, int nslots, int nlsns,
--- 133,138 ----
***************
*** 145,151 **** extern int SimpleLruReadPage(SlruCtl ctl, int pageno, bool write_ok,
  				  TransactionId xid);
  extern int SimpleLruReadPage_ReadOnly(SlruCtl ctl, int pageno,
  						   TransactionId xid);
! extern void SimpleLruWritePage(SlruCtl ctl, int slotno, SlruFlush fdata);
  extern void SimpleLruFlush(SlruCtl ctl, bool checkpoint);
  extern void SimpleLruTruncate(SlruCtl ctl, int cutoffPage);
  extern bool SlruScanDirectory(SlruCtl ctl, int cutoffPage, bool doDeletions);
--- 142,148 ----
  				  TransactionId xid);
  extern int SimpleLruReadPage_ReadOnly(SlruCtl ctl, int pageno,
  						   TransactionId xid);
! extern void SimpleLruWritePage(SlruCtl ctl, int slotno);
  extern void SimpleLruFlush(SlruCtl ctl, bool checkpoint);
  extern void SimpleLruTruncate(SlruCtl ctl, int cutoffPage);
  extern bool SlruScanDirectory(SlruCtl ctl, int cutoffPage, bool doDeletions);
#2Alvaro Herrera
alvherre@commandprompt.com
In reply to: Kevin Grittner (#1)
Re: SLRU API tweak

Excerpts from Kevin Grittner's message of mié dic 29 20:46:55 -0300 2010:

Attached is a small patch to avoid putting an opaque structure into
the slru.h file and using it in an external function call where
external callers must always specify NULL.

Thanks, committed.

--
Álvaro Herrera <alvherre@commandprompt.com>
The PostgreSQL Company - Command Prompt, Inc.
PostgreSQL Replication, Consulting, Custom Development, 24x7 support