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-2017, 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 3525 : GetFreeIndexPage(Relation rel)
39 : {
40 3525 : BlockNumber blkno = GetPageWithFreeSpace(rel, BLCKSZ / 2);
41 :
42 3525 : if (blkno != InvalidBlockNumber)
43 42 : RecordUsedIndexPage(rel, blkno);
44 :
45 3525 : return blkno;
46 : }
47 :
48 : /*
49 : * RecordFreeIndexPage - mark a page as free in the FSM
50 : */
51 : void
52 673 : RecordFreeIndexPage(Relation rel, BlockNumber freeBlock)
53 : {
54 673 : RecordPageWithFreeSpace(rel, freeBlock, BLCKSZ - 1);
55 673 : }
56 :
57 :
58 : /*
59 : * RecordUsedIndexPage - mark a page as used in the FSM
60 : */
61 : void
62 42 : RecordUsedIndexPage(Relation rel, BlockNumber usedBlock)
63 : {
64 42 : RecordPageWithFreeSpace(rel, usedBlock, 0);
65 42 : }
66 :
67 : /*
68 : * IndexFreeSpaceMapVacuum - scan and fix any inconsistencies in the FSM
69 : */
70 : void
71 437 : IndexFreeSpaceMapVacuum(Relation rel)
72 : {
73 437 : FreeSpaceMapVacuum(rel);
74 437 : }
|