mirror of
				https://github.com/postgres/postgres.git
				synced 2025-10-30 00:04:49 -04:00 
			
		
		
		
	I posted some bufmgr cleanup a few weeks ago, but it conflicted with
some concurrent changes Jan was making to the bufmgr. Here's an
updated version of the patch -- it should apply cleanly to CVS
HEAD and passes the regression tests.
This patch makes the following changes:
     - remove the UnlockAndReleaseBuffer() and UnlockAndWriteBuffer()
       macros, and replace uses of them with calls to the appropriate
       functions.
     - remove a bunch of #ifdef BMTRACE code: it is ugly & broken
       (i.e. it doesn't compile)
     - make BufferReplace() return a bool, not an int
     - cleanup some logic in bufmgr.c; should be functionality
       equivalent to the previous code, just cleaner now
     - remove the BM_PRIVATE flag as it is unused
     - improve a few comments, etc.
			
			
This commit is contained in:
		
							parent
							
								
									81e9455150
								
							
						
					
					
						commit
						fef0c8345a
					
				| @ -8,7 +8,7 @@ | ||||
|  * | ||||
|  * | ||||
|  * IDENTIFICATION | ||||
|  *	  $PostgreSQL: pgsql/src/backend/access/heap/heapam.c,v 1.158 2003/11/29 19:51:40 pgsql Exp $ | ||||
|  *	  $PostgreSQL: pgsql/src/backend/access/heap/heapam.c,v 1.159 2003/12/14 00:34:47 neilc Exp $ | ||||
|  * | ||||
|  * | ||||
|  * INTERFACE ROUTINES | ||||
| @ -2110,7 +2110,8 @@ heap_xlog_clean(bool redo, XLogRecPtr lsn, XLogRecord *record) | ||||
| 
 | ||||
| 	if (XLByteLE(lsn, PageGetLSN(page))) | ||||
| 	{ | ||||
| 		UnlockAndReleaseBuffer(buffer); | ||||
| 		LockBuffer(buffer, BUFFER_LOCK_UNLOCK); | ||||
| 		ReleaseBuffer(buffer); | ||||
| 		return; | ||||
| 	} | ||||
| 
 | ||||
| @ -2135,7 +2136,8 @@ heap_xlog_clean(bool redo, XLogRecPtr lsn, XLogRecord *record) | ||||
| 
 | ||||
| 	PageSetLSN(page, lsn); | ||||
| 	PageSetSUI(page, ThisStartUpID);	/* prev sui */ | ||||
| 	UnlockAndWriteBuffer(buffer); | ||||
| 	LockBuffer(buffer, BUFFER_LOCK_UNLOCK); | ||||
| 	WriteBuffer(buffer); | ||||
| } | ||||
| 
 | ||||
| static void | ||||
| @ -2170,7 +2172,8 @@ heap_xlog_delete(bool redo, XLogRecPtr lsn, XLogRecord *record) | ||||
| 	{ | ||||
| 		if (XLByteLE(lsn, PageGetLSN(page)))	/* changes are applied */ | ||||
| 		{ | ||||
| 			UnlockAndReleaseBuffer(buffer); | ||||
| 			LockBuffer(buffer, BUFFER_LOCK_UNLOCK); | ||||
| 			ReleaseBuffer(buffer); | ||||
| 			return; | ||||
| 		} | ||||
| 	} | ||||
| @ -2199,7 +2202,8 @@ heap_xlog_delete(bool redo, XLogRecPtr lsn, XLogRecord *record) | ||||
| 		htup->t_ctid = xlrec->target.tid; | ||||
| 		PageSetLSN(page, lsn); | ||||
| 		PageSetSUI(page, ThisStartUpID); | ||||
| 		UnlockAndWriteBuffer(buffer); | ||||
| 		LockBuffer(buffer, BUFFER_LOCK_UNLOCK); | ||||
| 		WriteBuffer(buffer); | ||||
| 		return; | ||||
| 	} | ||||
| 
 | ||||
| @ -2249,7 +2253,8 @@ heap_xlog_insert(bool redo, XLogRecPtr lsn, XLogRecord *record) | ||||
| 
 | ||||
| 		if (XLByteLE(lsn, PageGetLSN(page)))	/* changes are applied */ | ||||
| 		{ | ||||
| 			UnlockAndReleaseBuffer(buffer); | ||||
| 			LockBuffer(buffer, BUFFER_LOCK_UNLOCK); | ||||
| 			ReleaseBuffer(buffer); | ||||
| 			return; | ||||
| 		} | ||||
| 
 | ||||
| @ -2282,7 +2287,8 @@ heap_xlog_insert(bool redo, XLogRecPtr lsn, XLogRecord *record) | ||||
| 			elog(PANIC, "heap_insert_redo: failed to add tuple"); | ||||
| 		PageSetLSN(page, lsn); | ||||
| 		PageSetSUI(page, ThisStartUpID);		/* prev sui */ | ||||
| 		UnlockAndWriteBuffer(buffer); | ||||
| 		LockBuffer(buffer, BUFFER_LOCK_UNLOCK); | ||||
| 		WriteBuffer(buffer); | ||||
| 		return; | ||||
| 	} | ||||
| 
 | ||||
| @ -2332,7 +2338,8 @@ heap_xlog_update(bool redo, XLogRecPtr lsn, XLogRecord *record, bool move) | ||||
| 	{ | ||||
| 		if (XLByteLE(lsn, PageGetLSN(page)))	/* changes are applied */ | ||||
| 		{ | ||||
| 			UnlockAndReleaseBuffer(buffer); | ||||
| 			LockBuffer(buffer, BUFFER_LOCK_UNLOCK); | ||||
| 			ReleaseBuffer(buffer); | ||||
| 			if (samepage) | ||||
| 				return; | ||||
| 			goto newt; | ||||
| @ -2378,7 +2385,8 @@ heap_xlog_update(bool redo, XLogRecPtr lsn, XLogRecord *record, bool move) | ||||
| 			goto newsame; | ||||
| 		PageSetLSN(page, lsn); | ||||
| 		PageSetSUI(page, ThisStartUpID); | ||||
| 		UnlockAndWriteBuffer(buffer); | ||||
| 		LockBuffer(buffer, BUFFER_LOCK_UNLOCK); | ||||
| 		WriteBuffer(buffer); | ||||
| 		goto newt; | ||||
| 	} | ||||
| 
 | ||||
| @ -2421,7 +2429,8 @@ newsame:; | ||||
| 
 | ||||
| 		if (XLByteLE(lsn, PageGetLSN(page)))	/* changes are applied */ | ||||
| 		{ | ||||
| 			UnlockAndReleaseBuffer(buffer); | ||||
| 			LockBuffer(buffer, BUFFER_LOCK_UNLOCK); | ||||
| 			ReleaseBuffer(buffer); | ||||
| 			return; | ||||
| 		} | ||||
| 
 | ||||
| @ -2474,7 +2483,8 @@ newsame:; | ||||
| 			elog(PANIC, "heap_update_redo: failed to add tuple"); | ||||
| 		PageSetLSN(page, lsn); | ||||
| 		PageSetSUI(page, ThisStartUpID);		/* prev sui */ | ||||
| 		UnlockAndWriteBuffer(buffer); | ||||
| 		LockBuffer(buffer, BUFFER_LOCK_UNLOCK); | ||||
| 		WriteBuffer(buffer); | ||||
| 		return; | ||||
| 	} | ||||
| 
 | ||||
| @ -2523,7 +2533,8 @@ _heap_unlock_tuple(void *data) | ||||
| 		elog(PANIC, "_heap_unlock_tuple: invalid xmax in rollback"); | ||||
| 	htup->t_infomask &= ~HEAP_XMAX_UNLOGGED; | ||||
| 	htup->t_infomask |= HEAP_XMAX_INVALID; | ||||
| 	UnlockAndWriteBuffer(buffer); | ||||
| 	LockBuffer(buffer, BUFFER_LOCK_UNLOCK); | ||||
| 	WriteBuffer(buffer); | ||||
| 	return; | ||||
| } | ||||
| 
 | ||||
|  | ||||
| @ -8,7 +8,7 @@ | ||||
|  * Portions Copyright (c) 1994, Regents of the University of California | ||||
|  * | ||||
|  * IDENTIFICATION | ||||
|  *	  $PostgreSQL: pgsql/src/backend/access/nbtree/nbtxlog.c,v 1.8 2003/11/29 19:51:40 pgsql Exp $ | ||||
|  *	  $PostgreSQL: pgsql/src/backend/access/nbtree/nbtxlog.c,v 1.9 2003/12/14 00:34:47 neilc Exp $ | ||||
|  * | ||||
|  *------------------------------------------------------------------------- | ||||
|  */ | ||||
| @ -69,7 +69,8 @@ forget_matching_split(Relation reln, RelFileNode node, | ||||
| 	btitem = (BTItem) PageGetItem(page, PageGetItemId(page, offnum)); | ||||
| 	rightblk = ItemPointerGetBlockNumber(&(btitem->bti_itup.t_tid)); | ||||
| 	Assert(ItemPointerGetOffsetNumber(&(btitem->bti_itup.t_tid)) == P_HIKEY); | ||||
| 	UnlockAndReleaseBuffer(buffer); | ||||
| 	LockBuffer(buffer, BUFFER_LOCK_UNLOCK); | ||||
| 	ReleaseBuffer(buffer); | ||||
| 
 | ||||
| 	foreach(l, incomplete_splits) | ||||
| 	{ | ||||
| @ -137,7 +138,8 @@ _bt_restore_meta(Relation reln, XLogRecPtr lsn, | ||||
| 
 | ||||
| 	PageSetLSN(metapg, lsn); | ||||
| 	PageSetSUI(metapg, ThisStartUpID); | ||||
| 	UnlockAndWriteBuffer(metabuf); | ||||
| 	LockBuffer(metabuf, BUFFER_LOCK_UNLOCK); | ||||
| 	WriteBuffer(metabuf); | ||||
| } | ||||
| 
 | ||||
| static void | ||||
| @ -184,7 +186,10 @@ btree_xlog_insert(bool redo, bool isleaf, bool ismeta, | ||||
| 		if (redo) | ||||
| 		{ | ||||
| 			if (XLByteLE(lsn, PageGetLSN(page))) | ||||
| 				UnlockAndReleaseBuffer(buffer); | ||||
| 			{ | ||||
| 				LockBuffer(buffer, BUFFER_LOCK_UNLOCK); | ||||
| 				ReleaseBuffer(buffer); | ||||
| 			} | ||||
| 			else | ||||
| 			{ | ||||
| 				if (PageAddItem(page, (Item) datapos, datalen, | ||||
| @ -194,7 +199,8 @@ btree_xlog_insert(bool redo, bool isleaf, bool ismeta, | ||||
| 
 | ||||
| 				PageSetLSN(page, lsn); | ||||
| 				PageSetSUI(page, ThisStartUpID); | ||||
| 				UnlockAndWriteBuffer(buffer); | ||||
| 				LockBuffer(buffer, BUFFER_LOCK_UNLOCK); | ||||
| 				WriteBuffer(buffer); | ||||
| 			} | ||||
| 		} | ||||
| 		else | ||||
| @ -203,7 +209,10 @@ btree_xlog_insert(bool redo, bool isleaf, bool ismeta, | ||||
| 				elog(PANIC, "btree_insert_undo: bad page LSN"); | ||||
| 
 | ||||
| 			if (!P_ISLEAF(pageop)) | ||||
| 				UnlockAndReleaseBuffer(buffer); | ||||
| 			{ | ||||
| 				LockBuffer(buffer, BUFFER_LOCK_UNLOCK); | ||||
| 				ReleaseBuffer(buffer); | ||||
| 			} | ||||
| 			else | ||||
| 				elog(PANIC, "btree_insert_undo: unimplemented"); | ||||
| 		} | ||||
| @ -275,7 +284,8 @@ btree_xlog_split(bool redo, bool onleft, bool isroot, | ||||
| 
 | ||||
| 		PageSetLSN(page, lsn); | ||||
| 		PageSetSUI(page, ThisStartUpID); | ||||
| 		UnlockAndWriteBuffer(buffer); | ||||
| 		LockBuffer(buffer, BUFFER_LOCK_UNLOCK); | ||||
| 		WriteBuffer(buffer); | ||||
| 	} | ||||
| 	else | ||||
| 	{ | ||||
| @ -310,7 +320,8 @@ btree_xlog_split(bool redo, bool onleft, bool isroot, | ||||
| 
 | ||||
| 		PageSetLSN(page, lsn); | ||||
| 		PageSetSUI(page, ThisStartUpID); | ||||
| 		UnlockAndWriteBuffer(buffer); | ||||
| 		LockBuffer(buffer, BUFFER_LOCK_UNLOCK); | ||||
| 		WriteBuffer(buffer); | ||||
| 	} | ||||
| 	else | ||||
| 	{ | ||||
| @ -334,7 +345,10 @@ btree_xlog_split(bool redo, bool onleft, bool isroot, | ||||
| 				elog(PANIC, "btree_split_redo: uninitialized next right page"); | ||||
| 
 | ||||
| 			if (XLByteLE(lsn, PageGetLSN(page))) | ||||
| 				UnlockAndReleaseBuffer(buffer); | ||||
| 			{ | ||||
| 				LockBuffer(buffer, BUFFER_LOCK_UNLOCK); | ||||
| 				ReleaseBuffer(buffer); | ||||
| 			} | ||||
| 			else | ||||
| 			{ | ||||
| 				pageop = (BTPageOpaque) PageGetSpecialPointer(page); | ||||
| @ -342,7 +356,8 @@ btree_xlog_split(bool redo, bool onleft, bool isroot, | ||||
| 
 | ||||
| 				PageSetLSN(page, lsn); | ||||
| 				PageSetSUI(page, ThisStartUpID); | ||||
| 				UnlockAndWriteBuffer(buffer); | ||||
| 				LockBuffer(buffer, BUFFER_LOCK_UNLOCK); | ||||
| 				WriteBuffer(buffer); | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| @ -385,7 +400,8 @@ btree_xlog_delete(bool redo, XLogRecPtr lsn, XLogRecord *record) | ||||
| 
 | ||||
| 	if (XLByteLE(lsn, PageGetLSN(page))) | ||||
| 	{ | ||||
| 		UnlockAndReleaseBuffer(buffer); | ||||
| 		LockBuffer(buffer, BUFFER_LOCK_UNLOCK); | ||||
| 		ReleaseBuffer(buffer); | ||||
| 		return; | ||||
| 	} | ||||
| 
 | ||||
| @ -407,7 +423,8 @@ btree_xlog_delete(bool redo, XLogRecPtr lsn, XLogRecord *record) | ||||
| 
 | ||||
| 	PageSetLSN(page, lsn); | ||||
| 	PageSetSUI(page, ThisStartUpID); | ||||
| 	UnlockAndWriteBuffer(buffer); | ||||
| 	LockBuffer(buffer, BUFFER_LOCK_UNLOCK); | ||||
| 	WriteBuffer(buffer); | ||||
| } | ||||
| 
 | ||||
| static void | ||||
| @ -445,7 +462,10 @@ btree_xlog_delete_page(bool redo, bool ismeta, | ||||
| 		if (PageIsNew((PageHeader) page)) | ||||
| 			elog(PANIC, "btree_delete_page_redo: uninitialized parent page"); | ||||
| 		if (XLByteLE(lsn, PageGetLSN(page))) | ||||
| 			UnlockAndReleaseBuffer(buffer); | ||||
| 		{ | ||||
| 			LockBuffer(buffer, BUFFER_LOCK_UNLOCK); | ||||
| 			ReleaseBuffer(buffer); | ||||
| 		} | ||||
| 		else | ||||
| 		{ | ||||
| 			OffsetNumber poffset; | ||||
| @ -472,7 +492,8 @@ btree_xlog_delete_page(bool redo, bool ismeta, | ||||
| 
 | ||||
| 			PageSetLSN(page, lsn); | ||||
| 			PageSetSUI(page, ThisStartUpID); | ||||
| 			UnlockAndWriteBuffer(buffer); | ||||
| 			LockBuffer(buffer, BUFFER_LOCK_UNLOCK); | ||||
| 			WriteBuffer(buffer); | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| @ -486,7 +507,10 @@ btree_xlog_delete_page(bool redo, bool ismeta, | ||||
| 		if (PageIsNew((PageHeader) page)) | ||||
| 			elog(PANIC, "btree_delete_page_redo: uninitialized right sibling"); | ||||
| 		if (XLByteLE(lsn, PageGetLSN(page))) | ||||
| 			UnlockAndReleaseBuffer(buffer); | ||||
| 		{ | ||||
| 			LockBuffer(buffer, BUFFER_LOCK_UNLOCK); | ||||
| 			ReleaseBuffer(buffer); | ||||
| 		} | ||||
| 		else | ||||
| 		{ | ||||
| 			pageop = (BTPageOpaque) PageGetSpecialPointer(page); | ||||
| @ -494,7 +518,8 @@ btree_xlog_delete_page(bool redo, bool ismeta, | ||||
| 
 | ||||
| 			PageSetLSN(page, lsn); | ||||
| 			PageSetSUI(page, ThisStartUpID); | ||||
| 			UnlockAndWriteBuffer(buffer); | ||||
| 			LockBuffer(buffer, BUFFER_LOCK_UNLOCK); | ||||
| 			WriteBuffer(buffer); | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| @ -510,7 +535,10 @@ btree_xlog_delete_page(bool redo, bool ismeta, | ||||
| 			if (PageIsNew((PageHeader) page)) | ||||
| 				elog(PANIC, "btree_delete_page_redo: uninitialized left sibling"); | ||||
| 			if (XLByteLE(lsn, PageGetLSN(page))) | ||||
| 				UnlockAndReleaseBuffer(buffer); | ||||
| 			{ | ||||
| 				LockBuffer(buffer, BUFFER_LOCK_UNLOCK); | ||||
| 				ReleaseBuffer(buffer); | ||||
| 			} | ||||
| 			else | ||||
| 			{ | ||||
| 				pageop = (BTPageOpaque) PageGetSpecialPointer(page); | ||||
| @ -518,7 +546,8 @@ btree_xlog_delete_page(bool redo, bool ismeta, | ||||
| 
 | ||||
| 				PageSetLSN(page, lsn); | ||||
| 				PageSetSUI(page, ThisStartUpID); | ||||
| 				UnlockAndWriteBuffer(buffer); | ||||
| 				LockBuffer(buffer, BUFFER_LOCK_UNLOCK); | ||||
| 				WriteBuffer(buffer); | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| @ -543,7 +572,8 @@ btree_xlog_delete_page(bool redo, bool ismeta, | ||||
| 
 | ||||
| 		PageSetLSN(page, lsn); | ||||
| 		PageSetSUI(page, ThisStartUpID); | ||||
| 		UnlockAndWriteBuffer(buffer); | ||||
| 		LockBuffer(buffer, BUFFER_LOCK_UNLOCK); | ||||
| 		WriteBuffer(buffer); | ||||
| 	} | ||||
| 	else | ||||
| 	{ | ||||
| @ -606,7 +636,8 @@ btree_xlog_newroot(bool redo, XLogRecPtr lsn, XLogRecord *record) | ||||
| 
 | ||||
| 	PageSetLSN(page, lsn); | ||||
| 	PageSetSUI(page, ThisStartUpID); | ||||
| 	UnlockAndWriteBuffer(buffer); | ||||
| 	LockBuffer(buffer, BUFFER_LOCK_UNLOCK); | ||||
| 	WriteBuffer(buffer); | ||||
| 
 | ||||
| 	_bt_restore_meta(reln, lsn, | ||||
| 					 xlrec->rootblk, xlrec->level, | ||||
| @ -668,7 +699,8 @@ btree_xlog_newpage(bool redo, XLogRecPtr lsn, XLogRecord *record) | ||||
| 
 | ||||
| 	PageSetLSN(page, lsn); | ||||
| 	PageSetSUI(page, ThisStartUpID); | ||||
| 	UnlockAndWriteBuffer(buffer); | ||||
| 	LockBuffer(buffer, BUFFER_LOCK_UNLOCK); | ||||
| 	WriteBuffer(buffer); | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
|  | ||||
| @ -7,7 +7,7 @@ | ||||
|  * Portions Copyright (c) 1996-2003, PostgreSQL Global Development Group | ||||
|  * Portions Copyright (c) 1994, Regents of the University of California | ||||
|  * | ||||
|  * $PostgreSQL: pgsql/src/backend/access/transam/xlog.c,v 1.127 2003/12/12 18:45:08 petere Exp $ | ||||
|  * $PostgreSQL: pgsql/src/backend/access/transam/xlog.c,v 1.128 2003/12/14 00:34:47 neilc Exp $ | ||||
|  * | ||||
|  *------------------------------------------------------------------------- | ||||
|  */ | ||||
| @ -1712,7 +1712,8 @@ RestoreBkpBlocks(XLogRecord *record, XLogRecPtr lsn) | ||||
| 				memcpy((char *) page, blk, BLCKSZ); | ||||
| 				PageSetLSN(page, lsn); | ||||
| 				PageSetSUI(page, ThisStartUpID); | ||||
| 				UnlockAndWriteBuffer(buffer); | ||||
| 				LockBuffer(buffer, BUFFER_LOCK_UNLOCK); | ||||
| 				WriteBuffer(buffer); | ||||
| 			} | ||||
| 		} | ||||
| 
 | ||||
|  | ||||
| @ -6,7 +6,7 @@ | ||||
|  * Portions Copyright (c) 1996-2003, PostgreSQL Global Development Group | ||||
|  * Portions Copyright (c) 1994, Regents of the University of California | ||||
|  * | ||||
|  * $PostgreSQL: pgsql/src/backend/access/transam/xlogutils.c,v 1.27 2003/11/29 19:51:40 pgsql Exp $ | ||||
|  * $PostgreSQL: pgsql/src/backend/access/transam/xlogutils.c,v 1.28 2003/12/14 00:34:47 neilc Exp $ | ||||
|  * | ||||
|  *------------------------------------------------------------------------- | ||||
|  */ | ||||
| @ -60,13 +60,15 @@ XLogIsOwnerOfTuple(RelFileNode hnode, ItemPointer iptr, | ||||
| 	if (PageIsNew((PageHeader) page) || | ||||
| 		ItemPointerGetOffsetNumber(iptr) > PageGetMaxOffsetNumber(page)) | ||||
| 	{ | ||||
| 		UnlockAndReleaseBuffer(buffer); | ||||
| 		LockBuffer(buffer, BUFFER_LOCK_UNLOCK); | ||||
| 		ReleaseBuffer(buffer); | ||||
| 		return (0); | ||||
| 	} | ||||
| 	lp = PageGetItemId(page, ItemPointerGetOffsetNumber(iptr)); | ||||
| 	if (!ItemIdIsUsed(lp) || ItemIdDeleted(lp)) | ||||
| 	{ | ||||
| 		UnlockAndReleaseBuffer(buffer); | ||||
| 		LockBuffer(buffer, BUFFER_LOCK_UNLOCK); | ||||
| 		ReleaseBuffer(buffer); | ||||
| 		return (0); | ||||
| 	} | ||||
| 
 | ||||
| @ -76,11 +78,13 @@ XLogIsOwnerOfTuple(RelFileNode hnode, ItemPointer iptr, | ||||
| 	if (!TransactionIdEquals(HeapTupleHeaderGetXmin(htup), xid) || | ||||
| 		HeapTupleHeaderGetCmin(htup) != cid) | ||||
| 	{ | ||||
| 		UnlockAndReleaseBuffer(buffer); | ||||
| 		LockBuffer(buffer, BUFFER_LOCK_UNLOCK); | ||||
| 		ReleaseBuffer(buffer); | ||||
| 		return (-1); | ||||
| 	} | ||||
| 
 | ||||
| 	UnlockAndReleaseBuffer(buffer); | ||||
| 	LockBuffer(buffer, BUFFER_LOCK_UNLOCK); | ||||
| 	ReleaseBuffer(buffer); | ||||
| 	return (1); | ||||
| } | ||||
| 
 | ||||
| @ -112,21 +116,24 @@ XLogIsValidTuple(RelFileNode hnode, ItemPointer iptr) | ||||
| 	if (PageIsNew((PageHeader) page) || | ||||
| 		ItemPointerGetOffsetNumber(iptr) > PageGetMaxOffsetNumber(page)) | ||||
| 	{ | ||||
| 		UnlockAndReleaseBuffer(buffer); | ||||
| 		LockBuffer(buffer, BUFFER_LOCK_UNLOCK); | ||||
| 		ReleaseBuffer(buffer); | ||||
| 		return (false); | ||||
| 	} | ||||
| 
 | ||||
| 	if (PageGetSUI(page) != ThisStartUpID) | ||||
| 	{ | ||||
| 		Assert(PageGetSUI(page) < ThisStartUpID); | ||||
| 		UnlockAndReleaseBuffer(buffer); | ||||
| 		LockBuffer(buffer, BUFFER_LOCK_UNLOCK); | ||||
| 		ReleaseBuffer(buffer); | ||||
| 		return (true); | ||||
| 	} | ||||
| 
 | ||||
| 	lp = PageGetItemId(page, ItemPointerGetOffsetNumber(iptr)); | ||||
| 	if (!ItemIdIsUsed(lp) || ItemIdDeleted(lp)) | ||||
| 	{ | ||||
| 		UnlockAndReleaseBuffer(buffer); | ||||
| 		LockBuffer(buffer, BUFFER_LOCK_UNLOCK); | ||||
| 		ReleaseBuffer(buffer); | ||||
| 		return (false); | ||||
| 	} | ||||
| 
 | ||||
| @ -141,12 +148,14 @@ XLogIsValidTuple(RelFileNode hnode, ItemPointer iptr) | ||||
| 			 TransactionIdDidAbort(HeapTupleHeaderGetXvac(htup))) || | ||||
| 			TransactionIdDidAbort(HeapTupleHeaderGetXmin(htup))) | ||||
| 		{ | ||||
| 			UnlockAndReleaseBuffer(buffer); | ||||
| 			LockBuffer(buffer, BUFFER_LOCK_UNLOCK); | ||||
| 			ReleaseBuffer(buffer); | ||||
| 			return (false); | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	UnlockAndReleaseBuffer(buffer); | ||||
| 	LockBuffer(buffer, BUFFER_LOCK_UNLOCK); | ||||
| 	ReleaseBuffer(buffer); | ||||
| 	return (true); | ||||
| } | ||||
| 
 | ||||
|  | ||||
| @ -8,7 +8,7 @@ | ||||
|  * | ||||
|  * | ||||
|  * IDENTIFICATION | ||||
|  *	  $PostgreSQL: pgsql/src/backend/commands/sequence.c,v 1.105 2003/11/29 19:51:47 pgsql Exp $ | ||||
|  *	  $PostgreSQL: pgsql/src/backend/commands/sequence.c,v 1.106 2003/12/14 00:34:47 neilc Exp $ | ||||
|  * | ||||
|  *------------------------------------------------------------------------- | ||||
|  */ | ||||
| @ -1104,7 +1104,8 @@ seq_redo(XLogRecPtr lsn, XLogRecord *record) | ||||
| 
 | ||||
| 	PageSetLSN(page, lsn); | ||||
| 	PageSetSUI(page, ThisStartUpID); | ||||
| 	UnlockAndWriteBuffer(buffer); | ||||
| 	LockBuffer(buffer, BUFFER_LOCK_UNLOCK); | ||||
| 	WriteBuffer(buffer); | ||||
| } | ||||
| 
 | ||||
| void | ||||
|  | ||||
| @ -8,7 +8,7 @@ | ||||
|  * | ||||
|  * | ||||
|  * IDENTIFICATION | ||||
|  *	  $PostgreSQL: pgsql/src/backend/storage/buffer/buf_init.c,v 1.58 2003/11/29 19:51:56 pgsql Exp $ | ||||
|  *	  $PostgreSQL: pgsql/src/backend/storage/buffer/buf_init.c,v 1.59 2003/12/14 00:34:47 neilc Exp $ | ||||
|  * | ||||
|  *------------------------------------------------------------------------- | ||||
|  */ | ||||
| @ -34,17 +34,6 @@ | ||||
| #include "utils/hsearch.h" | ||||
| #include "utils/memutils.h" | ||||
| 
 | ||||
| 
 | ||||
| /*
 | ||||
|  *	if BMTRACE is defined, we trace the last 200 buffer allocations and | ||||
|  *	deallocations in a circular buffer in shared memory. | ||||
|  */ | ||||
| #ifdef	BMTRACE | ||||
| bmtrace    *TraceBuf; | ||||
| long	   *CurTraceBuf; | ||||
| 
 | ||||
| #define BMT_LIMIT		200 | ||||
| #endif   /* BMTRACE */ | ||||
| int			ShowPinTrace = 0; | ||||
| 
 | ||||
| int			Data_Descriptors; | ||||
| @ -138,16 +127,6 @@ InitBufferPool(void) | ||||
| 	 */ | ||||
| 	LWLockAcquire(BufMgrLock, LW_EXCLUSIVE); | ||||
| 
 | ||||
| #ifdef BMTRACE | ||||
| 	CurTraceBuf = (long *) ShmemInitStruct("Buffer trace", | ||||
| 							(BMT_LIMIT * sizeof(bmtrace)) + sizeof(long), | ||||
| 										   &foundDescs); | ||||
| 	if (!foundDescs) | ||||
| 		MemSet(CurTraceBuf, 0, (BMT_LIMIT * sizeof(bmtrace)) + sizeof(long)); | ||||
| 
 | ||||
| 	TraceBuf = (bmtrace *) & (CurTraceBuf[1]); | ||||
| #endif | ||||
| 
 | ||||
| 	BufferDescriptors = (BufferDesc *) | ||||
| 		ShmemInitStruct("Buffer Descriptors", | ||||
| 					  Data_Descriptors * sizeof(BufferDesc), &foundDescs); | ||||
| @ -256,9 +235,5 @@ BufferShmemSize(void) | ||||
| 	/* size of buffer hash table */ | ||||
| 	size += hash_estimate_size(NBuffers, sizeof(BufferLookupEnt)); | ||||
| 
 | ||||
| #ifdef BMTRACE | ||||
| 	size += (BMT_LIMIT * sizeof(bmtrace)) + sizeof(long); | ||||
| #endif | ||||
| 
 | ||||
| 	return size; | ||||
| } | ||||
|  | ||||
| @ -8,7 +8,7 @@ | ||||
|  * | ||||
|  * | ||||
|  * IDENTIFICATION | ||||
|  *	  $PostgreSQL: pgsql/src/backend/storage/buffer/buf_table.c,v 1.33 2003/11/29 19:51:56 pgsql Exp $ | ||||
|  *	  $PostgreSQL: pgsql/src/backend/storage/buffer/buf_table.c,v 1.34 2003/12/14 00:34:47 neilc Exp $ | ||||
|  * | ||||
|  *------------------------------------------------------------------------- | ||||
|  */ | ||||
| @ -117,15 +117,3 @@ BufTableDelete(BufferTag *tagPtr) | ||||
| 
 | ||||
| 	return TRUE; | ||||
| } | ||||
| 
 | ||||
| /* prints out collision stats for the buf table */ | ||||
| #ifdef NOT_USED | ||||
| void | ||||
| DBG_LookupListCheck(int nlookup) | ||||
| { | ||||
| 	nlookup = 10; | ||||
| 
 | ||||
| 	hash_stats("Shared", SharedBufHash); | ||||
| } | ||||
| 
 | ||||
| #endif | ||||
|  | ||||
| @ -8,7 +8,7 @@ | ||||
|  * | ||||
|  * | ||||
|  * IDENTIFICATION | ||||
|  *	  $PostgreSQL: pgsql/src/backend/storage/buffer/bufmgr.c,v 1.148 2003/12/01 16:53:19 tgl Exp $ | ||||
|  *	  $PostgreSQL: pgsql/src/backend/storage/buffer/bufmgr.c,v 1.149 2003/12/14 00:34:47 neilc Exp $ | ||||
|  * | ||||
|  *------------------------------------------------------------------------- | ||||
|  */ | ||||
| @ -84,7 +84,7 @@ static Buffer ReadBufferInternal(Relation reln, BlockNumber blockNum, | ||||
| 				   bool bufferLockHeld); | ||||
| static BufferDesc *BufferAlloc(Relation reln, BlockNumber blockNum, | ||||
| 			bool *foundPtr); | ||||
| static int	BufferReplace(BufferDesc *bufHdr); | ||||
| static bool BufferReplace(BufferDesc *bufHdr); | ||||
| 
 | ||||
| #ifdef NOT_USED | ||||
| void		PrintBufferDescs(void); | ||||
| @ -109,13 +109,6 @@ static void write_buffer(Buffer buffer, bool unpin); | ||||
|  * | ||||
|  * Note: a side effect of a P_NEW call is to update reln->rd_nblocks. | ||||
|  */ | ||||
| 
 | ||||
| #undef ReadBuffer				/* conflicts with macro when BUFMGR_DEBUG | ||||
| 								 * defined */ | ||||
| 
 | ||||
| /*
 | ||||
|  * ReadBuffer | ||||
|  */ | ||||
| Buffer | ||||
| ReadBuffer(Relation reln, BlockNumber blockNum) | ||||
| { | ||||
| @ -363,15 +356,10 @@ BufferAlloc(Relation reln, | ||||
| 			 * This is never going to happen, don't worry about it. | ||||
| 			 */ | ||||
| 			*foundPtr = FALSE; | ||||
| 		} | ||||
| #ifdef BMTRACE | ||||
| 		_bm_trace((reln->rd_rel->relisshared ? 0 : MyDatabaseId), RelationGetRelid(reln), blockNum, BufferDescriptorGetBuffer(buf), BMT_ALLOCFND); | ||||
| #endif   /* BMTRACE */ | ||||
| 
 | ||||
| 		if (!(*foundPtr)) | ||||
| 			StartBufferIO(buf, true); | ||||
| 		LWLockRelease(BufMgrLock); | ||||
| 		} | ||||
| 
 | ||||
| 		LWLockRelease(BufMgrLock); | ||||
| 		return buf; | ||||
| 	} | ||||
| 
 | ||||
| @ -402,7 +390,7 @@ BufferAlloc(Relation reln, | ||||
| 
 | ||||
| 		if (buf->flags & BM_DIRTY || buf->cntxDirty) | ||||
| 		{ | ||||
| 			bool		smok; | ||||
| 			bool	replace_ok; | ||||
| 
 | ||||
| 			/*
 | ||||
| 			 * skip write error buffers | ||||
| @ -436,9 +424,9 @@ BufferAlloc(Relation reln, | ||||
| 			 * Write the buffer out, being careful to release BufMgrLock | ||||
| 			 * before starting the I/O. | ||||
| 			 */ | ||||
| 			smok = BufferReplace(buf); | ||||
| 			replace_ok = BufferReplace(buf); | ||||
| 
 | ||||
| 			if (smok == FALSE) | ||||
| 			if (replace_ok == false) | ||||
| 			{ | ||||
| 				ereport(WARNING, | ||||
| 						(errcode(ERRCODE_IO_ERROR), | ||||
| @ -465,8 +453,8 @@ BufferAlloc(Relation reln, | ||||
| 						 buf->tag.blockNum, | ||||
| 						 buf->tag.rnode.tblNode, buf->tag.rnode.relNode); | ||||
| 				} | ||||
| 				else | ||||
| 					buf->flags &= ~BM_DIRTY; | ||||
| 
 | ||||
| 				buf->flags &= ~BM_DIRTY; | ||||
| 				buf->cntxDirty = false; | ||||
| 			} | ||||
| 
 | ||||
| @ -523,13 +511,14 @@ BufferAlloc(Relation reln, | ||||
| 					WaitIO(buf2); | ||||
| 					inProgress = (buf2->flags & BM_IO_IN_PROGRESS); | ||||
| 				} | ||||
| 
 | ||||
| 				if (BUFFER_IS_BROKEN(buf2)) | ||||
| 				{ | ||||
| 					*foundPtr = FALSE; | ||||
| 
 | ||||
| 				if (!(*foundPtr)) | ||||
| 					StartBufferIO(buf2, true); | ||||
| 				LWLockRelease(BufMgrLock); | ||||
| 				} | ||||
| 
 | ||||
| 				LWLockRelease(BufMgrLock); | ||||
| 				return buf2; | ||||
| 			} | ||||
| 		} | ||||
| @ -558,10 +547,6 @@ BufferAlloc(Relation reln, | ||||
| 	else | ||||
| 		ContinueBufferIO(buf, true); | ||||
| 
 | ||||
| #ifdef BMTRACE | ||||
| 	_bm_trace((reln->rd_rel->relisshared ? 0 : MyDatabaseId), RelationGetRelid(reln), blockNum, BufferDescriptorGetBuffer(buf), BMT_ALLOCNOTFND); | ||||
| #endif   /* BMTRACE */ | ||||
| 
 | ||||
| 	LWLockRelease(BufMgrLock); | ||||
| 
 | ||||
| 	return buf; | ||||
| @ -602,15 +587,11 @@ write_buffer(Buffer buffer, bool release) | ||||
|  * | ||||
|  *		Marks buffer contents as dirty (actual write happens later). | ||||
|  * | ||||
|  * Assume that buffer is pinned.  Assume that reln is | ||||
|  *		valid. | ||||
|  * Assume that buffer is pinned.  Assume that reln is valid. | ||||
|  * | ||||
|  * Side Effects: | ||||
|  *		Pin count is decremented. | ||||
|  */ | ||||
| 
 | ||||
| #undef WriteBuffer | ||||
| 
 | ||||
| void | ||||
| WriteBuffer(Buffer buffer) | ||||
| { | ||||
| @ -627,8 +608,6 @@ WriteNoReleaseBuffer(Buffer buffer) | ||||
| 	write_buffer(buffer, false); | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| #undef ReleaseAndReadBuffer | ||||
| /*
 | ||||
|  * ReleaseAndReadBuffer -- combine ReleaseBuffer() and ReadBuffer() | ||||
|  *		to save a lock release/acquire. | ||||
| @ -638,7 +617,7 @@ WriteNoReleaseBuffer(Buffer buffer) | ||||
|  * Since the passed buffer must be pinned, it's OK to examine its block | ||||
|  * number without getting the lock first. | ||||
|  * | ||||
|  * Note: it is OK to pass buffer = InvalidBuffer, indicating that no old | ||||
|  * Note: it is OK to pass buffer == InvalidBuffer, indicating that no old | ||||
|  * buffer actually needs to be released.  This case is the same as ReadBuffer, | ||||
|  * but can save some tests in the caller. | ||||
|  * | ||||
| @ -1092,11 +1071,12 @@ BufferGetBlockNumber(Buffer buffer) | ||||
| /*
 | ||||
|  * BufferReplace | ||||
|  * | ||||
|  * Write out the buffer corresponding to 'bufHdr' | ||||
|  * Write out the buffer corresponding to 'bufHdr'. Returns 'true' if | ||||
|  * the buffer was successfully written out, 'false' otherwise. | ||||
|  * | ||||
|  * BufMgrLock must be held at entry, and the buffer must be pinned. | ||||
|  */ | ||||
| static int | ||||
| static bool | ||||
| BufferReplace(BufferDesc *bufHdr) | ||||
| { | ||||
| 	Relation	reln; | ||||
| @ -1147,11 +1127,11 @@ BufferReplace(BufferDesc *bufHdr) | ||||
| 	LWLockAcquire(BufMgrLock, LW_EXCLUSIVE); | ||||
| 
 | ||||
| 	if (status == SM_FAIL) | ||||
| 		return FALSE; | ||||
| 		return false; | ||||
| 
 | ||||
| 	BufferFlushCount++; | ||||
| 
 | ||||
| 	return TRUE; | ||||
| 	return true; | ||||
| } | ||||
| 
 | ||||
| /*
 | ||||
| @ -1167,7 +1147,7 @@ RelationGetNumberOfBlocks(Relation relation) | ||||
| 	 * new or temp, because no one else should be modifying it.  Otherwise | ||||
| 	 * we need to ask the smgr for the current physical file length. | ||||
| 	 * | ||||
| 	 * Don't call smgr on a view, either. | ||||
| 	 * Don't call smgr on a view or a composite type, either. | ||||
| 	 */ | ||||
| 	if (relation->rd_rel->relkind == RELKIND_VIEW) | ||||
| 		relation->rd_nblocks = 0; | ||||
| @ -1175,6 +1155,7 @@ RelationGetNumberOfBlocks(Relation relation) | ||||
| 		relation->rd_nblocks = 0; | ||||
| 	else if (!relation->rd_isnew && !relation->rd_istemp) | ||||
| 		relation->rd_nblocks = smgrnblocks(DEFAULT_SMGR, relation); | ||||
| 
 | ||||
| 	return relation->rd_nblocks; | ||||
| } | ||||
| 
 | ||||
| @ -1623,8 +1604,6 @@ FlushRelationBuffers(Relation rel, BlockNumber firstDelBlock) | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| #undef ReleaseBuffer | ||||
| 
 | ||||
| /*
 | ||||
|  * ReleaseBuffer -- remove the pin on a buffer without | ||||
|  *		marking it dirty. | ||||
| @ -1737,151 +1716,6 @@ refcount = %ld, file: %s, line: %d\n", | ||||
| } | ||||
| #endif | ||||
| 
 | ||||
| #ifdef BMTRACE | ||||
| 
 | ||||
| /*
 | ||||
|  *	trace allocations and deallocations in a circular buffer in | ||||
|  *	shared memory.	check the buffer before doing the allocation, | ||||
|  *	and die if there's anything fishy. | ||||
|  */ | ||||
| 
 | ||||
| void | ||||
| _bm_trace(Oid dbId, Oid relId, int blkNo, int bufNo, int allocType) | ||||
| { | ||||
| 	long		start, | ||||
| 				cur; | ||||
| 	bmtrace    *tb; | ||||
| 
 | ||||
| 	start = *CurTraceBuf; | ||||
| 
 | ||||
| 	if (start > 0) | ||||
| 		cur = start - 1; | ||||
| 	else | ||||
| 		cur = BMT_LIMIT - 1; | ||||
| 
 | ||||
| 	for (;;) | ||||
| 	{ | ||||
| 		tb = &TraceBuf[cur]; | ||||
| 		if (tb->bmt_op != BMT_NOTUSED) | ||||
| 		{ | ||||
| 			if (tb->bmt_buf == bufNo) | ||||
| 			{ | ||||
| 				if ((tb->bmt_op == BMT_DEALLOC) | ||||
| 					|| (tb->bmt_dbid == dbId && tb->bmt_relid == relId | ||||
| 						&& tb->bmt_blkno == blkNo)) | ||||
| 					goto okay; | ||||
| 
 | ||||
| 				/* die holding the buffer lock */ | ||||
| 				_bm_die(dbId, relId, blkNo, bufNo, allocType, start, cur); | ||||
| 			} | ||||
| 		} | ||||
| 
 | ||||
| 		if (cur == start) | ||||
| 			goto okay; | ||||
| 
 | ||||
| 		if (cur == 0) | ||||
| 			cur = BMT_LIMIT - 1; | ||||
| 		else | ||||
| 			cur--; | ||||
| 	} | ||||
| 
 | ||||
| okay: | ||||
| 	tb = &TraceBuf[start]; | ||||
| 	tb->bmt_pid = MyProcPid; | ||||
| 	tb->bmt_buf = bufNo; | ||||
| 	tb->bmt_dbid = dbId; | ||||
| 	tb->bmt_relid = relId; | ||||
| 	tb->bmt_blkno = blkNo; | ||||
| 	tb->bmt_op = allocType; | ||||
| 
 | ||||
| 	*CurTraceBuf = (start + 1) % BMT_LIMIT; | ||||
| } | ||||
| 
 | ||||
| void | ||||
| _bm_die(Oid dbId, Oid relId, int blkNo, int bufNo, | ||||
| 		int allocType, long start, long cur) | ||||
| { | ||||
| 	FILE	   *fp; | ||||
| 	bmtrace    *tb; | ||||
| 	int			i; | ||||
| 
 | ||||
| 	tb = &TraceBuf[cur]; | ||||
| 
 | ||||
| 	if ((fp = AllocateFile("/tmp/death_notice", "w")) == NULL) | ||||
| 		elog(FATAL, "buffer alloc trace error and can't open log file"); | ||||
| 
 | ||||
| 	fprintf(fp, "buffer alloc trace detected the following error:\n\n"); | ||||
| 	fprintf(fp, "    buffer %d being %s inconsistently with a previous %s\n\n", | ||||
| 		 bufNo, (allocType == BMT_DEALLOC ? "deallocated" : "allocated"), | ||||
| 			(tb->bmt_op == BMT_DEALLOC ? "deallocation" : "allocation")); | ||||
| 
 | ||||
| 	fprintf(fp, "the trace buffer contains:\n"); | ||||
| 
 | ||||
| 	i = start; | ||||
| 	for (;;) | ||||
| 	{ | ||||
| 		tb = &TraceBuf[i]; | ||||
| 		if (tb->bmt_op != BMT_NOTUSED) | ||||
| 		{ | ||||
| 			fprintf(fp, "     [%3d]%spid %d buf %2d for <%u,%u,%u> ", | ||||
| 					i, (i == cur ? " ---> " : "\t"), | ||||
| 					tb->bmt_pid, tb->bmt_buf, | ||||
| 					tb->bmt_dbid, tb->bmt_relid, tb->bmt_blkno); | ||||
| 
 | ||||
| 			switch (tb->bmt_op) | ||||
| 			{ | ||||
| 				case BMT_ALLOCFND: | ||||
| 					fprintf(fp, "allocate (found)\n"); | ||||
| 					break; | ||||
| 
 | ||||
| 				case BMT_ALLOCNOTFND: | ||||
| 					fprintf(fp, "allocate (not found)\n"); | ||||
| 					break; | ||||
| 
 | ||||
| 				case BMT_DEALLOC: | ||||
| 					fprintf(fp, "deallocate\n"); | ||||
| 					break; | ||||
| 
 | ||||
| 				default: | ||||
| 					fprintf(fp, "unknown op type %d\n", tb->bmt_op); | ||||
| 					break; | ||||
| 			} | ||||
| 		} | ||||
| 
 | ||||
| 		i = (i + 1) % BMT_LIMIT; | ||||
| 		if (i == start) | ||||
| 			break; | ||||
| 	} | ||||
| 
 | ||||
| 	fprintf(fp, "\noperation causing error:\n"); | ||||
| 	fprintf(fp, "\tpid %d buf %d for <%d,%u,%d> ", | ||||
| 			getpid(), bufNo, dbId, relId, blkNo); | ||||
| 
 | ||||
| 	switch (allocType) | ||||
| 	{ | ||||
| 		case BMT_ALLOCFND: | ||||
| 			fprintf(fp, "allocate (found)\n"); | ||||
| 			break; | ||||
| 
 | ||||
| 		case BMT_ALLOCNOTFND: | ||||
| 			fprintf(fp, "allocate (not found)\n"); | ||||
| 			break; | ||||
| 
 | ||||
| 		case BMT_DEALLOC: | ||||
| 			fprintf(fp, "deallocate\n"); | ||||
| 			break; | ||||
| 
 | ||||
| 		default: | ||||
| 			fprintf(fp, "unknown op type %d\n", allocType); | ||||
| 			break; | ||||
| 	} | ||||
| 
 | ||||
| 	FreeFile(fp); | ||||
| 
 | ||||
| 	kill(getpid(), SIGILL); | ||||
| } | ||||
| #endif   /* BMTRACE */ | ||||
| 
 | ||||
| /*
 | ||||
|  * SetBufferCommitInfoNeedsSave | ||||
|  * | ||||
|  | ||||
| @ -7,7 +7,7 @@ | ||||
|  * Portions Copyright (c) 1996-2003, PostgreSQL Global Development Group | ||||
|  * Portions Copyright (c) 1994, Regents of the University of California | ||||
|  * | ||||
|  * $PostgreSQL: pgsql/src/include/storage/buf_internals.h,v 1.65 2003/11/29 22:41:13 pgsql Exp $ | ||||
|  * $PostgreSQL: pgsql/src/include/storage/buf_internals.h,v 1.66 2003/12/14 00:34:47 neilc Exp $ | ||||
|  * | ||||
|  *------------------------------------------------------------------------- | ||||
|  */ | ||||
| @ -33,14 +33,13 @@ extern int	ShowPinTrace; | ||||
|  * Flags for buffer descriptors | ||||
|  */ | ||||
| #define BM_DIRTY				(1 << 0) | ||||
| #define BM_PRIVATE				(1 << 1) | ||||
| #define BM_VALID				(1 << 2) | ||||
| #define BM_DELETED				(1 << 3) | ||||
| #define BM_FREE					(1 << 4) | ||||
| #define BM_IO_IN_PROGRESS		(1 << 5) | ||||
| #define BM_IO_ERROR				(1 << 6) | ||||
| #define BM_JUST_DIRTIED			(1 << 7) | ||||
| #define BM_PIN_COUNT_WAITER		(1 << 8) | ||||
| #define BM_VALID				(1 << 1) | ||||
| #define BM_DELETED				(1 << 2) | ||||
| #define BM_FREE					(1 << 3) | ||||
| #define BM_IO_IN_PROGRESS		(1 << 4) | ||||
| #define BM_IO_ERROR				(1 << 5) | ||||
| #define BM_JUST_DIRTIED			(1 << 6) | ||||
| #define BM_PIN_COUNT_WAITER		(1 << 7) | ||||
| 
 | ||||
| typedef bits16 BufFlags; | ||||
| 
 | ||||
| @ -136,32 +135,6 @@ typedef struct | ||||
| 	Buffer		id; | ||||
| } BufferLookupEnt; | ||||
| 
 | ||||
| /*
 | ||||
|  *	mao tracing buffer allocation | ||||
|  */ | ||||
| 
 | ||||
| /*#define BMTRACE*/ | ||||
| 
 | ||||
| #ifdef BMTRACE | ||||
| 
 | ||||
| typedef struct _bmtrace | ||||
| { | ||||
| 	int			bmt_pid; | ||||
| 	int			bmt_buf; | ||||
| 	Oid			bmt_dbid; | ||||
| 	Oid			bmt_relid; | ||||
| 	BlockNumber bmt_blkno; | ||||
| 	int			bmt_op; | ||||
| 
 | ||||
| #define BMT_NOTUSED		0 | ||||
| #define BMT_ALLOCFND	1 | ||||
| #define BMT_ALLOCNOTFND 2 | ||||
| #define BMT_DEALLOC		3 | ||||
| 
 | ||||
| }	bmtrace; | ||||
| #endif   /* BMTRACE */ | ||||
| 
 | ||||
| 
 | ||||
| /* counters in buf_init.c */ | ||||
| extern long int ReadBufferCount; | ||||
| extern long int ReadLocalBufferCount; | ||||
|  | ||||
| @ -7,7 +7,7 @@ | ||||
|  * Portions Copyright (c) 1996-2003, PostgreSQL Global Development Group | ||||
|  * Portions Copyright (c) 1994, Regents of the University of California | ||||
|  * | ||||
|  * $PostgreSQL: pgsql/src/include/storage/bufmgr.h,v 1.72 2003/11/29 22:41:13 pgsql Exp $ | ||||
|  * $PostgreSQL: pgsql/src/include/storage/bufmgr.h,v 1.73 2003/12/14 00:34:47 neilc Exp $ | ||||
|  * | ||||
|  *------------------------------------------------------------------------- | ||||
|  */ | ||||
| @ -57,19 +57,6 @@ extern long *LocalRefCount; | ||||
|  */ | ||||
| 
 | ||||
| #define BAD_BUFFER_ID(bid) ((bid) < 1 || (bid) > NBuffers) | ||||
| #define INVALID_DESCRIPTOR (-3) | ||||
| 
 | ||||
| #define UnlockAndReleaseBuffer(buffer)	\ | ||||
| ( \ | ||||
| 	LockBuffer(buffer, BUFFER_LOCK_UNLOCK), \ | ||||
| 	ReleaseBuffer(buffer) \ | ||||
| ) | ||||
| 
 | ||||
| #define UnlockAndWriteBuffer(buffer)	\ | ||||
| ( \ | ||||
| 	LockBuffer(buffer, BUFFER_LOCK_UNLOCK), \ | ||||
| 	WriteBuffer(buffer) \ | ||||
| ) | ||||
| 
 | ||||
| /*
 | ||||
|  * BufferIsValid | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user