Skip to content

Commit 4b4d33b

Browse files
committed
localbuf: Introduce FlushLocalBuffer()
Previously we had two paths implementing writing out temporary table buffers. For shared buffers, the logic for that is centralized in FlushBuffer(). Introduce FlushLocalBuffer() to do the same for local buffers. Besides being a nice cleanup on its own, it also makes an upcoming change slightly easier. Reviewed-by: Melanie Plageman <melanieplageman@gmail.com> Discussion: https://postgr.es/m/CAAKRu_b9anbWzEs5AAF9WCvcEVmgz-1AkHSQ-CLLy-p7WHzvFw@mail.gmail.com
1 parent dd6f261 commit 4b4d33b

File tree

3 files changed

+38
-49
lines changed

3 files changed

+38
-49
lines changed

src/backend/storage/buffer/bufmgr.c

Lines changed: 1 addition & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -4453,41 +4453,21 @@ FlushRelationBuffers(Relation rel)
44534453
for (i = 0; i < NLocBuffer; i++)
44544454
{
44554455
uint32 buf_state;
4456-
instr_time io_start;
44574456

44584457
bufHdr = GetLocalBufferDescriptor(i);
44594458
if (BufTagMatchesRelFileLocator(&bufHdr->tag, &rel->rd_locator) &&
44604459
((buf_state = pg_atomic_read_u32(&bufHdr->state)) &
44614460
(BM_VALID | BM_DIRTY)) == (BM_VALID | BM_DIRTY))
44624461
{
44634462
ErrorContextCallback errcallback;
4464-
Page localpage;
4465-
4466-
localpage = (char *) LocalBufHdrGetBlock(bufHdr);
44674463

44684464
/* Setup error traceback support for ereport() */
44694465
errcallback.callback = local_buffer_write_error_callback;
44704466
errcallback.arg = bufHdr;
44714467
errcallback.previous = error_context_stack;
44724468
error_context_stack = &errcallback;
44734469

4474-
PageSetChecksumInplace(localpage, bufHdr->tag.blockNum);
4475-
4476-
io_start = pgstat_prepare_io_time(track_io_timing);
4477-
4478-
smgrwrite(srel,
4479-
BufTagGetForkNum(&bufHdr->tag),
4480-
bufHdr->tag.blockNum,
4481-
localpage,
4482-
false);
4483-
4484-
pgstat_count_io_op_time(IOOBJECT_TEMP_RELATION,
4485-
IOCONTEXT_NORMAL, IOOP_WRITE,
4486-
io_start, 1, BLCKSZ);
4487-
4488-
TerminateLocalBufferIO(bufHdr, true, 0);
4489-
4490-
pgBufferUsage.local_blks_written++;
4470+
FlushLocalBuffer(bufHdr, srel);
44914471

44924472
/* Pop the error context stack */
44934473
error_context_stack = errcallback.previous;

src/backend/storage/buffer/localbuf.c

Lines changed: 36 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -174,6 +174,41 @@ LocalBufferAlloc(SMgrRelation smgr, ForkNumber forkNum, BlockNumber blockNum,
174174
return bufHdr;
175175
}
176176

177+
/*
178+
* Like FlushBuffer(), just for local buffers.
179+
*/
180+
void
181+
FlushLocalBuffer(BufferDesc *bufHdr, SMgrRelation reln)
182+
{
183+
instr_time io_start;
184+
Page localpage = (char *) LocalBufHdrGetBlock(bufHdr);
185+
186+
/* Find smgr relation for buffer */
187+
if (reln == NULL)
188+
reln = smgropen(BufTagGetRelFileLocator(&bufHdr->tag),
189+
MyProcNumber);
190+
191+
PageSetChecksumInplace(localpage, bufHdr->tag.blockNum);
192+
193+
io_start = pgstat_prepare_io_time(track_io_timing);
194+
195+
/* And write... */
196+
smgrwrite(reln,
197+
BufTagGetForkNum(&bufHdr->tag),
198+
bufHdr->tag.blockNum,
199+
localpage,
200+
false);
201+
202+
/* Temporary table I/O does not use Buffer Access Strategies */
203+
pgstat_count_io_op_time(IOOBJECT_TEMP_RELATION, IOCONTEXT_NORMAL,
204+
IOOP_WRITE, io_start, 1, BLCKSZ);
205+
206+
/* Mark not-dirty */
207+
TerminateLocalBufferIO(bufHdr, true, 0);
208+
209+
pgBufferUsage.local_blks_written++;
210+
}
211+
177212
static Buffer
178213
GetLocalVictimBuffer(void)
179214
{
@@ -234,34 +269,7 @@ GetLocalVictimBuffer(void)
234269
* the case, write it out before reusing it!
235270
*/
236271
if (pg_atomic_read_u32(&bufHdr->state) & BM_DIRTY)
237-
{
238-
instr_time io_start;
239-
SMgrRelation oreln;
240-
Page localpage = (char *) LocalBufHdrGetBlock(bufHdr);
241-
242-
/* Find smgr relation for buffer */
243-
oreln = smgropen(BufTagGetRelFileLocator(&bufHdr->tag), MyProcNumber);
244-
245-
PageSetChecksumInplace(localpage, bufHdr->tag.blockNum);
246-
247-
io_start = pgstat_prepare_io_time(track_io_timing);
248-
249-
/* And write... */
250-
smgrwrite(oreln,
251-
BufTagGetForkNum(&bufHdr->tag),
252-
bufHdr->tag.blockNum,
253-
localpage,
254-
false);
255-
256-
/* Temporary table I/O does not use Buffer Access Strategies */
257-
pgstat_count_io_op_time(IOOBJECT_TEMP_RELATION, IOCONTEXT_NORMAL,
258-
IOOP_WRITE, io_start, 1, BLCKSZ);
259-
260-
/* Mark not-dirty now in case we error out below */
261-
TerminateLocalBufferIO(bufHdr, true, 0);
262-
263-
pgBufferUsage.local_blks_written++;
264-
}
272+
FlushLocalBuffer(bufHdr, NULL);
265273

266274
/*
267275
* Remove the victim buffer from the hashtable and mark as invalid.

src/include/storage/buf_internals.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -473,6 +473,7 @@ extern BlockNumber ExtendBufferedRelLocal(BufferManagerRelation bmr,
473473
extern void MarkLocalBufferDirty(Buffer buffer);
474474
extern void TerminateLocalBufferIO(BufferDesc *bufHdr, bool clear_dirty,
475475
uint32 set_flag_bits);
476+
extern void FlushLocalBuffer(BufferDesc *bufHdr, SMgrRelation reln);
476477
extern void DropRelationLocalBuffers(RelFileLocator rlocator,
477478
ForkNumber forkNum,
478479
BlockNumber firstDelBlock);

0 commit comments

Comments
 (0)