From 5cab276a9b91848341bb96ab96c170cecd65f0bd Mon Sep 17 00:00:00 2001 From: Robert Haas Date: Wed, 13 Jun 2012 15:49:15 -0400 Subject: [PATCH] Rejigger metadata creation. --- src/backend/access/common/metapage.c | 27 +++++++++++++++++++++++++-- src/backend/utils/cache/relcache.c | 5 +++++ src/include/access/metapage.h | 1 + 3 files changed, 31 insertions(+), 2 deletions(-) diff --git a/src/backend/access/common/metapage.c b/src/backend/access/common/metapage.c index b143c55e77..f311eb91e1 100644 --- a/src/backend/access/common/metapage.c +++ b/src/backend/access/common/metapage.c @@ -38,9 +38,29 @@ MetapageInit(Relation relation, Page page) { RelationMetapage meta; + if (relation->rd_metapage == NULL) + RelationBuildMetadata(relation); PageSetRelationMetapage(page); - meta = BlindGetRelationMeta(page); + memcpy(meta, relation->rd_metapage, sizeof(RelationMetapageData)); +} + +/* + * Build metadata for a new relation. + */ +void +RelationBuildMetadata(Relation relation) +{ + RelationMetapage meta; + + /* The metadata shouldn't already be initialized. */ + Assert(relation->rd_metapage == NULL); + + /* Allocate memory for the data. */ + meta = (RelationMetapage) MemoryContextAllocZero(CacheMemoryContext, + sizeof(RelationMetapageData)); + + /* Initialize. */ meta->rmp_magic = METAPAGE_MAGIC; meta->rmp_version = METAPAGE_VERSION; meta->rmp_dboid = relation->rd_node.dbNode; @@ -51,6 +71,9 @@ MetapageInit(Relation relation, Page page) meta->rmp_minlayout = PG_PAGE_LAYOUT_VERSION; meta->rmp_maxlayout = PG_PAGE_LAYOUT_VERSION; meta->rmp_relfilenode_time = (pg_time_t) time(NULL); + + /* Save it. */ + relation->rd_metapage = meta; } /* @@ -75,7 +98,7 @@ RelationGetMetadata(Relation relation) * If the relation has a metapage, read it. * * XXX: It's pretty annoying to have to call RelationGetNumberOfBlocks. - * Can't we have an RBM_ERROR option for ReadBufferExtended? + * Can't we have an RBM_FAIL option for ReadBufferExtended? */ if (RelationGetNumberOfBlocks(relation) > METAPAGE_BLKNO) { diff --git a/src/backend/utils/cache/relcache.c b/src/backend/utils/cache/relcache.c index 65e4372b11..685955e58b 100644 --- a/src/backend/utils/cache/relcache.c +++ b/src/backend/utils/cache/relcache.c @@ -30,6 +30,7 @@ #include #include +#include "access/metapage.h" #include "access/reloptions.h" #include "access/sysattr.h" #include "access/transam.h" @@ -2587,6 +2588,10 @@ RelationBuildLocalRelation(const char *relname, RelationInitPhysicalAddr(rel); + /* XXX: Not for heaps yet. */ + if (relkind == RELKIND_INDEX) + RelationBuildMetadata(rel); + /* * Okay to insert into the relcache hash tables. */ diff --git a/src/include/access/metapage.h b/src/include/access/metapage.h index 65c68bdabd..a119dc4dc6 100644 --- a/src/include/access/metapage.h +++ b/src/include/access/metapage.h @@ -72,6 +72,7 @@ typedef RelationMetapageData *RelationMetapage; * Function prototypes. */ extern void MetapageInit(Relation relation, Page page); +extern void RelationBuildMetadata(Relation relation); extern RelationMetapage RelationGetMetadata(Relation rel); /* -- 2.39.5