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 [EMAIL PROTECTED] 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. # #================================================== [EMAIL PROTECTED] #
---------------------------(end of broadcast)--------------------------- TIP 2: you can get off all lists at once with the unregister command (send "unregister YourEmailAddressHere" to [EMAIL PROTECTED])