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.
-Neil
Index: src/backend/access/heap/heapam.c
===================================================================
RCS file: /var/lib/cvs/pgsql-server/src/backend/access/heap/heapam.c,v
retrieving revision 1.158
diff -c -r1.158 heapam.c
*** src/backend/access/heap/heapam.c 29 Nov 2003 19:51:40 -0000 1.158
--- src/backend/access/heap/heapam.c 10 Dec 2003 22:34:31 -0000
***************
*** 2110,2116 ****
if (XLByteLE(lsn, PageGetLSN(page)))
{
! UnlockAndReleaseBuffer(buffer);
return;
}
--- 2110,2117 ----
if (XLByteLE(lsn, PageGetLSN(page)))
{
! LockBuffer(buffer, BUFFER_LOCK_UNLOCK);
! ReleaseBuffer(buffer);
return;
}
***************
*** 2135,2141 ****
PageSetLSN(page, lsn);
PageSetSUI(page, ThisStartUpID); /* prev sui */
! UnlockAndWriteBuffer(buffer);
}
static void
--- 2136,2143 ----
PageSetLSN(page, lsn);
PageSetSUI(page, ThisStartUpID); /* prev sui */
! LockBuffer(buffer, BUFFER_LOCK_UNLOCK);
! WriteBuffer(buffer);
}
static void
***************
*** 2170,2176 ****
{
if (XLByteLE(lsn, PageGetLSN(page))) /* changes are applied */
{
! UnlockAndReleaseBuffer(buffer);
return;
}
}
--- 2172,2179 ----
{
if (XLByteLE(lsn, PageGetLSN(page))) /* changes are applied */
{
! LockBuffer(buffer, BUFFER_LOCK_UNLOCK);
! ReleaseBuffer(buffer);
return;
}
}
***************
*** 2199,2205 ****
htup->t_ctid = xlrec->target.tid;
PageSetLSN(page, lsn);
PageSetSUI(page, ThisStartUpID);
! UnlockAndWriteBuffer(buffer);
return;
}
--- 2202,2209 ----
htup->t_ctid = xlrec->target.tid;
PageSetLSN(page, lsn);
PageSetSUI(page, ThisStartUpID);
! LockBuffer(buffer, BUFFER_LOCK_UNLOCK);
! WriteBuffer(buffer);
return;
}
***************
*** 2249,2255 ****
if (XLByteLE(lsn, PageGetLSN(page))) /* changes are applied */
{
! UnlockAndReleaseBuffer(buffer);
return;
}
--- 2253,2260 ----
if (XLByteLE(lsn, PageGetLSN(page))) /* changes are applied */
{
! LockBuffer(buffer, BUFFER_LOCK_UNLOCK);
! ReleaseBuffer(buffer);
return;
}
***************
*** 2282,2288 ****
elog(PANIC, "heap_insert_redo: failed to add tuple");
PageSetLSN(page, lsn);
PageSetSUI(page, ThisStartUpID); /* prev sui */
! UnlockAndWriteBuffer(buffer);
return;
}
--- 2287,2294 ----
elog(PANIC, "heap_insert_redo: failed to add tuple");
PageSetLSN(page, lsn);
PageSetSUI(page, ThisStartUpID); /* prev sui */
! LockBuffer(buffer, BUFFER_LOCK_UNLOCK);
! WriteBuffer(buffer);
return;
}
***************
*** 2332,2338 ****
{
if (XLByteLE(lsn, PageGetLSN(page))) /* changes are applied */
{
! UnlockAndReleaseBuffer(buffer);
if (samepage)
return;
goto newt;
--- 2338,2345 ----
{
if (XLByteLE(lsn, PageGetLSN(page))) /* changes are applied */
{
! LockBuffer(buffer, BUFFER_LOCK_UNLOCK);
! ReleaseBuffer(buffer);
if (samepage)
return;
goto newt;
***************
*** 2378,2384 ****
goto newsame;
PageSetLSN(page, lsn);
PageSetSUI(page, ThisStartUpID);
! UnlockAndWriteBuffer(buffer);
goto newt;
}
--- 2385,2392 ----
goto newsame;
PageSetLSN(page, lsn);
PageSetSUI(page, ThisStartUpID);
! LockBuffer(buffer, BUFFER_LOCK_UNLOCK);
! WriteBuffer(buffer);
goto newt;
}
***************
*** 2421,2427 ****
if (XLByteLE(lsn, PageGetLSN(page))) /* changes are applied */
{
! UnlockAndReleaseBuffer(buffer);
return;
}
--- 2429,2436 ----
if (XLByteLE(lsn, PageGetLSN(page))) /* changes are applied */
{
! LockBuffer(buffer, BUFFER_LOCK_UNLOCK);
! ReleaseBuffer(buffer);
return;
}
***************
*** 2474,2480 ****
elog(PANIC, "heap_update_redo: failed to add tuple");
PageSetLSN(page, lsn);
PageSetSUI(page, ThisStartUpID); /* prev sui */
! UnlockAndWriteBuffer(buffer);
return;
}
--- 2483,2490 ----
elog(PANIC, "heap_update_redo: failed to add tuple");
PageSetLSN(page, lsn);
PageSetSUI(page, ThisStartUpID); /* prev sui */
! LockBuffer(buffer, BUFFER_LOCK_UNLOCK);
! WriteBuffer(buffer);
return;
}
***************
*** 2523,2529 ****
elog(PANIC, "_heap_unlock_tuple: invalid xmax in rollback");
htup->t_infomask &= ~HEAP_XMAX_UNLOGGED;
htup->t_infomask |= HEAP_XMAX_INVALID;
! UnlockAndWriteBuffer(buffer);
return;
}
--- 2533,2540 ----
elog(PANIC, "_heap_unlock_tuple: invalid xmax in rollback");
htup->t_infomask &= ~HEAP_XMAX_UNLOGGED;
htup->t_infomask |= HEAP_XMAX_INVALID;
! LockBuffer(buffer, BUFFER_LOCK_UNLOCK);
! WriteBuffer(buffer);
return;
}
Index: src/backend/access/nbtree/nbtxlog.c
===================================================================
RCS file: /var/lib/cvs/pgsql-server/src/backend/access/nbtree/nbtxlog.c,v
retrieving revision 1.8
diff -c -r1.8 nbtxlog.c
*** src/backend/access/nbtree/nbtxlog.c 29 Nov 2003 19:51:40 -0000 1.8
--- src/backend/access/nbtree/nbtxlog.c 10 Dec 2003 22:34:31 -0000
***************
*** 69,75 ****
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);
foreach(l, incomplete_splits)
{
--- 69,76 ----
btitem = (BTItem) PageGetItem(page, PageGetItemId(page, offnum));
rightblk = ItemPointerGetBlockNumber(&(btitem->bti_itup.t_tid));
Assert(ItemPointerGetOffsetNumber(&(btitem->bti_itup.t_tid)) == P_HIKEY);
! LockBuffer(buffer, BUFFER_LOCK_UNLOCK);
! ReleaseBuffer(buffer);
foreach(l, incomplete_splits)
{
***************
*** 137,143 ****
PageSetLSN(metapg, lsn);
PageSetSUI(metapg, ThisStartUpID);
! UnlockAndWriteBuffer(metabuf);
}
static void
--- 138,145 ----
PageSetLSN(metapg, lsn);
PageSetSUI(metapg, ThisStartUpID);
! LockBuffer(metabuf, BUFFER_LOCK_UNLOCK);
! WriteBuffer(metabuf);
}
static void
***************
*** 184,190 ****
if (redo)
{
if (XLByteLE(lsn, PageGetLSN(page)))
! UnlockAndReleaseBuffer(buffer);
else
{
if (PageAddItem(page, (Item) datapos, datalen,
--- 186,195 ----
if (redo)
{
if (XLByteLE(lsn, PageGetLSN(page)))
! {
! LockBuffer(buffer, BUFFER_LOCK_UNLOCK);
! ReleaseBuffer(buffer);
! }
else
{
if (PageAddItem(page, (Item) datapos, datalen,
***************
*** 194,200 ****
PageSetLSN(page, lsn);
PageSetSUI(page, ThisStartUpID);
! UnlockAndWriteBuffer(buffer);
}
}
else
--- 199,206 ----
PageSetLSN(page, lsn);
PageSetSUI(page, ThisStartUpID);
! LockBuffer(buffer, BUFFER_LOCK_UNLOCK);
! WriteBuffer(buffer);
}
}
else
***************
*** 203,209 ****
elog(PANIC, "btree_insert_undo: bad page LSN");
if (!P_ISLEAF(pageop))
! UnlockAndReleaseBuffer(buffer);
else
elog(PANIC, "btree_insert_undo: unimplemented");
}
--- 209,218 ----
elog(PANIC, "btree_insert_undo: bad page LSN");
if (!P_ISLEAF(pageop))
! {
! LockBuffer(buffer, BUFFER_LOCK_UNLOCK);
! ReleaseBuffer(buffer);
! }
else
elog(PANIC, "btree_insert_undo: unimplemented");
}
***************
*** 275,281 ****
PageSetLSN(page, lsn);
PageSetSUI(page, ThisStartUpID);
! UnlockAndWriteBuffer(buffer);
}
else
{
--- 284,291 ----
PageSetLSN(page, lsn);
PageSetSUI(page, ThisStartUpID);
! LockBuffer(buffer, BUFFER_LOCK_UNLOCK);
! WriteBuffer(buffer);
}
else
{
***************
*** 310,316 ****
PageSetLSN(page, lsn);
PageSetSUI(page, ThisStartUpID);
! UnlockAndWriteBuffer(buffer);
}
else
{
--- 320,327 ----
PageSetLSN(page, lsn);
PageSetSUI(page, ThisStartUpID);
! LockBuffer(buffer, BUFFER_LOCK_UNLOCK);
! WriteBuffer(buffer);
}
else
{
***************
*** 334,340 ****
elog(PANIC, "btree_split_redo: uninitialized next right page");
if (XLByteLE(lsn, PageGetLSN(page)))
! UnlockAndReleaseBuffer(buffer);
else
{
pageop = (BTPageOpaque) PageGetSpecialPointer(page);
--- 345,354 ----
elog(PANIC, "btree_split_redo: uninitialized next right page");
if (XLByteLE(lsn, PageGetLSN(page)))
! {
! LockBuffer(buffer, BUFFER_LOCK_UNLOCK);
! ReleaseBuffer(buffer);
! }
else
{
pageop = (BTPageOpaque) PageGetSpecialPointer(page);
***************
*** 342,348 ****
PageSetLSN(page, lsn);
PageSetSUI(page, ThisStartUpID);
! UnlockAndWriteBuffer(buffer);
}
}
}
--- 356,363 ----
PageSetLSN(page, lsn);
PageSetSUI(page, ThisStartUpID);
! LockBuffer(buffer, BUFFER_LOCK_UNLOCK);
! WriteBuffer(buffer);
}
}
}
***************
*** 385,391 ****
if (XLByteLE(lsn, PageGetLSN(page)))
{
! UnlockAndReleaseBuffer(buffer);
return;
}
--- 400,407 ----
if (XLByteLE(lsn, PageGetLSN(page)))
{
! LockBuffer(buffer, BUFFER_LOCK_UNLOCK);
! ReleaseBuffer(buffer);
return;
}
***************
*** 407,413 ****
PageSetLSN(page, lsn);
PageSetSUI(page, ThisStartUpID);
! UnlockAndWriteBuffer(buffer);
}
static void
--- 423,430 ----
PageSetLSN(page, lsn);
PageSetSUI(page, ThisStartUpID);
! LockBuffer(buffer, BUFFER_LOCK_UNLOCK);
! WriteBuffer(buffer);
}
static void
***************
*** 445,451 ****
if (PageIsNew((PageHeader) page))
elog(PANIC, "btree_delete_page_redo: uninitialized parent page");
if (XLByteLE(lsn, PageGetLSN(page)))
! UnlockAndReleaseBuffer(buffer);
else
{
OffsetNumber poffset;
--- 462,471 ----
if (PageIsNew((PageHeader) page))
elog(PANIC, "btree_delete_page_redo: uninitialized parent page");
if (XLByteLE(lsn, PageGetLSN(page)))
! {
! LockBuffer(buffer, BUFFER_LOCK_UNLOCK);
! ReleaseBuffer(buffer);
! }
else
{
OffsetNumber poffset;
***************
*** 472,478 ****
PageSetLSN(page, lsn);
PageSetSUI(page, ThisStartUpID);
! UnlockAndWriteBuffer(buffer);
}
}
--- 492,499 ----
PageSetLSN(page, lsn);
PageSetSUI(page, ThisStartUpID);
! LockBuffer(buffer, BUFFER_LOCK_UNLOCK);
! WriteBuffer(buffer);
}
}
***************
*** 486,492 ****
if (PageIsNew((PageHeader) page))
elog(PANIC, "btree_delete_page_redo: uninitialized right sibling");
if (XLByteLE(lsn, PageGetLSN(page)))
! UnlockAndReleaseBuffer(buffer);
else
{
pageop = (BTPageOpaque) PageGetSpecialPointer(page);
--- 507,516 ----
if (PageIsNew((PageHeader) page))
elog(PANIC, "btree_delete_page_redo: uninitialized right sibling");
if (XLByteLE(lsn, PageGetLSN(page)))
! {
! LockBuffer(buffer, BUFFER_LOCK_UNLOCK);
! ReleaseBuffer(buffer);
! }
else
{
pageop = (BTPageOpaque) PageGetSpecialPointer(page);
***************
*** 494,500 ****
PageSetLSN(page, lsn);
PageSetSUI(page, ThisStartUpID);
! UnlockAndWriteBuffer(buffer);
}
}
--- 518,525 ----
PageSetLSN(page, lsn);
PageSetSUI(page, ThisStartUpID);
! LockBuffer(buffer, BUFFER_LOCK_UNLOCK);
! WriteBuffer(buffer);
}
}
***************
*** 510,516 ****
if (PageIsNew((PageHeader) page))
elog(PANIC, "btree_delete_page_redo: uninitialized left sibling");
if (XLByteLE(lsn, PageGetLSN(page)))
! UnlockAndReleaseBuffer(buffer);
else
{
pageop = (BTPageOpaque) PageGetSpecialPointer(page);
--- 535,544 ----
if (PageIsNew((PageHeader) page))
elog(PANIC, "btree_delete_page_redo: uninitialized left sibling");
if (XLByteLE(lsn, PageGetLSN(page)))
! {
! LockBuffer(buffer, BUFFER_LOCK_UNLOCK);
! ReleaseBuffer(buffer);
! }
else
{
pageop = (BTPageOpaque) PageGetSpecialPointer(page);
***************
*** 518,524 ****
PageSetLSN(page, lsn);
PageSetSUI(page, ThisStartUpID);
! UnlockAndWriteBuffer(buffer);
}
}
}
--- 546,553 ----
PageSetLSN(page, lsn);
PageSetSUI(page, ThisStartUpID);
! LockBuffer(buffer, BUFFER_LOCK_UNLOCK);
! WriteBuffer(buffer);
}
}
}
***************
*** 543,549 ****
PageSetLSN(page, lsn);
PageSetSUI(page, ThisStartUpID);
! UnlockAndWriteBuffer(buffer);
}
else
{
--- 572,579 ----
PageSetLSN(page, lsn);
PageSetSUI(page, ThisStartUpID);
! LockBuffer(buffer, BUFFER_LOCK_UNLOCK);
! WriteBuffer(buffer);
}
else
{
***************
*** 606,612 ****
PageSetLSN(page, lsn);
PageSetSUI(page, ThisStartUpID);
! UnlockAndWriteBuffer(buffer);
_bt_restore_meta(reln, lsn,
xlrec->rootblk, xlrec->level,
--- 636,643 ----
PageSetLSN(page, lsn);
PageSetSUI(page, ThisStartUpID);
! LockBuffer(buffer, BUFFER_LOCK_UNLOCK);
! WriteBuffer(buffer);
_bt_restore_meta(reln, lsn,
xlrec->rootblk, xlrec->level,
***************
*** 668,674 ****
PageSetLSN(page, lsn);
PageSetSUI(page, ThisStartUpID);
! UnlockAndWriteBuffer(buffer);
}
--- 699,706 ----
PageSetLSN(page, lsn);
PageSetSUI(page, ThisStartUpID);
! LockBuffer(buffer, BUFFER_LOCK_UNLOCK);
! WriteBuffer(buffer);
}
Index: src/backend/access/transam/xlog.c
===================================================================
RCS file: /var/lib/cvs/pgsql-server/src/backend/access/transam/xlog.c,v
retrieving revision 1.126
diff -c -r1.126 xlog.c
*** src/backend/access/transam/xlog.c 29 Nov 2003 19:51:40 -0000 1.126
--- src/backend/access/transam/xlog.c 10 Dec 2003 22:34:31 -0000
***************
*** 1712,1718 ****
memcpy((char *) page, blk, BLCKSZ);
PageSetLSN(page, lsn);
PageSetSUI(page, ThisStartUpID);
! UnlockAndWriteBuffer(buffer);
}
}
--- 1712,1719 ----
memcpy((char *) page, blk, BLCKSZ);
PageSetLSN(page, lsn);
PageSetSUI(page, ThisStartUpID);
! LockBuffer(buffer, BUFFER_LOCK_UNLOCK);
! WriteBuffer(buffer);
}
}
Index: src/backend/access/transam/xlogutils.c
===================================================================
RCS file: /var/lib/cvs/pgsql-server/src/backend/access/transam/xlogutils.c,v
retrieving revision 1.27
diff -c -r1.27 xlogutils.c
*** src/backend/access/transam/xlogutils.c 29 Nov 2003 19:51:40 -0000 1.27
--- src/backend/access/transam/xlogutils.c 10 Dec 2003 22:34:31 -0000
***************
*** 60,72 ****
if (PageIsNew((PageHeader) page) ||
ItemPointerGetOffsetNumber(iptr) > PageGetMaxOffsetNumber(page))
{
! UnlockAndReleaseBuffer(buffer);
return (0);
}
lp = PageGetItemId(page, ItemPointerGetOffsetNumber(iptr));
if (!ItemIdIsUsed(lp) || ItemIdDeleted(lp))
{
! UnlockAndReleaseBuffer(buffer);
return (0);
}
--- 60,74 ----
if (PageIsNew((PageHeader) page) ||
ItemPointerGetOffsetNumber(iptr) > PageGetMaxOffsetNumber(page))
{
! LockBuffer(buffer, BUFFER_LOCK_UNLOCK);
! ReleaseBuffer(buffer);
return (0);
}
lp = PageGetItemId(page, ItemPointerGetOffsetNumber(iptr));
if (!ItemIdIsUsed(lp) || ItemIdDeleted(lp))
{
! LockBuffer(buffer, BUFFER_LOCK_UNLOCK);
! ReleaseBuffer(buffer);
return (0);
}
***************
*** 76,86 ****
if (!TransactionIdEquals(HeapTupleHeaderGetXmin(htup), xid) ||
HeapTupleHeaderGetCmin(htup) != cid)
{
! UnlockAndReleaseBuffer(buffer);
return (-1);
}
! UnlockAndReleaseBuffer(buffer);
return (1);
}
--- 78,90 ----
if (!TransactionIdEquals(HeapTupleHeaderGetXmin(htup), xid) ||
HeapTupleHeaderGetCmin(htup) != cid)
{
! LockBuffer(buffer, BUFFER_LOCK_UNLOCK);
! ReleaseBuffer(buffer);
return (-1);
}
! LockBuffer(buffer, BUFFER_LOCK_UNLOCK);
! ReleaseBuffer(buffer);
return (1);
}
***************
*** 112,132 ****
if (PageIsNew((PageHeader) page) ||
ItemPointerGetOffsetNumber(iptr) > PageGetMaxOffsetNumber(page))
{
! UnlockAndReleaseBuffer(buffer);
return (false);
}
if (PageGetSUI(page) != ThisStartUpID)
{
Assert(PageGetSUI(page) < ThisStartUpID);
! UnlockAndReleaseBuffer(buffer);
return (true);
}
lp = PageGetItemId(page, ItemPointerGetOffsetNumber(iptr));
if (!ItemIdIsUsed(lp) || ItemIdDeleted(lp))
{
! UnlockAndReleaseBuffer(buffer);
return (false);
}
--- 116,139 ----
if (PageIsNew((PageHeader) page) ||
ItemPointerGetOffsetNumber(iptr) > PageGetMaxOffsetNumber(page))
{
! LockBuffer(buffer, BUFFER_LOCK_UNLOCK);
! ReleaseBuffer(buffer);
return (false);
}
if (PageGetSUI(page) != ThisStartUpID)
{
Assert(PageGetSUI(page) < ThisStartUpID);
! LockBuffer(buffer, BUFFER_LOCK_UNLOCK);
! ReleaseBuffer(buffer);
return (true);
}
lp = PageGetItemId(page, ItemPointerGetOffsetNumber(iptr));
if (!ItemIdIsUsed(lp) || ItemIdDeleted(lp))
{
! LockBuffer(buffer, BUFFER_LOCK_UNLOCK);
! ReleaseBuffer(buffer);
return (false);
}
***************
*** 141,152 ****
TransactionIdDidAbort(HeapTupleHeaderGetXvac(htup))) ||
TransactionIdDidAbort(HeapTupleHeaderGetXmin(htup)))
{
! UnlockAndReleaseBuffer(buffer);
return (false);
}
}
! UnlockAndReleaseBuffer(buffer);
return (true);
}
--- 148,161 ----
TransactionIdDidAbort(HeapTupleHeaderGetXvac(htup))) ||
TransactionIdDidAbort(HeapTupleHeaderGetXmin(htup)))
{
! LockBuffer(buffer, BUFFER_LOCK_UNLOCK);
! ReleaseBuffer(buffer);
return (false);
}
}
! LockBuffer(buffer, BUFFER_LOCK_UNLOCK);
! ReleaseBuffer(buffer);
return (true);
}
Index: src/backend/commands/sequence.c
===================================================================
RCS file: /var/lib/cvs/pgsql-server/src/backend/commands/sequence.c,v
retrieving revision 1.105
diff -c -r1.105 sequence.c
*** src/backend/commands/sequence.c 29 Nov 2003 19:51:47 -0000 1.105
--- src/backend/commands/sequence.c 10 Dec 2003 22:34:31 -0000
***************
*** 1104,1110 ****
PageSetLSN(page, lsn);
PageSetSUI(page, ThisStartUpID);
! UnlockAndWriteBuffer(buffer);
}
void
--- 1104,1111 ----
PageSetLSN(page, lsn);
PageSetSUI(page, ThisStartUpID);
! LockBuffer(buffer, BUFFER_LOCK_UNLOCK);
! WriteBuffer(buffer);
}
void
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.58
diff -c -r1.58 buf_init.c
*** src/backend/storage/buffer/buf_init.c 29 Nov 2003 19:51:56 -0000 1.58
--- src/backend/storage/buffer/buf_init.c 10 Dec 2003 22:34:31 -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 ----
***************
*** 138,153 ****
*/
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);
--- 127,132 ----
***************
*** 256,264 ****
/* size of buffer hash table */
size += hash_estimate_size(NBuffers, sizeof(BufferLookupEnt));
- #ifdef BMTRACE
- size += (BMT_LIMIT * sizeof(bmtrace)) + sizeof(long);
- #endif
-
return size;
}
--- 235,239 ----
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.33
diff -c -r1.33 buf_table.c
*** src/backend/storage/buffer/buf_table.c 29 Nov 2003 19:51:56 -0000 1.33
--- src/backend/storage/buffer/buf_table.c 10 Dec 2003 22:34:31 -0000
***************
*** 117,131 ****
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
--- 117,119 ----
Index: src/backend/storage/buffer/bufmgr.c
===================================================================
RCS file: /var/lib/cvs/pgsql-server/src/backend/storage/buffer/bufmgr.c,v
retrieving revision 1.148
diff -c -r1.148 bufmgr.c
*** src/backend/storage/buffer/bufmgr.c 1 Dec 2003 16:53:19 -0000 1.148
--- src/backend/storage/buffer/bufmgr.c 10 Dec 2003 22:44:51 -0000
***************
*** 84,90 ****
bool bufferLockHeld);
static BufferDesc *BufferAlloc(Relation reln, BlockNumber blockNum,
bool *foundPtr);
! static int BufferReplace(BufferDesc *bufHdr);
#ifdef NOT_USED
void PrintBufferDescs(void);
--- 84,90 ----
bool bufferLockHeld);
static BufferDesc *BufferAlloc(Relation reln, BlockNumber blockNum,
bool *foundPtr);
! static bool BufferReplace(BufferDesc *bufHdr);
#ifdef NOT_USED
void PrintBufferDescs(void);
***************
*** 109,121 ****
*
* 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)
{
--- 109,114 ----
***************
*** 363,377 ****
* This is never going to happen, don't worry about it.
*/
*foundPtr = FALSE;
}
- #ifdef BMTRACE
- _bm_trace((reln->rd_rel->relisshared ? 0 : MyDatabaseId), RelationGetRelid(reln), blockNum, BufferDescriptorGetBuffer(buf), BMT_ALLOCFND);
- #endif /* BMTRACE */
- if (!(*foundPtr))
- StartBufferIO(buf, true);
LWLockRelease(BufMgrLock);
-
return buf;
}
--- 356,365 ----
* This is never going to happen, don't worry about it.
*/
*foundPtr = FALSE;
+ StartBufferIO(buf, true);
}
LWLockRelease(BufMgrLock);
return buf;
}
***************
*** 402,408 ****
if (buf->flags & BM_DIRTY || buf->cntxDirty)
{
! bool smok;
/*
* skip write error buffers
--- 390,396 ----
if (buf->flags & BM_DIRTY || buf->cntxDirty)
{
! bool replace_ok;
/*
* skip write error buffers
***************
*** 436,444 ****
* Write the buffer out, being careful to release BufMgrLock
* before starting the I/O.
*/
! smok = BufferReplace(buf);
! if (smok == FALSE)
{
ereport(WARNING,
(errcode(ERRCODE_IO_ERROR),
--- 424,432 ----
* Write the buffer out, being careful to release BufMgrLock
* before starting the I/O.
*/
! replace_ok = BufferReplace(buf);
! if (replace_ok == false)
{
ereport(WARNING,
(errcode(ERRCODE_IO_ERROR),
***************
*** 465,472 ****
buf->tag.blockNum,
buf->tag.rnode.tblNode, buf->tag.rnode.relNode);
}
! else
! buf->flags &= ~BM_DIRTY;
buf->cntxDirty = false;
}
--- 453,460 ----
buf->tag.blockNum,
buf->tag.rnode.tblNode, buf->tag.rnode.relNode);
}
!
! buf->flags &= ~BM_DIRTY;
buf->cntxDirty = false;
}
***************
*** 523,535 ****
WaitIO(buf2);
inProgress = (buf2->flags & BM_IO_IN_PROGRESS);
}
if (BUFFER_IS_BROKEN(buf2))
*foundPtr = FALSE;
-
- if (!(*foundPtr))
StartBufferIO(buf2, true);
! LWLockRelease(BufMgrLock);
return buf2;
}
}
--- 511,524 ----
WaitIO(buf2);
inProgress = (buf2->flags & BM_IO_IN_PROGRESS);
}
+
if (BUFFER_IS_BROKEN(buf2))
+ {
*foundPtr = FALSE;
StartBufferIO(buf2, true);
! }
+ LWLockRelease(BufMgrLock);
return buf2;
}
}
***************
*** 558,567 ****
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;
--- 547,552 ----
***************
*** 602,616 ****
*
* Marks buffer contents as dirty (actual write happens later).
*
! * Assume that buffer is pinned. Assume that reln is
! * valid.
*
* Side Effects:
* Pin count is decremented.
*/
-
- #undef WriteBuffer
-
void
WriteBuffer(Buffer buffer)
{
--- 587,597 ----
*
* Marks buffer contents as dirty (actual write happens later).
*
! * Assume that buffer is pinned. Assume that reln is valid.
*
* Side Effects:
* Pin count is decremented.
*/
void
WriteBuffer(Buffer buffer)
{
***************
*** 627,634 ****
write_buffer(buffer, false);
}
-
- #undef ReleaseAndReadBuffer
/*
* ReleaseAndReadBuffer -- combine ReleaseBuffer() and ReadBuffer()
* to save a lock release/acquire.
--- 608,613 ----
***************
*** 638,644 ****
* 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
* buffer actually needs to be released. This case is the same as ReadBuffer,
* but can save some tests in the caller.
*
--- 617,623 ----
* 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
* buffer actually needs to be released. This case is the same as ReadBuffer,
* but can save some tests in the caller.
*
***************
*** 1092,1102 ****
/*
* BufferReplace
*
! * Write out the buffer corresponding to 'bufHdr'
*
* BufMgrLock must be held at entry, and the buffer must be pinned.
*/
! static int
BufferReplace(BufferDesc *bufHdr)
{
Relation reln;
--- 1071,1082 ----
/*
* BufferReplace
*
! * 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 bool
BufferReplace(BufferDesc *bufHdr)
{
Relation reln;
***************
*** 1147,1157 ****
LWLockAcquire(BufMgrLock, LW_EXCLUSIVE);
if (status == SM_FAIL)
! return FALSE;
BufferFlushCount++;
! return TRUE;
}
/*
--- 1127,1137 ----
LWLockAcquire(BufMgrLock, LW_EXCLUSIVE);
if (status == SM_FAIL)
! return false;
BufferFlushCount++;
! return true;
}
/*
***************
*** 1167,1173 ****
* 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;
--- 1147,1153 ----
* 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;
***************
*** 1175,1180 ****
--- 1155,1161 ----
relation->rd_nblocks = 0;
else if (!relation->rd_isnew && !relation->rd_istemp)
relation->rd_nblocks = smgrnblocks(DEFAULT_SMGR, relation);
+
return relation->rd_nblocks;
}
***************
*** 1623,1630 ****
return 0;
}
- #undef ReleaseBuffer
-
/*
* ReleaseBuffer -- remove the pin on a buffer without
* marking it dirty.
--- 1604,1609 ----
***************
*** 1737,1887 ****
}
#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
*
--- 1716,1721 ----
Index: src/include/storage/buf_internals.h
===================================================================
RCS file: /var/lib/cvs/pgsql-server/src/include/storage/buf_internals.h,v
retrieving revision 1.65
diff -c -r1.65 buf_internals.h
*** src/include/storage/buf_internals.h 29 Nov 2003 22:41:13 -0000 1.65
--- src/include/storage/buf_internals.h 10 Dec 2003 22:34:31 -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;
***************
*** 136,167 ****
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;
--- 135,140 ----
Index: src/include/storage/bufmgr.h
===================================================================
RCS file: /var/lib/cvs/pgsql-server/src/include/storage/bufmgr.h,v
retrieving revision 1.72
diff -c -r1.72 bufmgr.h
*** src/include/storage/bufmgr.h 29 Nov 2003 22:41:13 -0000 1.72
--- src/include/storage/bufmgr.h 10 Dec 2003 22:34:31 -0000
***************
*** 57,75 ****
*/
#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
--- 57,62 ----
---------------------------(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