Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
Skip to content

Commit 794f259

Browse files
committed
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
1 parent 819b69a commit 794f259

File tree

3 files changed

+51
-48
lines changed

3 files changed

+51
-48
lines changed

src/backend/storage/buffer/bufmgr.c

Lines changed: 5 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -636,20 +636,7 @@ ReadRecentBuffer(RelFileLocator rlocator, ForkNumber forkNum, BlockNumber blockN
636636
/* Is it still valid and holding the right tag? */
637637
if ((buf_state & BM_VALID) && BufferTagsEqual(&tag, &bufHdr->tag))
638638
{
639-
/*
640-
* Bump buffer's ref and usage counts. This is equivalent of
641-
* PinBuffer for a shared buffer.
642-
*/
643-
if (LocalRefCount[b] == 0)
644-
{
645-
if (BUF_STATE_GET_USAGECOUNT(buf_state) < BM_MAX_USAGE_COUNT)
646-
{
647-
buf_state += BUF_USAGECOUNT_ONE;
648-
pg_atomic_unlocked_write_u32(&bufHdr->state, buf_state);
649-
}
650-
}
651-
LocalRefCount[b]++;
652-
ResourceOwnerRememberBuffer(CurrentResourceOwner, recent_buffer);
639+
PinLocalBuffer(bufHdr, true);
653640

654641
pgBufferUsage.local_blks_hit++;
655642

@@ -1688,8 +1675,7 @@ ReleaseAndReadBuffer(Buffer buffer,
16881675
BufTagMatchesRelFileLocator(&bufHdr->tag, &relation->rd_locator) &&
16891676
BufTagGetForkNum(&bufHdr->tag) == forkNum)
16901677
return buffer;
1691-
ResourceOwnerForgetBuffer(CurrentResourceOwner, buffer);
1692-
LocalRefCount[-buffer - 1]--;
1678+
UnpinLocalBuffer(buffer);
16931679
}
16941680
else
16951681
{
@@ -3982,15 +3968,9 @@ ReleaseBuffer(Buffer buffer)
39823968
elog(ERROR, "bad buffer ID: %d", buffer);
39833969

39843970
if (BufferIsLocal(buffer))
3985-
{
3986-
ResourceOwnerForgetBuffer(CurrentResourceOwner, buffer);
3987-
3988-
Assert(LocalRefCount[-buffer - 1] > 0);
3989-
LocalRefCount[-buffer - 1]--;
3990-
return;
3991-
}
3992-
3993-
UnpinBuffer(GetBufferDescriptor(buffer - 1));
3971+
UnpinLocalBuffer(buffer);
3972+
else
3973+
UnpinBuffer(GetBufferDescriptor(buffer - 1));
39943974
}
39953975

39963976
/*

src/backend/storage/buffer/localbuf.c

Lines changed: 44 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -137,27 +137,8 @@ LocalBufferAlloc(SMgrRelation smgr, ForkNumber forkNum, BlockNumber blockNum,
137137
fprintf(stderr, "LB ALLOC (%u,%d,%d) %d\n",
138138
smgr->smgr_rlocator.locator.relNumber, forkNum, blockNum, -b - 1);
139139
#endif
140-
buf_state = pg_atomic_read_u32(&bufHdr->state);
141140

142-
/* this part is equivalent to PinBuffer for a shared buffer */
143-
if (LocalRefCount[b] == 0)
144-
{
145-
if (BUF_STATE_GET_USAGECOUNT(buf_state) < BM_MAX_USAGE_COUNT)
146-
{
147-
buf_state += BUF_USAGECOUNT_ONE;
148-
pg_atomic_unlocked_write_u32(&bufHdr->state, buf_state);
149-
}
150-
}
151-
LocalRefCount[b]++;
152-
ResourceOwnerRememberBuffer(CurrentResourceOwner,
153-
BufferDescriptorGetBuffer(bufHdr));
154-
if (buf_state & BM_VALID)
155-
*foundPtr = true;
156-
else
157-
{
158-
/* Previous read attempt must have failed; try again */
159-
*foundPtr = false;
160-
}
141+
*foundPtr = PinLocalBuffer(bufHdr, true);
161142
return bufHdr;
162143
}
163144

@@ -194,9 +175,7 @@ LocalBufferAlloc(SMgrRelation smgr, ForkNumber forkNum, BlockNumber blockNum,
194175
else
195176
{
196177
/* Found a usable buffer */
197-
LocalRefCount[b]++;
198-
ResourceOwnerRememberBuffer(CurrentResourceOwner,
199-
BufferDescriptorGetBuffer(bufHdr));
178+
PinLocalBuffer(bufHdr, false);
200179
break;
201180
}
202181
}
@@ -484,6 +463,48 @@ InitLocalBuffers(void)
484463
NLocBuffer = nbufs;
485464
}
486465

466+
/*
467+
* XXX: We could have a slightly more efficient version of PinLocalBuffer()
468+
* that does not support adjusting the usagecount - but so far it does not
469+
* seem worth the trouble.
470+
*/
471+
bool
472+
PinLocalBuffer(BufferDesc *buf_hdr, bool adjust_usagecount)
473+
{
474+
uint32 buf_state;
475+
Buffer buffer = BufferDescriptorGetBuffer(buf_hdr);
476+
int bufid = -buffer - 1;
477+
478+
buf_state = pg_atomic_read_u32(&buf_hdr->state);
479+
480+
if (LocalRefCount[bufid] == 0)
481+
{
482+
if (adjust_usagecount &&
483+
BUF_STATE_GET_USAGECOUNT(buf_state) < BM_MAX_USAGE_COUNT)
484+
{
485+
buf_state += BUF_USAGECOUNT_ONE;
486+
pg_atomic_unlocked_write_u32(&buf_hdr->state, buf_state);
487+
}
488+
}
489+
LocalRefCount[bufid]++;
490+
ResourceOwnerRememberBuffer(CurrentResourceOwner,
491+
BufferDescriptorGetBuffer(buf_hdr));
492+
493+
return buf_state & BM_VALID;
494+
}
495+
496+
void
497+
UnpinLocalBuffer(Buffer buffer)
498+
{
499+
int buffid = -buffer - 1;
500+
501+
Assert(BufferIsLocal(buffer));
502+
Assert(LocalRefCount[buffid] > 0);
503+
504+
ResourceOwnerForgetBuffer(CurrentResourceOwner, buffer);
505+
LocalRefCount[buffid]--;
506+
}
507+
487508
/*
488509
* GUC check_hook for temp_buffers
489510
*/

src/include/storage/buf_internals.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -415,6 +415,8 @@ extern int BufTableInsert(BufferTag *tagPtr, uint32 hashcode, int buf_id);
415415
extern void BufTableDelete(BufferTag *tagPtr, uint32 hashcode);
416416

417417
/* localbuf.c */
418+
extern bool PinLocalBuffer(BufferDesc *buf_hdr, bool adjust_usagecount);
419+
extern void UnpinLocalBuffer(Buffer buffer);
418420
extern PrefetchBufferResult PrefetchLocalBuffer(SMgrRelation smgr,
419421
ForkNumber forkNum,
420422
BlockNumber blockNum);

0 commit comments

Comments
 (0)