Skip to content

Commit 6cd015b

Browse files
committed
Add new function log_newpage_buffer.
When I implemented the ginbuildempty() function as part of implementing unlogged tables, I falsified the note in the header comment for log_newpage. Although we could fix that up by changing the comment, it seems cleaner to add a new function which is specifically intended to handle this case. So do that.
1 parent a475c60 commit 6cd015b

File tree

3 files changed

+54
-13
lines changed

3 files changed

+54
-13
lines changed

src/backend/access/gin/gininsert.c

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -520,20 +520,14 @@ ginbuildempty(PG_FUNCTION_ARGS)
520520
ReadBufferExtended(index, INIT_FORKNUM, P_NEW, RBM_NORMAL, NULL);
521521
LockBuffer(RootBuffer, BUFFER_LOCK_EXCLUSIVE);
522522

523-
/* Initialize both pages, mark them dirty, unlock and release buffer. */
523+
/* Initialize and xlog metabuffer and root buffer. */
524524
START_CRIT_SECTION();
525525
GinInitMetabuffer(MetaBuffer);
526526
MarkBufferDirty(MetaBuffer);
527+
log_newpage_buffer(MetaBuffer);
527528
GinInitBuffer(RootBuffer, GIN_LEAF);
528529
MarkBufferDirty(RootBuffer);
529-
530-
/* XLOG the new pages */
531-
log_newpage(&index->rd_smgr->smgr_rnode.node, INIT_FORKNUM,
532-
BufferGetBlockNumber(MetaBuffer),
533-
BufferGetPage(MetaBuffer));
534-
log_newpage(&index->rd_smgr->smgr_rnode.node, INIT_FORKNUM,
535-
BufferGetBlockNumber(RootBuffer),
536-
BufferGetPage(RootBuffer));
530+
log_newpage_buffer(RootBuffer);
537531
END_CRIT_SECTION();
538532

539533
/* Unlock and release the buffers. */

src/backend/access/heap/heapam.c

Lines changed: 50 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4479,10 +4479,9 @@ log_heap_update(Relation reln, Buffer oldbuf, ItemPointerData from,
44794479
* Perform XLogInsert of a HEAP_NEWPAGE record to WAL. Caller is responsible
44804480
* for writing the page to disk after calling this routine.
44814481
*
4482-
* Note: all current callers build pages in private memory and write them
4483-
* directly to smgr, rather than using bufmgr. Therefore there is no need
4484-
* to pass a buffer ID to XLogInsert, nor to perform MarkBufferDirty within
4485-
* the critical section.
4482+
* Note: If you're using this function, you should be building pages in private
4483+
* memory and writing them directly to smgr. If you're using buffers, call
4484+
* log_newpage_buffer instead.
44864485
*
44874486
* Note: the NEWPAGE log record is used for both heaps and indexes, so do
44884487
* not do anything that assumes we are touching a heap.
@@ -4529,6 +4528,53 @@ log_newpage(RelFileNode *rnode, ForkNumber forkNum, BlockNumber blkno,
45294528
return recptr;
45304529
}
45314530

4531+
/*
4532+
* Perform XLogInsert of a HEAP_NEWPAGE record to WAL.
4533+
*
4534+
* Caller should initialize the buffer and mark it dirty before calling this
4535+
* function. This function will set the page LSN and TLI.
4536+
*
4537+
* Note: the NEWPAGE log record is used for both heaps and indexes, so do
4538+
* not do anything that assumes we are touching a heap.
4539+
*/
4540+
XLogRecPtr
4541+
log_newpage_buffer(Buffer buffer)
4542+
{
4543+
xl_heap_newpage xlrec;
4544+
XLogRecPtr recptr;
4545+
XLogRecData rdata[2];
4546+
Page page = BufferGetPage(buffer);
4547+
4548+
/* We should be in a critical section. */
4549+
Assert(CritSectionCount > 0);
4550+
4551+
BufferGetTag(buffer, &xlrec.node, &xlrec.forknum, &xlrec.blkno);
4552+
4553+
rdata[0].data = (char *) &xlrec;
4554+
rdata[0].len = SizeOfHeapNewpage;
4555+
rdata[0].buffer = InvalidBuffer;
4556+
rdata[0].next = &(rdata[1]);
4557+
4558+
rdata[1].data = page;
4559+
rdata[1].len = BLCKSZ;
4560+
rdata[1].buffer = InvalidBuffer;
4561+
rdata[1].next = NULL;
4562+
4563+
recptr = XLogInsert(RM_HEAP_ID, XLOG_HEAP_NEWPAGE, rdata);
4564+
4565+
/*
4566+
* The page may be uninitialized. If so, we can't set the LSN and TLI
4567+
* because that would corrupt the page.
4568+
*/
4569+
if (!PageIsNew(page))
4570+
{
4571+
PageSetLSN(page, recptr);
4572+
PageSetTLI(page, ThisTimeLineID);
4573+
}
4574+
4575+
return recptr;
4576+
}
4577+
45324578
/*
45334579
* Handles CLEANUP_INFO
45344580
*/

src/include/access/heapam.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -144,6 +144,7 @@ extern XLogRecPtr log_heap_visible(RelFileNode rnode, BlockNumber block,
144144
Buffer vm_buffer, TransactionId cutoff_xid);
145145
extern XLogRecPtr log_newpage(RelFileNode *rnode, ForkNumber forkNum,
146146
BlockNumber blk, Page page);
147+
extern XLogRecPtr log_newpage_buffer(Buffer buffer);
147148

148149
/* in heap/pruneheap.c */
149150
extern void heap_page_prune_opt(Relation relation, Buffer buffer,

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy