LCOV - code coverage report
Current view: top level - src/backend/storage/freespace - indexfsm.c (source / functions) Hit Total Coverage
Test: PostgreSQL 18devel Lines: 14 14 100.0 %
Date: 2024-11-21 09:14:53 Functions: 4 4 100.0 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : /*-------------------------------------------------------------------------
       2             :  *
       3             :  * indexfsm.c
       4             :  *    POSTGRES free space map for quickly finding free pages in relations
       5             :  *
       6             :  *
       7             :  * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group
       8             :  * Portions Copyright (c) 1994, Regents of the University of California
       9             :  *
      10             :  * IDENTIFICATION
      11             :  *    src/backend/storage/freespace/indexfsm.c
      12             :  *
      13             :  *
      14             :  * NOTES:
      15             :  *
      16             :  *  This is similar to the FSM used for heap, in freespace.c, but instead
      17             :  *  of tracking the amount of free space on pages, we only track whether
      18             :  *  pages are completely free or in-use. We use the same FSM implementation
      19             :  *  as for heaps, using BLCKSZ - 1 to denote used pages, and 0 for unused.
      20             :  *
      21             :  *-------------------------------------------------------------------------
      22             :  */
      23             : #include "postgres.h"
      24             : 
      25             : #include "storage/freespace.h"
      26             : #include "storage/indexfsm.h"
      27             : 
      28             : /*
      29             :  * Exported routines
      30             :  */
      31             : 
      32             : /*
      33             :  * GetFreeIndexPage - return a free page from the FSM
      34             :  *
      35             :  * As a side effect, the page is marked as used in the FSM.
      36             :  */
      37             : BlockNumber
      38       77358 : GetFreeIndexPage(Relation rel)
      39             : {
      40       77358 :     BlockNumber blkno = GetPageWithFreeSpace(rel, BLCKSZ / 2);
      41             : 
      42       77358 :     if (blkno != InvalidBlockNumber)
      43         136 :         RecordUsedIndexPage(rel, blkno);
      44             : 
      45       77358 :     return blkno;
      46             : }
      47             : 
      48             : /*
      49             :  * RecordFreeIndexPage - mark a page as free in the FSM
      50             :  */
      51             : void
      52        7470 : RecordFreeIndexPage(Relation rel, BlockNumber freeBlock)
      53             : {
      54        7470 :     RecordPageWithFreeSpace(rel, freeBlock, BLCKSZ - 1);
      55        7470 : }
      56             : 
      57             : 
      58             : /*
      59             :  * RecordUsedIndexPage - mark a page as used in the FSM
      60             :  */
      61             : void
      62         136 : RecordUsedIndexPage(Relation rel, BlockNumber usedBlock)
      63             : {
      64         136 :     RecordPageWithFreeSpace(rel, usedBlock, 0);
      65         136 : }
      66             : 
      67             : /*
      68             :  * IndexFreeSpaceMapVacuum - scan and fix any inconsistencies in the FSM
      69             :  */
      70             : void
      71         148 : IndexFreeSpaceMapVacuum(Relation rel)
      72             : {
      73         148 :     FreeSpaceMapVacuum(rel);
      74         148 : }

Generated by: LCOV version 1.14