Slightly reduce BufMgrLock contention
От | Manfred Koizar |
---|---|
Тема | Slightly reduce BufMgrLock contention |
Дата | |
Msg-id | dmhumucjo0lgoeelfm3h2alfgvtca1q2b8@4ax.com обсуждение исходный текст |
Ответы |
Re: Slightly reduce BufMgrLock contention
|
Список | pgsql-patches |
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; }
В списке pgsql-patches по дате отправления: