New-style metapage for GIN, using log_newpage_buffer.
authorRobert Haas <rhaas@postgresql.org>
Thu, 7 Jun 2012 22:03:51 +0000 (18:03 -0400)
committerRobert Haas <rhaas@postgresql.org>
Thu, 14 Jun 2012 14:33:04 +0000 (10:33 -0400)
src/backend/access/gin/gininsert.c
src/backend/access/gin/ginutil.c
src/backend/access/gin/ginxlog.c
src/include/access/gin_private.h

index 2f95f718e0bf17e3ba9819f4621de6ce19df0041..01c6153c44a7d045bc7c278221861092f2194fec 100644 (file)
@@ -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);
index e47abee4b7963080baa89d3f2894f2e6e2e56c04..bdc33c284484315780a3177cafd537cd61ec2f71 100644 (file)
@@ -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);
 
index 250619cb2c13798ee87bf2e8b13bdca0bd870945..ab89e869697370d2e28c42b814b5212ee98826b7 100644 (file)
@@ -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);
index dc4a35ffe714fa5b34ce5450fbe26288f80b541d..5f336998af6de7f21d253c6cda631733965433ae 100644 (file)
@@ -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);