mirror of
https://github.com/postgres/postgres.git
synced 2025-06-16 06:01:02 +03:00
bufmgr: Add Pin/UnpinLocalBuffer()
So far these were open-coded in quite a few places, without a good reason. Reviewed-by: Melanie Plageman <melanieplageman@gmail.com> Reviewed-by: David Rowley <dgrowleyml@gmail.com> Discussion: https://postgr.es/m/20221029025420.eplyow6k7tgu6he3@awork3.anarazel.de
This commit is contained in:
@ -636,20 +636,7 @@ ReadRecentBuffer(RelFileLocator rlocator, ForkNumber forkNum, BlockNumber blockN
|
||||
/* Is it still valid and holding the right tag? */
|
||||
if ((buf_state & BM_VALID) && BufferTagsEqual(&tag, &bufHdr->tag))
|
||||
{
|
||||
/*
|
||||
* Bump buffer's ref and usage counts. This is equivalent of
|
||||
* PinBuffer for a shared buffer.
|
||||
*/
|
||||
if (LocalRefCount[b] == 0)
|
||||
{
|
||||
if (BUF_STATE_GET_USAGECOUNT(buf_state) < BM_MAX_USAGE_COUNT)
|
||||
{
|
||||
buf_state += BUF_USAGECOUNT_ONE;
|
||||
pg_atomic_unlocked_write_u32(&bufHdr->state, buf_state);
|
||||
}
|
||||
}
|
||||
LocalRefCount[b]++;
|
||||
ResourceOwnerRememberBuffer(CurrentResourceOwner, recent_buffer);
|
||||
PinLocalBuffer(bufHdr, true);
|
||||
|
||||
pgBufferUsage.local_blks_hit++;
|
||||
|
||||
@ -1688,8 +1675,7 @@ ReleaseAndReadBuffer(Buffer buffer,
|
||||
BufTagMatchesRelFileLocator(&bufHdr->tag, &relation->rd_locator) &&
|
||||
BufTagGetForkNum(&bufHdr->tag) == forkNum)
|
||||
return buffer;
|
||||
ResourceOwnerForgetBuffer(CurrentResourceOwner, buffer);
|
||||
LocalRefCount[-buffer - 1]--;
|
||||
UnpinLocalBuffer(buffer);
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -3982,15 +3968,9 @@ ReleaseBuffer(Buffer buffer)
|
||||
elog(ERROR, "bad buffer ID: %d", buffer);
|
||||
|
||||
if (BufferIsLocal(buffer))
|
||||
{
|
||||
ResourceOwnerForgetBuffer(CurrentResourceOwner, buffer);
|
||||
|
||||
Assert(LocalRefCount[-buffer - 1] > 0);
|
||||
LocalRefCount[-buffer - 1]--;
|
||||
return;
|
||||
}
|
||||
|
||||
UnpinBuffer(GetBufferDescriptor(buffer - 1));
|
||||
UnpinLocalBuffer(buffer);
|
||||
else
|
||||
UnpinBuffer(GetBufferDescriptor(buffer - 1));
|
||||
}
|
||||
|
||||
/*
|
||||
|
Reference in New Issue
Block a user