mirror of
https://github.com/postgres/postgres.git
synced 2025-10-13 18:28:01 +03:00
This feature was using a process local map to track the first few blocks in the relation. The map was reset each time we get the block with enough freespace. It was discussed that it would be better to track this map on a per-relation basis in relcache and then invalidate the same whenever vacuum frees up some space in the page or when FSM is created. The new design would be better both in terms of API design and performance. List of commits reverted, in reverse chronological order:06c8a5090e
Improve code comments inb0eaa4c51b
.13e8643bfc
During pg_upgrade, conditionally skip transfer of FSMs.6f918159a9
Add more tests for FSM.9c32e4c350
Clear the local map when not used.29d108cdec
Update the documentation for FSM behavior..08ecdfe7e5
Make FSM test portable.b0eaa4c51b
Avoid creation of the free space map for small heap relations. Discussion: https://postgr.es/m/20190416180452.3pm6uegx54iitbt5@alap3.anarazel.de
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-2019, 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);
|
|
}
|