Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit794f259

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 parent819b69a commit794f259

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
returnbuffer;
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
returnbufHdr;
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,booladjust_usagecount)
473+
{
474+
uint32buf_state;
475+
Bufferbuffer=BufferDescriptorGetBuffer(buf_hdr);
476+
intbufid=-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+
returnbuf_state&BM_VALID;
494+
}
495+
496+
void
497+
UnpinLocalBuffer(Bufferbuffer)
498+
{
499+
intbuffid=-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 intBufTableInsert(BufferTag *tagPtr, uint32 hashcode, int buf_id);
415415
externvoidBufTableDelete(BufferTag*tagPtr,uint32hashcode);
416416

417417
/* localbuf.c */
418+
externboolPinLocalBuffer(BufferDesc*buf_hdr,booladjust_usagecount);
419+
externvoidUnpinLocalBuffer(Bufferbuffer);
418420
externPrefetchBufferResultPrefetchLocalBuffer(SMgrRelationsmgr,
419421
ForkNumberforkNum,
420422
BlockNumberblockNum);

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp