LCOV - code coverage report
Current view: top level - src/backend/storage/freespace - indexfsm.c (source / functions) Hit Total Coverage
Test: PostgreSQL 13beta1 Lines: 14 14 100.0 %
Date: 2020-05-25 05:06:35 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-2020, 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       90780 : GetFreeIndexPage(Relation rel)
      39             : {
      40       90780 :     BlockNumber blkno = GetPageWithFreeSpace(rel, BLCKSZ / 2);
      41             : 
      42       90780 :     if (blkno != InvalidBlockNumber)
      43         452 :         RecordUsedIndexPage(rel, blkno);
      44             : 
      45       90780 :     return blkno;
      46             : }
      47             : 
      48             : /*
      49             :  * RecordFreeIndexPage - mark a page as free in the FSM
      50             :  */
      51             : void
      52        4170 : RecordFreeIndexPage(Relation rel, BlockNumber freeBlock)
      53             : {
      54        4170 :     RecordPageWithFreeSpace(rel, freeBlock, BLCKSZ - 1);
      55        4170 : }
      56             : 
      57             : 
      58             : /*
      59             :  * RecordUsedIndexPage - mark a page as used in the FSM
      60             :  */
      61             : void
      62         452 : RecordUsedIndexPage(Relation rel, BlockNumber usedBlock)
      63             : {
      64         452 :     RecordPageWithFreeSpace(rel, usedBlock, 0);
      65         452 : }
      66             : 
      67             : /*
      68             :  * IndexFreeSpaceMapVacuum - scan and fix any inconsistencies in the FSM
      69             :  */
      70             : void
      71         158 : IndexFreeSpaceMapVacuum(Relation rel)
      72             : {
      73         158 :     FreeSpaceMapVacuum(rel);
      74         158 : }

Generated by: LCOV version 1.13