aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/backend/access/nbtree/nbtpage.c52
-rw-r--r--src/backend/access/nbtree/nbtxlog.c2
-rw-r--r--src/include/access/nbtree.h4
3 files changed, 13 insertions, 45 deletions
diff --git a/src/backend/access/nbtree/nbtpage.c b/src/backend/access/nbtree/nbtpage.c
index 4082103fe2d..bc791761459 100644
--- a/src/backend/access/nbtree/nbtpage.c
+++ b/src/backend/access/nbtree/nbtpage.c
@@ -33,7 +33,6 @@
#include "storage/predicate.h"
#include "utils/snapmgr.h"
-static void _bt_cachemetadata(Relation rel, BTMetaPageData *metad);
static bool _bt_mark_page_halfdead(Relation rel, Buffer buf, BTStack stack);
static bool _bt_unlink_halfdead_page(Relation rel, Buffer leafbuf,
bool *rightsib_empty);
@@ -107,44 +106,6 @@ _bt_upgrademetapage(Page page)
}
/*
- * Cache metadata from meta page to rel->rd_amcache.
- */
-static void
-_bt_cachemetadata(Relation rel, BTMetaPageData *metad)
-{
- /* We assume rel->rd_amcache was already freed by caller */
- Assert(rel->rd_amcache == NULL);
- rel->rd_amcache = MemoryContextAlloc(rel->rd_indexcxt,
- sizeof(BTMetaPageData));
-
- /*
- * Meta page should be of supported version (should be already checked by
- * caller).
- */
- Assert(metad->btm_version >= BTREE_MIN_VERSION &&
- metad->btm_version <= BTREE_VERSION);
-
- if (metad->btm_version == BTREE_VERSION)
- {
- /* Last version of meta-data, no need to upgrade */
- memcpy(rel->rd_amcache, metad, sizeof(BTMetaPageData));
- }
- else
- {
- BTMetaPageData *cached_metad = (BTMetaPageData *) rel->rd_amcache;
-
- /*
- * Upgrade meta-data: copy available information from meta-page and
- * fill new fields with default values.
- */
- memcpy(rel->rd_amcache, metad, offsetof(BTMetaPageData, btm_oldest_btpo_xact));
- cached_metad->btm_version = BTREE_VERSION;
- cached_metad->btm_oldest_btpo_xact = InvalidTransactionId;
- cached_metad->btm_last_cleanup_num_heap_tuples = -1.0;
- }
-}
-
-/*
* _bt_update_meta_cleanup_info() -- Update cleanup-related information in
* the metapage.
*
@@ -442,7 +403,9 @@ _bt_getroot(Relation rel, int access)
/*
* Cache the metapage data for next time
*/
- _bt_cachemetadata(rel, metad);
+ rel->rd_amcache = MemoryContextAlloc(rel->rd_indexcxt,
+ sizeof(BTMetaPageData));
+ memcpy(rel->rd_amcache, metad, sizeof(BTMetaPageData));
/*
* We are done with the metapage; arrange to release it via first
@@ -641,15 +604,18 @@ _bt_getrootheight(Relation rel)
/*
* Cache the metapage data for next time
*/
- _bt_cachemetadata(rel, metad);
-
+ rel->rd_amcache = MemoryContextAlloc(rel->rd_indexcxt,
+ sizeof(BTMetaPageData));
+ memcpy(rel->rd_amcache, metad, sizeof(BTMetaPageData));
_bt_relbuf(rel, metabuf);
}
+ /* Get cached page */
metad = (BTMetaPageData *) rel->rd_amcache;
/* We shouldn't have cached it if any of these fail */
Assert(metad->btm_magic == BTREE_MAGIC);
- Assert(metad->btm_version == BTREE_VERSION);
+ Assert(metad->btm_version >= BTREE_MIN_VERSION);
+ Assert(metad->btm_version <= BTREE_VERSION);
Assert(metad->btm_fastroot != P_NONE);
return metad->btm_fastlevel;
diff --git a/src/backend/access/nbtree/nbtxlog.c b/src/backend/access/nbtree/nbtxlog.c
index 67a94cb80a2..1ecdeb3fb68 100644
--- a/src/backend/access/nbtree/nbtxlog.c
+++ b/src/backend/access/nbtree/nbtxlog.c
@@ -108,6 +108,8 @@ _bt_restore_meta(XLogReaderState *record, uint8 block_id)
md->btm_level = xlrec->level;
md->btm_fastroot = xlrec->fastroot;
md->btm_fastlevel = xlrec->fastlevel;
+ /* Cannot log BTREE_MIN_VERSION index metapage without upgrade */
+ Assert(md->btm_version == BTREE_VERSION);
md->btm_oldest_btpo_xact = xlrec->oldest_btpo_xact;
md->btm_last_cleanup_num_heap_tuples = xlrec->last_cleanup_num_heap_tuples;
diff --git a/src/include/access/nbtree.h b/src/include/access/nbtree.h
index ea495f1724a..1a6678f877f 100644
--- a/src/include/access/nbtree.h
+++ b/src/include/access/nbtree.h
@@ -97,12 +97,12 @@ typedef BTPageOpaqueData *BTPageOpaque;
typedef struct BTMetaPageData
{
uint32 btm_magic; /* should contain BTREE_MAGIC */
- uint32 btm_version; /* should contain BTREE_VERSION */
+ uint32 btm_version; /* nbtree version (always <= BTREE_VERSION) */
BlockNumber btm_root; /* current root location */
uint32 btm_level; /* tree level of the root page */
BlockNumber btm_fastroot; /* current "fast" root location */
uint32 btm_fastlevel; /* tree level of the "fast" root page */
- /* following fields are available since page version 3 */
+ /* remaining fields only valid when btm_version is BTREE_VERSION */
TransactionId btm_oldest_btpo_xact; /* oldest btpo_xact among all deleted
* pages */
float8 btm_last_cleanup_num_heap_tuples; /* number of heap tuples