Age Owner Branch data TLA 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-2024, 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
5675 heikki.linnakangas@i 38 :CBC 38191 : GetFreeIndexPage(Relation rel)
39 : : {
1804 akapila@postgresql.o 40 : 38191 : BlockNumber blkno = GetPageWithFreeSpace(rel, BLCKSZ / 2);
41 : :
5675 heikki.linnakangas@i 42 [ + + ]: 38191 : if (blkno != InvalidBlockNumber)
43 : 314 : RecordUsedIndexPage(rel, blkno);
44 : :
45 : 38191 : return blkno;
46 : : }
47 : :
48 : : /*
49 : : * RecordFreeIndexPage - mark a page as free in the FSM
50 : : */
51 : : void
52 : 4072 : RecordFreeIndexPage(Relation rel, BlockNumber freeBlock)
53 : : {
1804 akapila@postgresql.o 54 : 4072 : RecordPageWithFreeSpace(rel, freeBlock, BLCKSZ - 1);
5675 heikki.linnakangas@i 55 : 4072 : }
56 : :
57 : :
58 : : /*
59 : : * RecordUsedIndexPage - mark a page as used in the FSM
60 : : */
61 : : void
62 : 314 : RecordUsedIndexPage(Relation rel, BlockNumber usedBlock)
63 : : {
1804 akapila@postgresql.o 64 : 314 : RecordPageWithFreeSpace(rel, usedBlock, 0);
5675 heikki.linnakangas@i 65 : 314 : }
66 : :
67 : : /*
68 : : * IndexFreeSpaceMapVacuum - scan and fix any inconsistencies in the FSM
69 : : */
70 : : void
5669 71 : 99 : IndexFreeSpaceMapVacuum(Relation rel)
72 : : {
73 : 99 : FreeSpaceMapVacuum(rel);
74 : 99 : }
|