]> granicus.if.org Git - postgresql/commitdiff
I posted some bufmgr cleanup a few weeks ago, but it conflicted with
authorNeil Conway <neilc@samurai.com>
Sun, 14 Dec 2003 00:34:47 +0000 (00:34 +0000)
committerNeil Conway <neilc@samurai.com>
Sun, 14 Dec 2003 00:34:47 +0000 (00:34 +0000)
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
src/backend/access/nbtree/nbtxlog.c
src/backend/access/transam/xlog.c
src/backend/access/transam/xlogutils.c
src/backend/commands/sequence.c
src/backend/storage/buffer/buf_init.c
src/backend/storage/buffer/buf_table.c
src/backend/storage/buffer/bufmgr.c
src/include/storage/buf_internals.h
src/include/storage/bufmgr.h

index aa622637dc94451a6d41330ffd5f1046ba7e7dbe..1815a0d969312a3417499a36d21aeb77b7563fda 100644 (file)
@@ -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;
 }
 
index 989d88702ca61e596b416da752b371b0f938a31c..0a6aaa114708e5569472d78fdc88373031637b0d 100644 (file)
@@ -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);
 }
 
 
index 9aa19ea5945b4bb412149b32f2440b6952e12796..794e392f78dbc906e27ae45213f344af942c1792 100644 (file)
@@ -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);
                        }
                }
 
index cd5c02126d8e2d16b82470c009c131ebe693cc9b..d200b7e17adb5d8afb620b51884627e87f8d9bf4 100644 (file)
@@ -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);
 }
 
index 39a62448cff08afbd1788020510125a43e045868..54acb5b89cd32588a481dc0e521a970a47c3ed2f 100644 (file)
@@ -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
index ebb3a7c3e1d92edfa0201fbd81f609bb6b74e9ad..1c66b950a516b8f052cf82d387e2095654675d9a 100644 (file)
@@ -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 $
  *
  *-------------------------------------------------------------------------
  */
 #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;
 }
index 50088361876203770c0a94c9de11f644faddbf25..33590b65fdbd0a083120e44c372f192a2c2ade73 100644 (file)
@@ -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
index c0c35613208e7a7248659d7a2cd71df3ff180c7c..d68ee96e915a98301db8ff8e474e53e56d2ef6b6 100644 (file)
@@ -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
  *
index 5478f1064e84325fc63f99eebe7d8c96e5eda547..9e7864c750812f5d4fe184bb05aeccede8ac4d8a 100644 (file)
@@ -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;
index c4ac75262cfa824227499045bafa1c64443dca13..7f955ceef3a39ac595b32e90594dbc02502967be 100644 (file)
@@ -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