This patch prevents btbulkdelete() from calling WriteNoReleaseBuffer()
several times for the same buffer. Thus it saves a few
LWLockAquire(BufMgrLock, LW_EXCLUSIVE) and LWLockRelease(BufMgrLock)
calls.
Maybe we do not need a BufMgrLock at all, because we have a super
exclusive lock on the buffer? I was not sure and decided to stay on
the safe side ...
Servus
Manfred
diff -ruN ../base/src/backend/access/nbtree/nbtree.c src/backend/access/nbtree/nbtree.c
--- ../base/src/backend/access/nbtree/nbtree.c 2002-06-21 02:12:14.000000000 +0200
+++ src/backend/access/nbtree/nbtree.c 2002-08-30 11:44:35.000000000 +0200
@@ -615,6 +615,7 @@
{
Buffer buf;
BlockNumber lockedBlock = InvalidBlockNumber;
+ bool dirty = false;
/* we have the buffer pinned and locked */
buf = so->btso_curbuf;
@@ -662,14 +663,19 @@
LockBuffer(buf, BUFFER_LOCK_UNLOCK);
LockBufferForCleanup(buf);
lockedBlock = blkno;
+ dirty = false;
}
else
{
/* Okay to delete the item from the page */
_bt_itemdel(rel, buf, current);
- /* Mark buffer dirty, but keep the lock and pin */
- WriteNoReleaseBuffer(buf);
+ if (!dirty)
+ {
+ /* Mark buffer dirty, but keep the lock and pin */
+ WriteNoReleaseBuffer(buf);
+ dirty = true;
+ }
tuples_removed += 1;
}