diff options
Diffstat (limited to 'contrib/pageinspect/btreefuncs.c')
-rw-r--r-- | contrib/pageinspect/btreefuncs.c | 69 |
1 files changed, 49 insertions, 20 deletions
diff --git a/contrib/pageinspect/btreefuncs.c b/contrib/pageinspect/btreefuncs.c index 8bb180bbbe0..b7725b572f0 100644 --- a/contrib/pageinspect/btreefuncs.c +++ b/contrib/pageinspect/btreefuncs.c @@ -75,11 +75,7 @@ typedef struct BTPageStat /* opaque data */ BlockNumber btpo_prev; BlockNumber btpo_next; - union - { - uint32 level; - TransactionId xact; - } btpo; + uint32 btpo_level; uint16 btpo_flags; BTCycleId btpo_cycleid; } BTPageStat; @@ -112,9 +108,33 @@ GetBTPageStatistics(BlockNumber blkno, Buffer buffer, BTPageStat *stat) /* page type (flags) */ if (P_ISDELETED(opaque)) { - stat->type = 'd'; - stat->btpo.xact = opaque->btpo.xact; - return; + /* We divide deleted pages into leaf ('d') or internal ('D') */ + if (P_ISLEAF(opaque) || !P_HAS_FULLXID(opaque)) + stat->type = 'd'; + else + stat->type = 'D'; + + /* + * Report safexid in a deleted page. + * + * Handle pg_upgrade'd deleted pages that used the previous safexid + * representation in btpo_level field (this used to be a union type + * called "bpto"). + */ + if (P_HAS_FULLXID(opaque)) + { + FullTransactionId safexid = BTPageGetDeleteXid(page); + + elog(NOTICE, "deleted page from block %u has safexid %u:%u", + blkno, EpochFromFullTransactionId(safexid), + XidFromFullTransactionId(safexid)); + } + else + elog(NOTICE, "deleted page from block %u has safexid %u", + blkno, opaque->btpo_level); + + /* Don't interpret BTDeletedPageData as index tuples */ + maxoff = InvalidOffsetNumber; } else if (P_IGNORE(opaque)) stat->type = 'e'; @@ -128,7 +148,7 @@ GetBTPageStatistics(BlockNumber blkno, Buffer buffer, BTPageStat *stat) /* btpage opaque data */ stat->btpo_prev = opaque->btpo_prev; stat->btpo_next = opaque->btpo_next; - stat->btpo.level = opaque->btpo.level; + stat->btpo_level = opaque->btpo_level; stat->btpo_flags = opaque->btpo_flags; stat->btpo_cycleid = opaque->btpo_cycleid; @@ -237,7 +257,7 @@ bt_page_stats_internal(PG_FUNCTION_ARGS, enum pageinspect_version ext_version) values[j++] = psprintf("%u", stat.free_size); values[j++] = psprintf("%u", stat.btpo_prev); values[j++] = psprintf("%u", stat.btpo_next); - values[j++] = psprintf("%u", (stat.type == 'd') ? stat.btpo.xact : stat.btpo.level); + values[j++] = psprintf("%u", stat.btpo_level); values[j++] = psprintf("%d", stat.btpo_flags); tuple = BuildTupleFromCStrings(TupleDescGetAttInMetadata(tupleDesc), @@ -503,10 +523,14 @@ bt_page_items_internal(PG_FUNCTION_ARGS, enum pageinspect_version ext_version) opaque = (BTPageOpaque) PageGetSpecialPointer(uargs->page); - if (P_ISDELETED(opaque)) - elog(NOTICE, "page is deleted"); - - fctx->max_calls = PageGetMaxOffsetNumber(uargs->page); + if (!P_ISDELETED(opaque)) + fctx->max_calls = PageGetMaxOffsetNumber(uargs->page); + else + { + /* Don't interpret BTDeletedPageData as index tuples */ + elog(NOTICE, "page from block " INT64_FORMAT " is deleted", blkno); + fctx->max_calls = 0; + } uargs->leafpage = P_ISLEAF(opaque); uargs->rightmost = P_RIGHTMOST(opaque); @@ -603,7 +627,14 @@ bt_page_items_bytea(PG_FUNCTION_ARGS) if (P_ISDELETED(opaque)) elog(NOTICE, "page is deleted"); - fctx->max_calls = PageGetMaxOffsetNumber(uargs->page); + if (!P_ISDELETED(opaque)) + fctx->max_calls = PageGetMaxOffsetNumber(uargs->page); + else + { + /* Don't interpret BTDeletedPageData as index tuples */ + elog(NOTICE, "page from block is deleted"); + fctx->max_calls = 0; + } uargs->leafpage = P_ISLEAF(opaque); uargs->rightmost = P_RIGHTMOST(opaque); @@ -692,10 +723,7 @@ bt_metap(PG_FUNCTION_ARGS) /* * We need a kluge here to detect API versions prior to 1.8. Earlier - * versions incorrectly used int4 for certain columns. This caused - * various problems. For example, an int4 version of the "oldest_xact" - * column would not work with TransactionId values that happened to exceed - * PG_INT32_MAX. + * versions incorrectly used int4 for certain columns. * * There is no way to reliably avoid the problems created by the old * function definition at this point, so insist that the user update the @@ -723,7 +751,8 @@ bt_metap(PG_FUNCTION_ARGS) */ if (metad->btm_version >= BTREE_NOVAC_VERSION) { - values[j++] = psprintf("%u", metad->btm_oldest_btpo_xact); + values[j++] = psprintf(INT64_FORMAT, + (int64) metad->btm_last_cleanup_num_delpages); values[j++] = psprintf("%f", metad->btm_last_cleanup_num_heap_tuples); values[j++] = metad->btm_allequalimage ? "t" : "f"; } |