Skip to content

Navigation Menu

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

Appearance settings

Commit 794f259

Browse filesBrowse 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
Copy full SHA for 794f259

File tree

3 files changed

+51
-48
lines changed
Filter options

3 files changed

+51
-48
lines changed

‎src/backend/storage/buffer/bufmgr.c

Copy file name to clipboardExpand all lines: src/backend/storage/buffer/bufmgr.c
+5-25Lines 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

Copy file name to clipboardExpand all lines: src/backend/storage/buffer/localbuf.c
+44-23Lines 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

Copy file name to clipboardExpand all lines: src/include/storage/buf_internals.h
+2Lines 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 (0)
Morty Proxy This is a proxified and sanitized view of the page, visit original site.