mirror of
https://github.com/postgres/postgres.git
synced 2025-06-26 12:21:12 +03:00
The implementation of FSM for indexes is simpler than heap, where 0 is used to track if a page is in-use and (BLCKSZ - 1) if a page is free. One comment in indexfsm.c and one description in the documentation of pg_freespacemap were incorrect about that. Author: Alex Friedman <alexf01@gmail.com> Discussion: https://postgr.es/m/71eef655-c192-453f-ac45-2772fec2cb04@gmail.com Backpatch-through: 13
75 lines
1.7 KiB
C
75 lines
1.7 KiB
C
/*-------------------------------------------------------------------------
|
|
*
|
|
* indexfsm.c
|
|
* POSTGRES free space map for quickly finding free pages in relations
|
|
*
|
|
*
|
|
* Portions Copyright (c) 1996-2020, PostgreSQL Global Development Group
|
|
* Portions Copyright (c) 1994, Regents of the University of California
|
|
*
|
|
* IDENTIFICATION
|
|
* src/backend/storage/freespace/indexfsm.c
|
|
*
|
|
*
|
|
* NOTES:
|
|
*
|
|
* This is similar to the FSM used for heap, in freespace.c, but instead
|
|
* of tracking the amount of free space on pages, we only track whether
|
|
* pages are completely free or in-use. We use the same FSM implementation
|
|
* as for heaps, using 0 to denote used pages, and (BLCKSZ - 1) for unused.
|
|
*
|
|
*-------------------------------------------------------------------------
|
|
*/
|
|
#include "postgres.h"
|
|
|
|
#include "storage/freespace.h"
|
|
#include "storage/indexfsm.h"
|
|
|
|
/*
|
|
* Exported routines
|
|
*/
|
|
|
|
/*
|
|
* GetFreeIndexPage - return a free page from the FSM
|
|
*
|
|
* As a side effect, the page is marked as used in the FSM.
|
|
*/
|
|
BlockNumber
|
|
GetFreeIndexPage(Relation rel)
|
|
{
|
|
BlockNumber blkno = GetPageWithFreeSpace(rel, BLCKSZ / 2);
|
|
|
|
if (blkno != InvalidBlockNumber)
|
|
RecordUsedIndexPage(rel, blkno);
|
|
|
|
return blkno;
|
|
}
|
|
|
|
/*
|
|
* RecordFreeIndexPage - mark a page as free in the FSM
|
|
*/
|
|
void
|
|
RecordFreeIndexPage(Relation rel, BlockNumber freeBlock)
|
|
{
|
|
RecordPageWithFreeSpace(rel, freeBlock, BLCKSZ - 1);
|
|
}
|
|
|
|
|
|
/*
|
|
* RecordUsedIndexPage - mark a page as used in the FSM
|
|
*/
|
|
void
|
|
RecordUsedIndexPage(Relation rel, BlockNumber usedBlock)
|
|
{
|
|
RecordPageWithFreeSpace(rel, usedBlock, 0);
|
|
}
|
|
|
|
/*
|
|
* IndexFreeSpaceMapVacuum - scan and fix any inconsistencies in the FSM
|
|
*/
|
|
void
|
|
IndexFreeSpaceMapVacuum(Relation rel)
|
|
{
|
|
FreeSpaceMapVacuum(rel);
|
|
}
|