Re: FSM corruption leading to errors - Mailing list pgsql-hackers

From Pavan Deolasee
Subject Re: FSM corruption leading to errors
Date
Msg-id CABOikdOh1Vc0wP5R6O5ZEi8ixf_toC_KZjXfY59SQSweEQTZAg@mail.gmail.com
Whole thread Raw
In response to FSM corruption leading to errors  (Pavan Deolasee <pavan.deolasee@gmail.com>)
List pgsql-hackers


On Mon, Oct 24, 2016 at 9:34 PM, Tom Lane <tgl@sss.pgh.pa.us> wrote:

    SELECT blkno, pg_freespace(oid::regclass, blkno)
    FROM generate_series(pg_relation_size(oid::regclass) / current_setting('block_size')::BIGINT,
                         pg_relation_size(oid::regclass, 'fsm') / 2) AS blkno

It looks to me like this is approximating the highest block number that
could possibly have an FSM entry as size of the FSM fork (in bytes)
divided by 2.  But the FSM stores one byte per block.  There is overhead
for the FSM search tree, but in a large relation it's not going to be as
much as a factor of 2.  So I think that to be conservative we need to
drop the "/ 2".  Am I missing something?


I went by these comments in fsm_internals.h, which suggest that the SlotsPerFSMPage are limited to somewhat less than BLCKSZ divided by 2.

/*
 * Number of non-leaf and leaf nodes, and nodes in total, on an FSM page.
 * These definitions are internal to fsmpage.c.
 */ 
#define NodesPerPage (BLCKSZ - MAXALIGN(SizeOfPageHeaderData) - \
                      offsetof(FSMPageData, fp_nodes))
    
#define NonLeafNodesPerPage (BLCKSZ / 2 - 1)
#define LeafNodesPerPage (NodesPerPage - NonLeafNodesPerPage)

/*
 * Number of FSM "slots" on a FSM page. This is what should be used
 * outside fsmpage.c.
 */
#define SlotsPerFSMPage LeafNodesPerPage 


Thanks,
Pavan

--
 Pavan Deolasee                   http://www.2ndQuadrant.com/
 PostgreSQL Development, 24x7 Support, Training & Services

pgsql-hackers by date:

Previous
From: Tom Lane
Date:
Subject: Re: FSM corruption leading to errors
Next
From: Tom Lane
Date:
Subject: Re: FSM corruption leading to errors