From: Robert Haas Date: Thu, 7 Jun 2012 22:03:51 +0000 (-0400) Subject: New-style metapage for GIN, using log_newpage_buffer. X-Git-Url: http://git.postgresql.org/gitweb/static/developers.postgresql.org?a=commitdiff_plain;h=4de3f52fb89e771f45e8b6311aacb6aef855b874;p=users%2Frhaas%2Fpostgres.git New-style metapage for GIN, using log_newpage_buffer. --- diff --git a/src/backend/access/gin/gininsert.c b/src/backend/access/gin/gininsert.c index 2f95f718e0..01c6153c44 100644 --- a/src/backend/access/gin/gininsert.c +++ b/src/backend/access/gin/gininsert.c @@ -410,31 +410,15 @@ ginbuild(PG_FUNCTION_ARGS) RootBuffer = GinNewBuffer(index); START_CRIT_SECTION(); - GinInitMetabuffer(MetaBuffer); + GinInitMetabuffer(index, MetaBuffer); MarkBufferDirty(MetaBuffer); GinInitBuffer(RootBuffer, GIN_LEAF); MarkBufferDirty(RootBuffer); if (RelationNeedsWAL(index)) { - XLogRecPtr recptr; - XLogRecData rdata; - Page page; - - rdata.buffer = InvalidBuffer; - rdata.data = (char *) &(index->rd_node); - rdata.len = sizeof(RelFileNode); - rdata.next = NULL; - - recptr = XLogInsert(RM_GIN_ID, XLOG_GIN_CREATE_INDEX, &rdata); - - page = BufferGetPage(RootBuffer); - PageSetLSN(page, recptr); - PageSetTLI(page, ThisTimeLineID); - - page = BufferGetPage(MetaBuffer); - PageSetLSN(page, recptr); - PageSetTLI(page, ThisTimeLineID); + log_newpage_buffer(MetaBuffer); + log_newpage_buffer(RootBuffer); } UnlockReleaseBuffer(MetaBuffer); @@ -522,7 +506,7 @@ ginbuildempty(PG_FUNCTION_ARGS) /* Initialize and xlog metabuffer and root buffer. */ START_CRIT_SECTION(); - GinInitMetabuffer(MetaBuffer); + GinInitMetabuffer(index, MetaBuffer); MarkBufferDirty(MetaBuffer); log_newpage_buffer(MetaBuffer); GinInitBuffer(RootBuffer, GIN_LEAF); diff --git a/src/backend/access/gin/ginutil.c b/src/backend/access/gin/ginutil.c index e47abee4b7..bdc33c2844 100644 --- a/src/backend/access/gin/ginutil.c +++ b/src/backend/access/gin/ginutil.c @@ -253,12 +253,13 @@ GinInitBuffer(Buffer b, uint32 f) } void -GinInitMetabuffer(Buffer b) +GinInitMetabuffer(Relation rel, Buffer b) { GinMetaPageData *metadata; Page page = BufferGetPage(b); GinInitPage(page, GIN_META, BufferGetPageSize(b)); + MetapageInit(rel, page); metadata = GinPageGetMeta(page); diff --git a/src/backend/access/gin/ginxlog.c b/src/backend/access/gin/ginxlog.c index 250619cb2c..ab89e86969 100644 --- a/src/backend/access/gin/ginxlog.c +++ b/src/backend/access/gin/ginxlog.c @@ -69,38 +69,6 @@ forgetIncompleteSplit(RelFileNode node, BlockNumber leftBlkno, BlockNumber updat } } -static void -ginRedoCreateIndex(XLogRecPtr lsn, XLogRecord *record) -{ - RelFileNode *node = (RelFileNode *) XLogRecGetData(record); - Buffer RootBuffer, - MetaBuffer; - Page page; - - MetaBuffer = XLogReadBuffer(*node, GIN_METAPAGE_BLKNO, true); - Assert(BufferIsValid(MetaBuffer)); - page = (Page) BufferGetPage(MetaBuffer); - - GinInitMetabuffer(MetaBuffer); - - PageSetLSN(page, lsn); - PageSetTLI(page, ThisTimeLineID); - MarkBufferDirty(MetaBuffer); - - RootBuffer = XLogReadBuffer(*node, GIN_ROOT_BLKNO, true); - Assert(BufferIsValid(RootBuffer)); - page = (Page) BufferGetPage(RootBuffer); - - GinInitBuffer(RootBuffer, GIN_LEAF); - - PageSetLSN(page, lsn); - PageSetTLI(page, ThisTimeLineID); - MarkBufferDirty(RootBuffer); - - UnlockReleaseBuffer(RootBuffer); - UnlockReleaseBuffer(MetaBuffer); -} - static void ginRedoCreatePTree(XLogRecPtr lsn, XLogRecord *record) { @@ -683,9 +651,6 @@ gin_redo(XLogRecPtr lsn, XLogRecord *record) topCtx = MemoryContextSwitchTo(opCtx); switch (info) { - case XLOG_GIN_CREATE_INDEX: - ginRedoCreateIndex(lsn, record); - break; case XLOG_GIN_CREATE_PTREE: ginRedoCreatePTree(lsn, record); break; @@ -731,10 +696,6 @@ gin_desc(StringInfo buf, uint8 xl_info, char *rec) switch (info) { - case XLOG_GIN_CREATE_INDEX: - appendStringInfo(buf, "Create index, "); - desc_node(buf, *(RelFileNode *) rec, GIN_ROOT_BLKNO); - break; case XLOG_GIN_CREATE_PTREE: appendStringInfo(buf, "Create posting tree, "); desc_node(buf, ((ginxlogCreatePostingTree *) rec)->node, ((ginxlogCreatePostingTree *) rec)->blkno); diff --git a/src/include/access/gin_private.h b/src/include/access/gin_private.h index dc4a35ffe7..5f336998af 100644 --- a/src/include/access/gin_private.h +++ b/src/include/access/gin_private.h @@ -315,7 +315,7 @@ typedef struct GinState /* XLog stuff */ -#define XLOG_GIN_CREATE_INDEX 0x00 +/* 0x00 is free, was XLOG_GIN_CREATE_INDEX */ #define XLOG_GIN_CREATE_PTREE 0x10 @@ -434,7 +434,7 @@ extern void initGinState(GinState *state, Relation index); extern Buffer GinNewBuffer(Relation index); extern void GinInitBuffer(Buffer b, uint32 f); extern void GinInitPage(Page page, uint32 f, Size pageSize); -extern void GinInitMetabuffer(Buffer b); +extern void GinInitMetabuffer(Relation rel, Buffer b); extern int ginCompareEntries(GinState *ginstate, OffsetNumber attnum, Datum a, GinNullCategory categorya, Datum b, GinNullCategory categoryb);