mirror of
https://git.postgresql.org/git/postgresql.git
synced 2024-10-08 10:16:52 +02:00
7e04792a1c
Update all files in head, and files COPYRIGHT and legal.sgml in all back branches.
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-2014, 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 BLCKSZ - 1 to denote used pages, and 0 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);
|
|
}
|