diff options
Diffstat (limited to 'src/backend/access/brin')
| -rw-r--r-- | src/backend/access/brin/brin.c | 11 | ||||
| -rw-r--r-- | src/backend/access/brin/brin_pageops.c | 97 | ||||
| -rw-r--r-- | src/backend/access/brin/brin_revmap.c | 23 | ||||
| -rw-r--r-- | src/backend/access/brin/brin_xlog.c | 111 |
4 files changed, 93 insertions, 149 deletions
diff --git a/src/backend/access/brin/brin.c b/src/backend/access/brin/brin.c index bd35cf6696a..cb645e3d459 100644 --- a/src/backend/access/brin/brin.c +++ b/src/backend/access/brin/brin.c @@ -666,19 +666,16 @@ brinbuild(PG_FUNCTION_ARGS) { xl_brin_createidx xlrec; XLogRecPtr recptr; - XLogRecData rdata; Page page; - xlrec.node = index->rd_node; xlrec.version = BRIN_CURRENT_VERSION; xlrec.pagesPerRange = BrinGetPagesPerRange(index); - rdata.buffer = InvalidBuffer; - rdata.data = (char *) &xlrec; - rdata.len = SizeOfBrinCreateIdx; - rdata.next = NULL; + XLogBeginInsert(); + XLogRegisterData((char *) &xlrec, SizeOfBrinCreateIdx); + XLogRegisterBuffer(0, meta, REGBUF_WILL_INIT); - recptr = XLogInsert(RM_BRIN_ID, XLOG_BRIN_CREATE_INDEX, &rdata); + recptr = XLogInsert(RM_BRIN_ID, XLOG_BRIN_CREATE_INDEX); page = BufferGetPage(meta); PageSetLSN(page, recptr); diff --git a/src/backend/access/brin/brin_pageops.c b/src/backend/access/brin/brin_pageops.c index 50f1dec1631..0b6fbeb603c 100644 --- a/src/backend/access/brin/brin_pageops.c +++ b/src/backend/access/brin/brin_pageops.c @@ -140,27 +140,19 @@ brin_doupdate(Relation idxrel, BlockNumber pagesPerRange, /* XLOG stuff */ if (RelationNeedsWAL(idxrel)) { - BlockNumber blk = BufferGetBlockNumber(oldbuf); xl_brin_samepage_update xlrec; XLogRecPtr recptr; - XLogRecData rdata[2]; uint8 info = XLOG_BRIN_SAMEPAGE_UPDATE; - xlrec.node = idxrel->rd_node; - ItemPointerSetBlockNumber(&xlrec.tid, blk); - ItemPointerSetOffsetNumber(&xlrec.tid, oldoff); - rdata[0].data = (char *) &xlrec; - rdata[0].len = SizeOfBrinSamepageUpdate; - rdata[0].buffer = InvalidBuffer; - rdata[0].next = &(rdata[1]); + xlrec.offnum = oldoff; - rdata[1].data = (char *) newtup; - rdata[1].len = newsz; - rdata[1].buffer = oldbuf; - rdata[1].buffer_std = true; - rdata[1].next = NULL; + XLogBeginInsert(); + XLogRegisterData((char *) &xlrec, SizeOfBrinSamepageUpdate); - recptr = XLogInsert(RM_BRIN_ID, info, rdata); + XLogRegisterBuffer(0, oldbuf, REGBUF_STANDARD); + XLogRegisterBufData(0, (char *) newtup, newsz); + + recptr = XLogInsert(RM_BRIN_ID, info); PageSetLSN(oldpage, recptr); } @@ -211,43 +203,30 @@ brin_doupdate(Relation idxrel, BlockNumber pagesPerRange, { xl_brin_update xlrec; XLogRecPtr recptr; - XLogRecData rdata[4]; uint8 info; info = XLOG_BRIN_UPDATE | (extended ? XLOG_BRIN_INIT_PAGE : 0); - xlrec.insert.node = idxrel->rd_node; - ItemPointerSet(&xlrec.insert.tid, BufferGetBlockNumber(newbuf), newoff); + xlrec.insert.offnum = newoff; xlrec.insert.heapBlk = heapBlk; - xlrec.insert.tuplen = newsz; - xlrec.insert.revmapBlk = BufferGetBlockNumber(revmapbuf); xlrec.insert.pagesPerRange = pagesPerRange; - ItemPointerSet(&xlrec.oldtid, BufferGetBlockNumber(oldbuf), oldoff); + xlrec.oldOffnum = oldoff; + + XLogBeginInsert(); - rdata[0].data = (char *) &xlrec; - rdata[0].len = SizeOfBrinUpdate; - rdata[0].buffer = InvalidBuffer; - rdata[0].next = &(rdata[1]); + /* new page */ + XLogRegisterData((char *) &xlrec, SizeOfBrinUpdate); - rdata[1].data = (char *) newtup; - rdata[1].len = newsz; - rdata[1].buffer = extended ? InvalidBuffer : newbuf; - rdata[1].buffer_std = true; - rdata[1].next = &(rdata[2]); + XLogRegisterBuffer(0, newbuf, REGBUF_STANDARD | (extended ? REGBUF_WILL_INIT : 0)); + XLogRegisterBufData(0, (char *) newtup, newsz); - rdata[2].data = (char *) NULL; - rdata[2].len = 0; - rdata[2].buffer = revmapbuf; - rdata[2].buffer_std = true; - rdata[2].next = &(rdata[3]); + /* revmap page */ + XLogRegisterBuffer(1, revmapbuf, REGBUF_STANDARD); - rdata[3].data = (char *) NULL; - rdata[3].len = 0; - rdata[3].buffer = oldbuf; - rdata[3].buffer_std = true; - rdata[3].next = NULL; + /* old page */ + XLogRegisterBuffer(2, oldbuf, REGBUF_STANDARD); - recptr = XLogInsert(RM_BRIN_ID, info, rdata); + recptr = XLogInsert(RM_BRIN_ID, info); PageSetLSN(oldpage, recptr); PageSetLSN(newpage, recptr); @@ -354,36 +333,22 @@ brin_doinsert(Relation idxrel, BlockNumber pagesPerRange, { xl_brin_insert xlrec; XLogRecPtr recptr; - XLogRecData rdata[3]; uint8 info; info = XLOG_BRIN_INSERT | (extended ? XLOG_BRIN_INIT_PAGE : 0); - xlrec.node = idxrel->rd_node; xlrec.heapBlk = heapBlk; xlrec.pagesPerRange = pagesPerRange; - xlrec.revmapBlk = BufferGetBlockNumber(revmapbuf); - xlrec.tuplen = itemsz; - ItemPointerSet(&xlrec.tid, blk, off); - - rdata[0].data = (char *) &xlrec; - rdata[0].len = SizeOfBrinInsert; - rdata[0].buffer = InvalidBuffer; - rdata[0].buffer_std = false; - rdata[0].next = &(rdata[1]); - - rdata[1].data = (char *) tup; - rdata[1].len = itemsz; - rdata[1].buffer = extended ? InvalidBuffer : *buffer; - rdata[1].buffer_std = true; - rdata[1].next = &(rdata[2]); - - rdata[2].data = (char *) NULL; - rdata[2].len = 0; - rdata[2].buffer = revmapbuf; - rdata[2].buffer_std = false; - rdata[2].next = NULL; - - recptr = XLogInsert(RM_BRIN_ID, info, rdata); + xlrec.offnum = off; + + XLogBeginInsert(); + XLogRegisterData((char *) &xlrec, SizeOfBrinInsert); + + XLogRegisterBuffer(0, *buffer, REGBUF_STANDARD | (extended ? REGBUF_WILL_INIT : 0)); + XLogRegisterBufData(0, (char *) tup, itemsz); + + XLogRegisterBuffer(1, revmapbuf, 0); + + recptr = XLogInsert(RM_BRIN_ID, info); PageSetLSN(page, recptr); PageSetLSN(BufferGetPage(revmapbuf), recptr); diff --git a/src/backend/access/brin/brin_revmap.c b/src/backend/access/brin/brin_revmap.c index 272c74e6b6e..adc7d0b8473 100644 --- a/src/backend/access/brin/brin_revmap.c +++ b/src/backend/access/brin/brin_revmap.c @@ -477,23 +477,16 @@ revmap_physical_extend(BrinRevmap *revmap) { xl_brin_revmap_extend xlrec; XLogRecPtr recptr; - XLogRecData rdata[2]; - xlrec.node = revmap->rm_irel->rd_node; xlrec.targetBlk = mapBlk; - rdata[0].data = (char *) &xlrec; - rdata[0].len = SizeOfBrinRevmapExtend; - rdata[0].buffer = InvalidBuffer; - rdata[0].buffer_std = false; - rdata[0].next = &(rdata[1]); - - rdata[1].data = (char *) NULL; - rdata[1].len = 0; - rdata[1].buffer = revmap->rm_metaBuf; - rdata[1].buffer_std = false; - rdata[1].next = NULL; - - recptr = XLogInsert(RM_BRIN_ID, XLOG_BRIN_REVMAP_EXTEND, rdata); + + XLogBeginInsert(); + XLogRegisterData((char *) &xlrec, SizeOfBrinRevmapExtend); + XLogRegisterBuffer(0, revmap->rm_metaBuf, 0); + + XLogRegisterBuffer(1, buf, REGBUF_WILL_INIT); + + recptr = XLogInsert(RM_BRIN_ID, XLOG_BRIN_REVMAP_EXTEND); PageSetLSN(metapage, recptr); PageSetLSN(page, recptr); } diff --git a/src/backend/access/brin/brin_xlog.c b/src/backend/access/brin/brin_xlog.c index 29370689a70..e6a17509753 100644 --- a/src/backend/access/brin/brin_xlog.c +++ b/src/backend/access/brin/brin_xlog.c @@ -20,17 +20,15 @@ * xlog replay routines */ static void -brin_xlog_createidx(XLogRecPtr lsn, XLogRecord *record) +brin_xlog_createidx(XLogReaderState *record) { + XLogRecPtr lsn = record->EndRecPtr; xl_brin_createidx *xlrec = (xl_brin_createidx *) XLogRecGetData(record); Buffer buf; Page page; - /* Backup blocks are not used in create_index records */ - Assert(!(record->xl_info & XLR_BKP_BLOCK_MASK)); - /* create the index' metapage */ - buf = XLogReadBuffer(xlrec->node, BRIN_METAPAGE_BLKNO, true); + buf = XLogInitBufferForRedo(record, 0); Assert(BufferIsValid(buf)); page = (Page) BufferGetPage(buf); brin_metapage_init(page, xlrec->pagesPerRange, xlrec->version); @@ -44,51 +42,47 @@ brin_xlog_createidx(XLogRecPtr lsn, XLogRecord *record) * revmap. */ static void -brin_xlog_insert_update(XLogRecPtr lsn, XLogRecord *record, - xl_brin_insert *xlrec, BrinTuple *tuple) +brin_xlog_insert_update(XLogReaderState *record, + xl_brin_insert *xlrec) { - BlockNumber blkno; + XLogRecPtr lsn = record->EndRecPtr; Buffer buffer; Page page; XLogRedoAction action; - blkno = ItemPointerGetBlockNumber(&xlrec->tid); - /* * If we inserted the first and only tuple on the page, re-initialize the * page from scratch. */ - if (record->xl_info & XLOG_BRIN_INIT_PAGE) + if (XLogRecGetInfo(record) & XLOG_BRIN_INIT_PAGE) { - /* - * No full-page image here. Don't try to read it, because there - * might be one for the revmap buffer, below. - */ - buffer = XLogReadBuffer(xlrec->node, blkno, true); + buffer = XLogInitBufferForRedo(record, 0); page = BufferGetPage(buffer); brin_page_init(page, BRIN_PAGETYPE_REGULAR); action = BLK_NEEDS_REDO; } else { - action = XLogReadBufferForRedo(lsn, record, 0, - xlrec->node, blkno, &buffer); + action = XLogReadBufferForRedo(record, 0, &buffer); } /* insert the index item into the page */ if (action == BLK_NEEDS_REDO) { OffsetNumber offnum; + BrinTuple *tuple; + Size tuplen; + + tuple = (BrinTuple *) XLogRecGetBlockData(record, 0, &tuplen); Assert(tuple->bt_blkno == xlrec->heapBlk); page = (Page) BufferGetPage(buffer); - offnum = ItemPointerGetOffsetNumber(&(xlrec->tid)); + offnum = xlrec->offnum; if (PageGetMaxOffsetNumber(page) + 1 < offnum) elog(PANIC, "brin_xlog_insert_update: invalid max offset number"); - offnum = PageAddItem(page, (Item) tuple, xlrec->tuplen, offnum, true, - false); + offnum = PageAddItem(page, (Item) tuple, tuplen, offnum, true, false); if (offnum == InvalidOffsetNumber) elog(PANIC, "brin_xlog_insert_update: failed to add tuple"); @@ -99,16 +93,17 @@ brin_xlog_insert_update(XLogRecPtr lsn, XLogRecord *record, UnlockReleaseBuffer(buffer); /* update the revmap */ - action = XLogReadBufferForRedo(lsn, record, - record->xl_info & XLOG_BRIN_INIT_PAGE ? 0 : 1, - xlrec->node, - xlrec->revmapBlk, &buffer); + action = XLogReadBufferForRedo(record, 1, &buffer); if (action == BLK_NEEDS_REDO) { + ItemPointerData tid; + BlockNumber blkno = BufferGetBlockNumber(buffer); + + ItemPointerSet(&tid, blkno, xlrec->offnum); page = (Page) BufferGetPage(buffer); brinSetHeapBlockItemptr(buffer, xlrec->pagesPerRange, xlrec->heapBlk, - xlrec->tid); + tid); PageSetLSN(page, lsn); MarkBufferDirty(buffer); } @@ -122,34 +117,26 @@ brin_xlog_insert_update(XLogRecPtr lsn, XLogRecord *record, * replay a BRIN index insertion */ static void -brin_xlog_insert(XLogRecPtr lsn, XLogRecord *record) +brin_xlog_insert(XLogReaderState *record) { xl_brin_insert *xlrec = (xl_brin_insert *) XLogRecGetData(record); - BrinTuple *newtup; - newtup = (BrinTuple *) ((char *) xlrec + SizeOfBrinInsert); - - brin_xlog_insert_update(lsn, record, xlrec, newtup); + brin_xlog_insert_update(record, xlrec); } /* * replay a BRIN index update */ static void -brin_xlog_update(XLogRecPtr lsn, XLogRecord *record) +brin_xlog_update(XLogReaderState *record) { + XLogRecPtr lsn = record->EndRecPtr; xl_brin_update *xlrec = (xl_brin_update *) XLogRecGetData(record); - BlockNumber blkno; Buffer buffer; - BrinTuple *newtup; XLogRedoAction action; - newtup = (BrinTuple *) ((char *) xlrec + SizeOfBrinUpdate); - /* First remove the old tuple */ - blkno = ItemPointerGetBlockNumber(&(xlrec->oldtid)); - action = XLogReadBufferForRedo(lsn, record, 2, xlrec->insert.node, - blkno, &buffer); + action = XLogReadBufferForRedo(record, 2, &buffer); if (action == BLK_NEEDS_REDO) { Page page; @@ -157,7 +144,7 @@ brin_xlog_update(XLogRecPtr lsn, XLogRecord *record) page = (Page) BufferGetPage(buffer); - offnum = ItemPointerGetOffsetNumber(&(xlrec->oldtid)); + offnum = xlrec->oldOffnum; if (PageGetMaxOffsetNumber(page) + 1 < offnum) elog(PANIC, "brin_xlog_update: invalid max offset number"); @@ -168,7 +155,7 @@ brin_xlog_update(XLogRecPtr lsn, XLogRecord *record) } /* Then insert the new tuple and update revmap, like in an insertion. */ - brin_xlog_insert_update(lsn, record, &xlrec->insert, newtup); + brin_xlog_insert_update(record, &xlrec->insert); if (BufferIsValid(buffer)) UnlockReleaseBuffer(buffer); @@ -178,30 +165,27 @@ brin_xlog_update(XLogRecPtr lsn, XLogRecord *record) * Update a tuple on a single page. */ static void -brin_xlog_samepage_update(XLogRecPtr lsn, XLogRecord *record) +brin_xlog_samepage_update(XLogReaderState *record) { + XLogRecPtr lsn = record->EndRecPtr; xl_brin_samepage_update *xlrec; - BlockNumber blkno; Buffer buffer; XLogRedoAction action; xlrec = (xl_brin_samepage_update *) XLogRecGetData(record); - blkno = ItemPointerGetBlockNumber(&(xlrec->tid)); - action = XLogReadBufferForRedo(lsn, record, 0, xlrec->node, blkno, - &buffer); + action = XLogReadBufferForRedo(record, 0, &buffer); if (action == BLK_NEEDS_REDO) { - int tuplen; + Size tuplen; BrinTuple *mmtuple; Page page; OffsetNumber offnum; - tuplen = record->xl_len - SizeOfBrinSamepageUpdate; - mmtuple = (BrinTuple *) ((char *) xlrec + SizeOfBrinSamepageUpdate); + mmtuple = (BrinTuple *) XLogRecGetBlockData(record, 0, &tuplen); page = (Page) BufferGetPage(buffer); - offnum = ItemPointerGetOffsetNumber(&(xlrec->tid)); + offnum = xlrec->offnum; if (PageGetMaxOffsetNumber(page) + 1 < offnum) elog(PANIC, "brin_xlog_samepage_update: invalid max offset number"); @@ -223,18 +207,23 @@ brin_xlog_samepage_update(XLogRecPtr lsn, XLogRecord *record) * Replay a revmap page extension */ static void -brin_xlog_revmap_extend(XLogRecPtr lsn, XLogRecord *record) +brin_xlog_revmap_extend(XLogReaderState *record) { + XLogRecPtr lsn = record->EndRecPtr; xl_brin_revmap_extend *xlrec; Buffer metabuf; Buffer buf; Page page; + BlockNumber targetBlk; XLogRedoAction action; xlrec = (xl_brin_revmap_extend *) XLogRecGetData(record); + + XLogRecGetBlockTag(record, 1, NULL, NULL, &targetBlk); + Assert(xlrec->targetBlk == targetBlk); + /* Update the metapage */ - action = XLogReadBufferForRedo(lsn, record, 0, xlrec->node, - BRIN_METAPAGE_BLKNO, &metabuf); + action = XLogReadBufferForRedo(record, 0, &metabuf); if (action == BLK_NEEDS_REDO) { Page metapg; @@ -255,7 +244,7 @@ brin_xlog_revmap_extend(XLogRecPtr lsn, XLogRecord *record) * image here. */ - buf = XLogReadBuffer(xlrec->node, xlrec->targetBlk, true); + buf = XLogInitBufferForRedo(record, 1); page = (Page) BufferGetPage(buf); brin_page_init(page, BRIN_PAGETYPE_REVMAP); @@ -268,26 +257,26 @@ brin_xlog_revmap_extend(XLogRecPtr lsn, XLogRecord *record) } void -brin_redo(XLogRecPtr lsn, XLogRecord *record) +brin_redo(XLogReaderState *record) { - uint8 info = record->xl_info & ~XLR_INFO_MASK; + uint8 info = XLogRecGetInfo(record) & ~XLR_INFO_MASK; switch (info & XLOG_BRIN_OPMASK) { case XLOG_BRIN_CREATE_INDEX: - brin_xlog_createidx(lsn, record); + brin_xlog_createidx(record); break; case XLOG_BRIN_INSERT: - brin_xlog_insert(lsn, record); + brin_xlog_insert(record); break; case XLOG_BRIN_UPDATE: - brin_xlog_update(lsn, record); + brin_xlog_update(record); break; case XLOG_BRIN_SAMEPAGE_UPDATE: - brin_xlog_samepage_update(lsn, record); + brin_xlog_samepage_update(record); break; case XLOG_BRIN_REVMAP_EXTEND: - brin_xlog_revmap_extend(lsn, record); + brin_xlog_revmap_extend(record); break; default: elog(PANIC, "brin_redo: unknown op code %u", info); |
