From fef0c8345a96f953ebfe59fcc22a9eeb980b25c5 Mon Sep 17 00:00:00 2001 From: Neil Conway Date: Sun, 14 Dec 2003 00:34:47 +0000 Subject: [PATCH] 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. --- src/backend/access/heap/heapam.c | 35 +++-- src/backend/access/nbtree/nbtxlog.c | 74 ++++++--- src/backend/access/transam/xlog.c | 5 +- src/backend/access/transam/xlogutils.c | 29 ++-- src/backend/commands/sequence.c | 5 +- src/backend/storage/buffer/buf_init.c | 27 +--- src/backend/storage/buffer/buf_table.c | 14 +- src/backend/storage/buffer/bufmgr.c | 208 +++---------------------- src/include/storage/buf_internals.h | 43 +---- src/include/storage/bufmgr.h | 15 +- 10 files changed, 133 insertions(+), 322 deletions(-) diff --git a/src/backend/access/heap/heapam.c b/src/backend/access/heap/heapam.c index aa622637dc..1815a0d969 100644 --- a/src/backend/access/heap/heapam.c +++ b/src/backend/access/heap/heapam.c @@ -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; } diff --git a/src/backend/access/nbtree/nbtxlog.c b/src/backend/access/nbtree/nbtxlog.c index 989d88702c..0a6aaa1147 100644 --- a/src/backend/access/nbtree/nbtxlog.c +++ b/src/backend/access/nbtree/nbtxlog.c @@ -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); } diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index 9aa19ea594..794e392f78 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -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); } } diff --git a/src/backend/access/transam/xlogutils.c b/src/backend/access/transam/xlogutils.c index cd5c02126d..d200b7e17a 100644 --- a/src/backend/access/transam/xlogutils.c +++ b/src/backend/access/transam/xlogutils.c @@ -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); } diff --git a/src/backend/commands/sequence.c b/src/backend/commands/sequence.c index 39a62448cf..54acb5b89c 100644 --- a/src/backend/commands/sequence.c +++ b/src/backend/commands/sequence.c @@ -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 diff --git a/src/backend/storage/buffer/buf_init.c b/src/backend/storage/buffer/buf_init.c index ebb3a7c3e1..1c66b950a5 100644 --- a/src/backend/storage/buffer/buf_init.c +++ b/src/backend/storage/buffer/buf_init.c @@ -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; } diff --git a/src/backend/storage/buffer/buf_table.c b/src/backend/storage/buffer/buf_table.c index 5008836187..33590b65fd 100644 --- a/src/backend/storage/buffer/buf_table.c +++ b/src/backend/storage/buffer/buf_table.c @@ -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 diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index c0c3561320..d68ee96e91 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -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; + StartBufferIO(buf, true); } -#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); - 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 * diff --git a/src/include/storage/buf_internals.h b/src/include/storage/buf_internals.h index 5478f1064e..9e7864c750 100644 --- a/src/include/storage/buf_internals.h +++ b/src/include/storage/buf_internals.h @@ -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; diff --git a/src/include/storage/bufmgr.h b/src/include/storage/bufmgr.h index c4ac75262c..7f955ceef3 100644 --- a/src/include/storage/bufmgr.h +++ b/src/include/storage/bufmgr.h @@ -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 -- 2.40.0