Re: bufmgr code cleanup

From: Jan Wieck <JanWieck(at)Yahoo(dot)com>
To: Neil Conway <neilc(at)samurai(dot)com>
Cc: PostgreSQL Patches <pgsql-patches(at)postgresql(dot)org>
Subject: Re: bufmgr code cleanup
Date: 2003-11-03 13:31:55
Message-ID: 3FA658CB.503@Yahoo.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-patches

Neil Conway wrote:
> This patch cleans up some of the bufmgr code:
>
> - replace uses of
>
> LockBuffer(buf, BUFFER_LOCK_UNLOCK);
> ReleaseBuffer(buf);
>
> with the equivalent, but more concise:
>
> UnlockAndReleaseBuffer(buf);
>
> - analogous changes were made by replacing LockBuffer() + WriteBuffer()
> with UnlockAndWriteBuffer()
>
> - remove a bunch of #ifdef BMTRACE code, since it was ugly and broken
> anyway
>
> - remove an unused buffer descriptor bit flag (BM_PRIVATE)
>
> - move the definition of INVALID_DESCRIPTOR to out of bufmgr.h and into
> freelist.c, since it is the only file that uses it
>
> - remove another unused function, and fix a few comments
>
> Please apply to the CVS HEAD.

Can this be held off a little while we're experimenting with
improvements to the buffer algorithms?

Jan

