Skip to content

Commit 5444f06

Browse files
author
Alexander Korotkov
committed
Lockfree Pin/UnpinBuffer ported from 9.6.
1 parent c71dbee commit 5444f06

File tree

12 files changed

+712
-434
lines changed

12 files changed

+712
-434
lines changed

contrib/pg_buffercache/pg_buffercache_pages.c

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -148,33 +148,34 @@ pg_buffercache_pages(PG_FUNCTION_ARGS)
148148
*/
149149
for (i = 0; i < NBuffers; i++)
150150
{
151-
volatile BufferDesc *bufHdr;
151+
BufferDesc *bufHdr;
152+
uint32 buf_state;
152153

153154
bufHdr = GetBufferDescriptor(i);
154155
/* Lock each buffer header before inspecting. */
155-
LockBufHdr(bufHdr);
156+
buf_state = LockBufHdr(bufHdr);
156157

157158
fctx->record[i].bufferid = BufferDescriptorGetBuffer(bufHdr);
158159
fctx->record[i].relfilenode = bufHdr->tag.rnode.relNode;
159160
fctx->record[i].reltablespace = bufHdr->tag.rnode.spcNode;
160161
fctx->record[i].reldatabase = bufHdr->tag.rnode.dbNode;
161162
fctx->record[i].forknum = bufHdr->tag.forkNum;
162163
fctx->record[i].blocknum = bufHdr->tag.blockNum;
163-
fctx->record[i].usagecount = bufHdr->usage_count;
164-
fctx->record[i].pinning_backends = bufHdr->refcount;
164+
fctx->record[i].usagecount = BUF_STATE_GET_USAGECOUNT(buf_state);
165+
fctx->record[i].pinning_backends = BUF_STATE_GET_REFCOUNT(buf_state);
165166

166-
if (bufHdr->flags & BM_DIRTY)
167+
if (buf_state & BM_DIRTY)
167168
fctx->record[i].isdirty = true;
168169
else
169170
fctx->record[i].isdirty = false;
170171

171172
/* Note if the buffer is valid, and has storage created */
172-
if ((bufHdr->flags & BM_VALID) && (bufHdr->flags & BM_TAG_VALID))
173+
if ((buf_state & BM_VALID) && (buf_state & BM_TAG_VALID))
173174
fctx->record[i].isvalid = true;
174175
else
175176
fctx->record[i].isvalid = false;
176177

177-
UnlockBufHdr(bufHdr);
178+
UnlockBufHdr(bufHdr, buf_state);
178179
}
179180

180181
/*

src/backend/storage/buffer/buf_init.c

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -96,12 +96,9 @@ InitBufferPool(void)
9696
BufferDesc *buf = GetBufferDescriptor(i);
9797

9898
CLEAR_BUFFERTAG(buf->tag);
99-
buf->flags = 0;
100-
buf->usage_count = 0;
101-
buf->refcount = 0;
102-
buf->wait_backend_pid = 0;
10399

104-
SpinLockInit(&buf->buf_hdr_lock);
100+
pg_atomic_init_u32(&buf->state, 0);
101+
buf->wait_backend_pid = 0;
105102

106103
buf->buf_id = i;
107104

0 commit comments

Comments
 (0)