From: Robert Haas Date: Tue, 12 Jun 2012 12:50:57 +0000 (-0400) Subject: spgist metapages. X-Git-Url: http://git.postgresql.org/gitweb/static/main.js?a=commitdiff_plain;h=06918c7db99576a96d7d943ac3fc7c5fd64db27a;p=users%2Frhaas%2Fpostgres.git spgist metapages. This constitutes a WAL format change for XLOG_SPGIST_CREATE_INDEX. --- diff --git a/src/backend/access/spgist/spginsert.c b/src/backend/access/spgist/spginsert.c index 456a71fbba..b110e8e6c4 100644 --- a/src/backend/access/spgist/spginsert.c +++ b/src/backend/access/spgist/spginsert.c @@ -82,7 +82,7 @@ spgbuild(PG_FUNCTION_ARGS) START_CRIT_SECTION(); - SpGistInitMetapage(BufferGetPage(metabuffer)); + SpGistInitMetapage(index, BufferGetPage(metabuffer)); MarkBufferDirty(metabuffer); SpGistInitBuffer(rootbuffer, SPGIST_LEAF); MarkBufferDirty(rootbuffer); @@ -94,7 +94,10 @@ spgbuild(PG_FUNCTION_ARGS) XLogRecPtr recptr; XLogRecData rdata; - /* WAL data is just the relfilenode */ + /* log image of metabuffer */ + log_newpage_buffer(metabuffer); + + /* WAL data for root and null buffers is just the relfilenode */ rdata.data = (char *) &(index->rd_node); rdata.len = sizeof(RelFileNode); rdata.buffer = InvalidBuffer; @@ -102,8 +105,6 @@ spgbuild(PG_FUNCTION_ARGS) recptr = XLogInsert(RM_SPGIST_ID, XLOG_SPGIST_CREATE_INDEX, &rdata); - PageSetLSN(BufferGetPage(metabuffer), recptr); - PageSetTLI(BufferGetPage(metabuffer), ThisTimeLineID); PageSetLSN(BufferGetPage(rootbuffer), recptr); PageSetTLI(BufferGetPage(rootbuffer), ThisTimeLineID); PageSetLSN(BufferGetPage(nullbuffer), recptr); @@ -152,7 +153,7 @@ spgbuildempty(PG_FUNCTION_ARGS) /* Construct metapage. */ page = (Page) palloc(BLCKSZ); - SpGistInitMetapage(page); + SpGistInitMetapage(index, page); /* Write the page. If archiving/streaming, XLOG it. */ smgrwrite(index->rd_smgr, INIT_FORKNUM, SPGIST_METAPAGE_BLKNO, diff --git a/src/backend/access/spgist/spgutils.c b/src/backend/access/spgist/spgutils.c index d56c2325fe..547cfd3188 100644 --- a/src/backend/access/spgist/spgutils.c +++ b/src/backend/access/spgist/spgutils.c @@ -471,12 +471,13 @@ SpGistInitBuffer(Buffer b, uint16 f) * Initialize metadata page */ void -SpGistInitMetapage(Page page) +SpGistInitMetapage(Relation index, Page page) { SpGistMetaPageData *metadata; int i; SpGistInitPage(page, SPGIST_META); + MetapageInit(index, page); metadata = SpGistPageGetMeta(page); memset(metadata, 0, sizeof(SpGistMetaPageData)); metadata->magicNumber = SPGIST_MAGIC_NUMBER; diff --git a/src/backend/access/spgist/spgxlog.c b/src/backend/access/spgist/spgxlog.c index 82f8c8b978..9c537b3327 100644 --- a/src/backend/access/spgist/spgxlog.c +++ b/src/backend/access/spgist/spgxlog.c @@ -75,15 +75,6 @@ spgRedoCreateIndex(XLogRecPtr lsn, XLogRecord *record) Buffer buffer; Page page; - buffer = XLogReadBuffer(*node, SPGIST_METAPAGE_BLKNO, true); - Assert(BufferIsValid(buffer)); - page = (Page) BufferGetPage(buffer); - SpGistInitMetapage(page); - PageSetLSN(page, lsn); - PageSetTLI(page, ThisTimeLineID); - MarkBufferDirty(buffer); - UnlockReleaseBuffer(buffer); - buffer = XLogReadBuffer(*node, SPGIST_ROOT_BLKNO, true); Assert(BufferIsValid(buffer)); SpGistInitBuffer(buffer, SPGIST_LEAF); diff --git a/src/include/access/spgist_private.h b/src/include/access/spgist_private.h index bc068b9579..4fd20d49c3 100644 --- a/src/include/access/spgist_private.h +++ b/src/include/access/spgist_private.h @@ -625,7 +625,7 @@ extern Buffer SpGistGetBuffer(Relation index, int flags, extern void SpGistSetLastUsedPage(Relation index, Buffer buffer); extern void SpGistInitPage(Page page, uint16 f); extern void SpGistInitBuffer(Buffer b, uint16 f); -extern void SpGistInitMetapage(Page page); +extern void SpGistInitMetapage(Relation index, Page page); extern unsigned int SpGistGetTypeSize(SpGistTypeDesc *att, Datum datum); extern SpGistLeafTuple spgFormLeafTuple(SpGistState *state, ItemPointer heapPtr,