>
> -Neil
>
>
>
> ------------------------------------------------------------------------
>
> Index: src/backend/access/hash/hashpage.c
> ===================================================================
> RCS file: /var/lib/cvs/pgsql-server/src/backend/access/hash/hashpage.c,v
> retrieving revision 1.42
> diff -c -r1.42 hashpage.c
> *** src/backend/access/hash/hashpage.c 4 Sep 2003 22:06:27 -0000 1.42
> --- src/backend/access/hash/hashpage.c 31 Oct 2003 22:55:59 -0000
> ***************
> *** 135,142 ****
> void
> _hash_relbuf(Relation rel, Buffer buf)
> {
> ! LockBuffer(buf, BUFFER_LOCK_UNLOCK);
> ! ReleaseBuffer(buf);
> }
>
> /*
> --- 135,141 ----
> void
> _hash_relbuf(Relation rel, Buffer buf)
> {
> ! UnlockAndReleaseBuffer(buf);
> }
>
> /*
> ***************
> *** 166,173 ****
> void
> _hash_wrtbuf(Relation rel, Buffer buf)
> {
> ! LockBuffer(buf, BUFFER_LOCK_UNLOCK);
> ! WriteBuffer(buf);
> }
>
> /*
> --- 165,171 ----
> void
> _hash_wrtbuf(Relation rel, Buffer buf)
> {
> ! UnlockAndWriteBuffer(buf);
> }
>
> /*
> Index: src/backend/access/heap/heapam.c
> ===================================================================
> RCS file: /var/lib/cvs/pgsql-server/src/backend/access/heap/heapam.c,v
> retrieving revision 1.157
> diff -c -r1.157 heapam.c
> *** src/backend/access/heap/heapam.c 1 Oct 2003 21:30:52 -0000 1.157
> --- src/backend/access/heap/heapam.c 31 Oct 2003 22:59:14 -0000
> ***************
> *** 899,906 ****
> */
> if (!ItemIdIsUsed(lp))
> {
> ! LockBuffer(buffer, BUFFER_LOCK_UNLOCK);
> ! ReleaseBuffer(buffer);
> *userbuf = InvalidBuffer;
> tuple->t_datamcxt = NULL;
> tuple->t_data = NULL;
> --- 899,905 ----
> */
> if (!ItemIdIsUsed(lp))
> {
> ! UnlockAndReleaseBuffer(buffer);
> *userbuf = InvalidBuffer;
> tuple->t_datamcxt = NULL;
> tuple->t_data = NULL;
> ***************
> *** 1006,1013 ****
> }
> if (invalidBlock)
> {
> ! LockBuffer(buffer, BUFFER_LOCK_UNLOCK);
> ! ReleaseBuffer(buffer);
> return NULL;
> }
>
> --- 1005,1011 ----
> }
> if (invalidBlock)
> {
> ! UnlockAndReleaseBuffer(buffer);
> return NULL;
> }
>
> ***************
> *** 1033,1040 ****
> !ItemPointerEquals(tid, &ctid))
> linkend = false;
>
> ! LockBuffer(buffer, BUFFER_LOCK_UNLOCK);
> ! ReleaseBuffer(buffer);
>
> if (!valid)
> {
> --- 1031,1037 ----
> !ItemPointerEquals(tid, &ctid))
> linkend = false;
>
> ! UnlockAndReleaseBuffer(buffer);
>
> if (!valid)
> {
> ***************
> *** 1174,1181 ****
>
> END_CRIT_SECTION();
>
> ! LockBuffer(buffer, BUFFER_LOCK_UNLOCK);
> ! WriteBuffer(buffer);
>
> /*
> * If tuple is cachable, mark it for invalidation from the caches in
> --- 1171,1177 ----
>
> END_CRIT_SECTION();
>
> ! UnlockAndWriteBuffer(buffer);
>
> /*
> * If tuple is cachable, mark it for invalidation from the caches in
> ***************
> *** 1253,1260 ****
>
> if (result == HeapTupleInvisible)
> {
> ! LockBuffer(buffer, BUFFER_LOCK_UNLOCK);
> ! ReleaseBuffer(buffer);
> elog(ERROR, "attempted to delete invisible tuple");
> }
> else if (result == HeapTupleBeingUpdated && wait)
> --- 1249,1255 ----
>
> if (result == HeapTupleInvisible)
> {
> ! UnlockAndReleaseBuffer(buffer);
> elog(ERROR, "attempted to delete invisible tuple");
> }
> else if (result == HeapTupleBeingUpdated && wait)
> ***************
> *** 1301,1308 ****
> result == HeapTupleUpdated ||
> result == HeapTupleBeingUpdated);
> *ctid = tp.t_data->t_ctid;
> ! LockBuffer(buffer, BUFFER_LOCK_UNLOCK);
> ! ReleaseBuffer(buffer);
> return result;
> }
>
> --- 1296,1302 ----
> result == HeapTupleUpdated ||
> result == HeapTupleBeingUpdated);
> *ctid = tp.t_data->t_ctid;
> ! UnlockAndReleaseBuffer(buffer);
> return result;
> }
>
> ***************
> *** 1483,1490 ****
>
> if (result == HeapTupleInvisible)
> {
> ! LockBuffer(buffer, BUFFER_LOCK_UNLOCK);
> ! ReleaseBuffer(buffer);
> elog(ERROR, "attempted to update invisible tuple");
> }
> else if (result == HeapTupleBeingUpdated && wait)
> --- 1477,1483 ----
>
> if (result == HeapTupleInvisible)
> {
> ! UnlockAndReleaseBuffer(buffer);
> elog(ERROR, "attempted to update invisible tuple");
> }
> else if (result == HeapTupleBeingUpdated && wait)
> ***************
> *** 1531,1538 ****
> result == HeapTupleUpdated ||
> result == HeapTupleBeingUpdated);
> *ctid = oldtup.t_data->t_ctid;
> ! LockBuffer(buffer, BUFFER_LOCK_UNLOCK);
> ! ReleaseBuffer(buffer);
> return result;
> }
>
> --- 1524,1530 ----
> result == HeapTupleUpdated ||
> result == HeapTupleBeingUpdated);
> *ctid = oldtup.t_data->t_ctid;
> ! UnlockAndReleaseBuffer(buffer);
> return result;
> }
>
> ***************
> *** 1808,1815 ****
>
> if (result == HeapTupleInvisible)
> {
> ! LockBuffer(*buffer, BUFFER_LOCK_UNLOCK);
> ! ReleaseBuffer(*buffer);
> elog(ERROR, "attempted to mark4update invisible tuple");
> }
> else if (result == HeapTupleBeingUpdated)
> --- 1800,1806 ----
>
> if (result == HeapTupleInvisible)
> {
> ! UnlockAndReleaseBuffer(*buffer);
> elog(ERROR, "attempted to mark4update invisible tuple");
> }
> else if (result == HeapTupleBeingUpdated)
> Index: src/backend/access/index/indexam.c
> ===================================================================
> RCS file: /var/lib/cvs/pgsql-server/src/backend/access/index/indexam.c,v
> retrieving revision 1.71
> diff -c -r1.71 indexam.c
> *** src/backend/access/index/indexam.c 25 Sep 2003 06:57:57 -0000 1.71
> --- src/backend/access/index/indexam.c 31 Oct 2003 23:00:00 -0000
> ***************
> *** 541,548 ****
>
> if (sv_infomask != heapTuple->t_data->t_infomask)
> SetBufferCommitInfoNeedsSave(scan->xs_cbuf);
> ! LockBuffer(scan->xs_cbuf, BUFFER_LOCK_UNLOCK);
> ! ReleaseBuffer(scan->xs_cbuf);
> scan->xs_cbuf = InvalidBuffer;
> }
>
> --- 541,547 ----
>
> if (sv_infomask != heapTuple->t_data->t_infomask)
> SetBufferCommitInfoNeedsSave(scan->xs_cbuf);
> ! UnlockAndReleaseBuffer(scan->xs_cbuf);
> scan->xs_cbuf = InvalidBuffer;
> }
>
> Index: src/backend/access/nbtree/nbtinsert.c
> ===================================================================
> RCS file: /var/lib/cvs/pgsql-server/src/backend/access/nbtree/nbtinsert.c,v
> retrieving revision 1.106
> diff -c -r1.106 nbtinsert.c
> *** src/backend/access/nbtree/nbtinsert.c 25 Sep 2003 06:57:57 -0000 1.106
> --- src/backend/access/nbtree/nbtinsert.c 31 Oct 2003 23:00:35 -0000
> ***************
> *** 274,281 ****
> }
> if (sv_infomask != htup.t_data->t_infomask)
> SetBufferCommitInfoNeedsSave(hbuffer);
> ! LockBuffer(hbuffer, BUFFER_LOCK_UNLOCK);
> ! ReleaseBuffer(hbuffer);
> }
> }
> }
> --- 274,280 ----
> }
> if (sv_infomask != htup.t_data->t_infomask)
> SetBufferCommitInfoNeedsSave(hbuffer);
> ! UnlockAndReleaseBuffer(hbuffer);
> }
> }
> }
> Index: src/backend/access/nbtree/nbtpage.c
> ===================================================================
> RCS file: /var/lib/cvs/pgsql-server/src/backend/access/nbtree/nbtpage.c,v
> retrieving revision 1.72
> diff -c -r1.72 nbtpage.c
> *** src/backend/access/nbtree/nbtpage.c 29 Sep 2003 23:40:26 -0000 1.72
> --- src/backend/access/nbtree/nbtpage.c 31 Oct 2003 23:01:05 -0000
> ***************
> *** 502,509 ****
> void
> _bt_relbuf(Relation rel, Buffer buf)
> {
> ! LockBuffer(buf, BUFFER_LOCK_UNLOCK);
> ! ReleaseBuffer(buf);
> }
>
> /*
> --- 502,508 ----
> void
> _bt_relbuf(Relation rel, Buffer buf)
> {
> ! UnlockAndReleaseBuffer(buf);
> }
>
> /*
> ***************
> *** 521,528 ****
> void
> _bt_wrtbuf(Relation rel, Buffer buf)
> {
> ! LockBuffer(buf, BUFFER_LOCK_UNLOCK);
> ! WriteBuffer(buf);
> }
>
> /*
> --- 520,526 ----
> void
> _bt_wrtbuf(Relation rel, Buffer buf)
> {
> ! UnlockAndWriteBuffer(buf);
> }
>
> /*
> Index: src/backend/commands/sequence.c
> ===================================================================
> RCS file: /var/lib/cvs/pgsql-server/src/backend/commands/sequence.c,v
> retrieving revision 1.103
> diff -c -r1.103 sequence.c
> *** src/backend/commands/sequence.c 25 Sep 2003 06:57:58 -0000 1.103
> --- src/backend/commands/sequence.c 31 Oct 2003 23:02:15 -0000
> ***************
> *** 291,298 ****
>
> END_CRIT_SECTION();
>
> ! LockBuffer(buf, BUFFER_LOCK_UNLOCK);
> ! WriteBuffer(buf);
> heap_close(rel, NoLock);
> }
>
> --- 291,297 ----
>
> END_CRIT_SECTION();
>
> ! UnlockAndWriteBuffer(buf);
> heap_close(rel, NoLock);
> }
>
> ***************
> *** 379,388 ****
>
> END_CRIT_SECTION();
>
> ! LockBuffer(buf, BUFFER_LOCK_UNLOCK);
> !
> ! WriteBuffer(buf);
> !
> relation_close(seqrel, NoLock);
> }
>
> --- 378,384 ----
>
> END_CRIT_SECTION();
>
> ! UnlockAndWriteBuffer(buf);
> relation_close(seqrel, NoLock);
> }
>
> ***************
> *** 583,592 ****
>
> END_CRIT_SECTION();
>
> ! LockBuffer(buf, BUFFER_LOCK_UNLOCK);
> !
> ! WriteBuffer(buf);
> !
> relation_close(seqrel, NoLock);
>
> PG_RETURN_INT64(result);
> --- 579,585 ----
>
> END_CRIT_SECTION();
>
> ! UnlockAndWriteBuffer(buf);
> relation_close(seqrel, NoLock);
>
> PG_RETURN_INT64(result);
> ***************
> *** 719,728 ****
>
> END_CRIT_SECTION();
>
> ! LockBuffer(buf, BUFFER_LOCK_UNLOCK);
> !
> ! WriteBuffer(buf);
> !
> relation_close(seqrel, NoLock);
> }
>
> --- 712,718 ----
>
> END_CRIT_SECTION();
>
> ! UnlockAndWriteBuffer(buf);
> relation_close(seqrel, NoLock);
> }
>
> Index: src/backend/commands/vacuum.c
> ===================================================================
> RCS file: /var/lib/cvs/pgsql-server/src/backend/commands/vacuum.c,v
> retrieving revision 1.263
> diff -c -r1.263 vacuum.c
> *** src/backend/commands/vacuum.c 2 Oct 2003 23:19:44 -0000 1.263
> --- src/backend/commands/vacuum.c 31 Oct 2003 23:04:31 -0000
> ***************
> *** 2299,2306 ****
> page = BufferGetPage(buf);
> if (!PageIsEmpty(page))
> vacuum_page(onerel, buf, *curpage);
> ! LockBuffer(buf, BUFFER_LOCK_UNLOCK);
> ! WriteBuffer(buf);
> }
> }
>
> --- 2299,2305 ----
> page = BufferGetPage(buf);
> if (!PageIsEmpty(page))
> vacuum_page(onerel, buf, *curpage);
> ! UnlockAndWriteBuffer(buf);
> }
> }
>
> ***************
> *** 2356,2363 ****
> tuple.t_data->t_infomask |= HEAP_XMIN_INVALID;
> }
> }
> ! LockBuffer(buf, BUFFER_LOCK_UNLOCK);
> ! WriteBuffer(buf);
> Assert((*curpage)->offsets_used == num_tuples);
> checked_moved += num_tuples;
> }
> --- 2355,2361 ----
> tuple.t_data->t_infomask |= HEAP_XMIN_INVALID;
> }
> }
> ! UnlockAndWriteBuffer(buf);
> Assert((*curpage)->offsets_used == num_tuples);
> checked_moved += num_tuples;
> }
> ***************
> *** 2467,2474 ****
>
> END_CRIT_SECTION();
>
> ! LockBuffer(buf, BUFFER_LOCK_UNLOCK);
> ! WriteBuffer(buf);
> }
>
> /* now - free new list of reaped pages */
> --- 2465,2471 ----
>
> END_CRIT_SECTION();
>
> ! UnlockAndWriteBuffer(buf);
> }
>
> /* now - free new list of reaped pages */
> ***************
> *** 2535,2542 ****
> buf = ReadBuffer(onerel, (*vacpage)->blkno);
> LockBuffer(buf, BUFFER_LOCK_EXCLUSIVE);
> vacuum_page(onerel, buf, *vacpage);
> ! LockBuffer(buf, BUFFER_LOCK_UNLOCK);
> ! WriteBuffer(buf);
> }
> }
>
> --- 2532,2538 ----
> buf = ReadBuffer(onerel, (*vacpage)->blkno);
> LockBuffer(buf, BUFFER_LOCK_EXCLUSIVE);
> vacuum_page(onerel, buf, *vacpage);
> ! UnlockAndWriteBuffer(buf);
> }
> }
>
> Index: src/backend/commands/vacuumlazy.c
> ===================================================================
> RCS file: /var/lib/cvs/pgsql-server/src/backend/commands/vacuumlazy.c,v
> retrieving revision 1.32
> diff -c -r1.32 vacuumlazy.c
> *** src/backend/commands/vacuumlazy.c 25 Sep 2003 06:57:59 -0000 1.32
> --- src/backend/commands/vacuumlazy.c 31 Oct 2003 23:03:10 -0000
> ***************
> *** 267,274 ****
> lazy_record_free_space(vacrelstats, blkno,
> PageGetFreeSpace(page));
> }
> ! LockBuffer(buf, BUFFER_LOCK_UNLOCK);
> ! WriteBuffer(buf);
> continue;
> }
>
> --- 267,273 ----
> lazy_record_free_space(vacrelstats, blkno,
> PageGetFreeSpace(page));
> }
> ! UnlockAndWriteBuffer(buf);
> continue;
> }
>
> ***************
> *** 277,284 ****
> empty_pages++;
> lazy_record_free_space(vacrelstats, blkno,
> PageGetFreeSpace(page));
> ! LockBuffer(buf, BUFFER_LOCK_UNLOCK);
> ! ReleaseBuffer(buf);
> continue;
> }
>
> --- 276,282 ----
> empty_pages++;
> lazy_record_free_space(vacrelstats, blkno,
> PageGetFreeSpace(page));
> ! UnlockAndReleaseBuffer(buf);
> continue;
> }
>
> ***************
> *** 477,484 ****
> page = BufferGetPage(buf);
> lazy_record_free_space(vacrelstats, tblk,
> PageGetFreeSpace(page));
> ! LockBuffer(buf, BUFFER_LOCK_UNLOCK);
> ! WriteBuffer(buf);
> npages++;
> }
>
> --- 475,481 ----
> page = BufferGetPage(buf);
> lazy_record_free_space(vacrelstats, tblk,
> PageGetFreeSpace(page));
> ! UnlockAndWriteBuffer(buf);
> npages++;
> }
>
> ***************
> *** 812,819 ****
> if (PageIsNew(page) || PageIsEmpty(page))
> {
> /* PageIsNew robably shouldn't happen... */
> ! LockBuffer(buf, BUFFER_LOCK_UNLOCK);
> ! ReleaseBuffer(buf);
> continue;
> }
>
> --- 809,815 ----
> if (PageIsNew(page) || PageIsEmpty(page))
> {
> /* PageIsNew robably shouldn't happen... */
> ! UnlockAndReleaseBuffer(buf);
> continue;
> }
>
> Index: src/backend/storage/buffer/buf_init.c
> ===================================================================
> RCS file: /var/lib/cvs/pgsql-server/src/backend/storage/buffer/buf_init.c,v
> retrieving revision 1.54
> diff -c -r1.54 buf_init.c
> *** src/backend/storage/buffer/buf_init.c 4 Aug 2003 02:40:03 -0000 1.54
> --- src/backend/storage/buffer/buf_init.c 31 Oct 2003 22:38:16 -0000
> ***************
> *** 34,50 ****
> #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;
> --- 34,39 ----
> ***************
> *** 144,159 ****
> */
> 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",
> Num_Descriptors * sizeof(BufferDesc), &foundDescs);
> --- 133,138 ----
> ***************
> *** 266,274 ****
> /* size of buffer hash table */
> size += hash_estimate_size(NBuffers, sizeof(BufferLookupEnt));
>
> - #ifdef BMTRACE
> - size += (BMT_LIMIT * sizeof(bmtrace)) + sizeof(long);
> - #endif
> -
> return size;
> }
> --- 245,249 ----
> Index: src/backend/storage/buffer/buf_table.c
> ===================================================================
> RCS file: /var/lib/cvs/pgsql-server/src/backend/storage/buffer/buf_table.c,v
> retrieving revision 1.29
> diff -c -r1.29 buf_table.c
> *** src/backend/storage/buffer/buf_table.c 4 Aug 2003 02:40:03 -0000 1.29
> --- src/backend/storage/buffer/buf_table.c 31 Oct 2003 22:30:34 -0000
> ***************
> *** 133,147 ****
> result->id = buf->buf_id;
> 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
> --- 133,135 ----
> Index: src/backend/storage/buffer/bufmgr.c
> ===================================================================
> RCS file: /var/lib/cvs/pgsql-server/src/backend/storage/buffer/bufmgr.c,v
> retrieving revision 1.141
> diff -c -r1.141 bufmgr.c
> *** src/backend/storage/buffer/bufmgr.c 25 Sep 2003 06:58:01 -0000 1.141
> --- src/backend/storage/buffer/bufmgr.c 31 Oct 2003 22:46:35 -0000
> ***************
> *** 105,117 ****
> *
> * 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)
> {
> --- 105,110 ----
> ***************
> *** 358,366 ****
> */
> *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);
> --- 351,356 ----
> ***************
> *** 569,578 ****
> 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;
> --- 559,564 ----
> ***************
> *** 619,627 ****
> * Side Effects:
> * Pin count is decremented.
> */
> -
> - #undef WriteBuffer
> -
> void
> WriteBuffer(Buffer buffer)
> {
> --- 605,610 ----
> ***************
> *** 638,645 ****
> write_buffer(buffer, false);
> }
>
> -
> - #undef ReleaseAndReadBuffer
> /*
> * ReleaseAndReadBuffer -- combine ReleaseBuffer() and ReadBuffer()
> * to save a lock release/acquire.
> --- 621,626 ----
> ***************
> *** 1099,1105 ****
> * 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.
> */
> if (relation->rd_rel->relkind == RELKIND_VIEW)
> relation->rd_nblocks = 0;
> --- 1080,1086 ----
> * 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 or a composite type, either.
> */
> if (relation->rd_rel->relkind == RELKIND_VIEW)
> relation->rd_nblocks = 0;
> ***************
> *** 1107,1112 ****
> --- 1088,1094 ----
> relation->rd_nblocks = 0;
> else if (!relation->rd_isnew && !relation->rd_istemp)
> relation->rd_nblocks = smgrnblocks(DEFAULT_SMGR, relation);
> +
> return relation->rd_nblocks;
> }
>
> ***************
> *** 1555,1562 ****
> return 0;
> }
>
> - #undef ReleaseBuffer
> -
> /*
> * ReleaseBuffer -- remove the pin on a buffer without
> * marking it dirty.
> --- 1537,1542 ----
> ***************
> *** 1669,1819 ****
> }
> #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
> *
> --- 1649,1654 ----
> Index: src/backend/storage/buffer/freelist.c
> ===================================================================
> RCS file: /var/lib/cvs/pgsql-server/src/backend/storage/buffer/freelist.c,v
> retrieving revision 1.31
> diff -c -r1.31 freelist.c
> *** src/backend/storage/buffer/freelist.c 4 Aug 2003 02:40:03 -0000 1.31
> --- src/backend/storage/buffer/freelist.c 31 Oct 2003 22:50:11 -0000
> ***************
> *** 32,40 ****
> #include "storage/ipc.h"
> #include "storage/proc.h"
>
> -
> static BufferDesc *SharedFreeList;
>
> /*
> * State-checking macros
> */
> --- 32,41 ----
> #include "storage/ipc.h"
> #include "storage/proc.h"
>
> static BufferDesc *SharedFreeList;
>
> + #define INVALID_DESCRIPTOR (-3)
> +
> /*
> * State-checking macros
> */
> ***************
> *** 65,74 ****
> static void
> AddBufferToFreelist(BufferDesc *bf)
> {
> - #ifdef BMTRACE
> - _bm_trace(bf->tag.relId.dbId, bf->tag.relId.relId, bf->tag.blockNum,
> - BufferDescriptorGetBuffer(bf), BMT_DEALLOC);
> - #endif /* BMTRACE */
> IsNotInQueue(bf);
>
> /* change bf so it points to inFrontOfNew and its successor */
> --- 66,71 ----
> Index: src/include/storage/buf_internals.h
> ===================================================================
> RCS file: /var/lib/cvs/pgsql-server/src/include/storage/buf_internals.h,v
> retrieving revision 1.61
> diff -c -r1.61 buf_internals.h
> *** src/include/storage/buf_internals.h 4 Aug 2003 02:40:14 -0000 1.61
> --- src/include/storage/buf_internals.h 31 Oct 2003 22:37:19 -0000
> ***************
> *** 33,46 ****
> * 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)
>
> typedef bits16 BufFlags;
>
> --- 33,45 ----
> * Flags for buffer descriptors
> */
> #define BM_DIRTY (1 << 0)
> ! #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;
>
> ***************
> *** 123,154 ****
> 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;
> --- 122,127 ----
> Index: src/include/storage/bufmgr.h
> ===================================================================
> RCS file: /var/lib/cvs/pgsql-server/src/include/storage/bufmgr.h,v
> retrieving revision 1.70
> diff -c -r1.70 bufmgr.h
> *** src/include/storage/bufmgr.h 10 Aug 2003 19:48:08 -0000 1.70
> --- src/include/storage/bufmgr.h 31 Oct 2003 22:50:16 -0000
> ***************
> *** 52,58 ****
> */
>
> #define BAD_BUFFER_ID(bid) ((bid) < 1 || (bid) > NBuffers)
> - #define INVALID_DESCRIPTOR (-3)
>
> #define UnlockAndReleaseBuffer(buffer) \
> ( \
> --- 52,57 ----
>
>
> ------------------------------------------------------------------------
>
>
> ---------------------------(end of broadcast)---------------------------
> TIP 3: if posting/reading through Usenet, please send an appropriate
> subscribe-nomail command to majordomo(at)postgresql(dot)org so that your
> message can get through to the mailing list cleanly

--
#======================================================================#
# It's easier to get forgiveness for being wrong than for being right. #
# Let's break this rule - forgive me. #
#================================================== JanWieck(at)Yahoo(dot)com #

In response to

Responses

Browse pgsql-patches by date

  From Date Subject
Next Message Neil Conway 2003-11-03 14:00:34 equal() perf tweak
Previous Message Christopher Kings-Lynne 2003-11-03 08:09:37 Re: "make check" improvement for cygwin