diff options
author | Andres Freund <andres@anarazel.de> | 2023-04-05 10:42:17 -0700 |
---|---|---|
committer | Andres Freund <andres@anarazel.de> | 2023-04-05 10:42:17 -0700 |
commit | 794f25944790ed0462cde3d6dc0f1ad02fcd6bba (patch) | |
tree | d950d8985d144ff85031590fc022434c53b64534 /src/backend/storage/buffer/localbuf.c | |
parent | 819b69a81d307e2ad8e9752cf062ebb57813960d (diff) | |
download | postgresql-794f25944790ed0462cde3d6dc0f1ad02fcd6bba.tar.gz postgresql-794f25944790ed0462cde3d6dc0f1ad02fcd6bba.zip |
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
Diffstat (limited to 'src/backend/storage/buffer/localbuf.c')
-rw-r--r-- | src/backend/storage/buffer/localbuf.c | 67 |
1 files changed, 44 insertions, 23 deletions
diff --git a/src/backend/storage/buffer/localbuf.c b/src/backend/storage/buffer/localbuf.c index 6f9e7eda57c..940b80d165e 100644 --- a/src/backend/storage/buffer/localbuf.c +++ b/src/backend/storage/buffer/localbuf.c @@ -137,27 +137,8 @@ LocalBufferAlloc(SMgrRelation smgr, ForkNumber forkNum, BlockNumber blockNum, fprintf(stderr, "LB ALLOC (%u,%d,%d) %d\n", smgr->smgr_rlocator.locator.relNumber, forkNum, blockNum, -b - 1); #endif - buf_state = pg_atomic_read_u32(&bufHdr->state); - /* this part is equivalent to 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, - BufferDescriptorGetBuffer(bufHdr)); - if (buf_state & BM_VALID) - *foundPtr = true; - else - { - /* Previous read attempt must have failed; try again */ - *foundPtr = false; - } + *foundPtr = PinLocalBuffer(bufHdr, true); return bufHdr; } @@ -194,9 +175,7 @@ LocalBufferAlloc(SMgrRelation smgr, ForkNumber forkNum, BlockNumber blockNum, else { /* Found a usable buffer */ - LocalRefCount[b]++; - ResourceOwnerRememberBuffer(CurrentResourceOwner, - BufferDescriptorGetBuffer(bufHdr)); + PinLocalBuffer(bufHdr, false); break; } } @@ -485,6 +464,48 @@ InitLocalBuffers(void) } /* + * XXX: We could have a slightly more efficient version of PinLocalBuffer() + * that does not support adjusting the usagecount - but so far it does not + * seem worth the trouble. + */ +bool +PinLocalBuffer(BufferDesc *buf_hdr, bool adjust_usagecount) +{ + uint32 buf_state; + Buffer buffer = BufferDescriptorGetBuffer(buf_hdr); + int bufid = -buffer - 1; + + buf_state = pg_atomic_read_u32(&buf_hdr->state); + + if (LocalRefCount[bufid] == 0) + { + if (adjust_usagecount && + BUF_STATE_GET_USAGECOUNT(buf_state) < BM_MAX_USAGE_COUNT) + { + buf_state += BUF_USAGECOUNT_ONE; + pg_atomic_unlocked_write_u32(&buf_hdr->state, buf_state); + } + } + LocalRefCount[bufid]++; + ResourceOwnerRememberBuffer(CurrentResourceOwner, + BufferDescriptorGetBuffer(buf_hdr)); + + return buf_state & BM_VALID; +} + +void +UnpinLocalBuffer(Buffer buffer) +{ + int buffid = -buffer - 1; + + Assert(BufferIsLocal(buffer)); + Assert(LocalRefCount[buffid] > 0); + + ResourceOwnerForgetBuffer(CurrentResourceOwner, buffer); + LocalRefCount[buffid]--; +} + +/* * GUC check_hook for temp_buffers */ bool |