PostgreSQL Source Code git master
All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
smgr.h
Go to the documentation of this file.
1/*-------------------------------------------------------------------------
2 *
3 * smgr.h
4 * storage manager switch public interface declarations.
5 *
6 *
7 * Portions Copyright (c) 1996-2025, PostgreSQL Global Development Group
8 * Portions Copyright (c) 1994, Regents of the University of California
9 *
10 * src/include/storage/smgr.h
11 *
12 *-------------------------------------------------------------------------
13 */
14#ifndef SMGR_H
15#define SMGR_H
16
17#include "lib/ilist.h"
18#include "storage/aio_types.h"
19#include "storage/block.h"
21
22/*
23 * smgr.c maintains a table of SMgrRelation objects, which are essentially
24 * cached file handles. An SMgrRelation is created (if not already present)
25 * by smgropen(), and destroyed by smgrdestroy(). Note that neither of these
26 * operations imply I/O, they just create or destroy a hashtable entry. (But
27 * smgrdestroy() may release associated resources, such as OS-level file
28 * descriptors.)
29 *
30 * An SMgrRelation may be "pinned", to prevent it from being destroyed while
31 * it's in use. We use this to prevent pointers in relcache to smgr from being
32 * invalidated. SMgrRelations that are not pinned are deleted at end of
33 * transaction.
34 */
35typedef struct SMgrRelationData
36{
37 /* rlocator is the hashtable lookup key, so it must be first! */
38 RelFileLocatorBackend smgr_rlocator; /* relation physical identifier */
39
40 /*
41 * The following fields are reset to InvalidBlockNumber upon a cache flush
42 * event, and hold the last known size for each fork. This information is
43 * currently only reliable during recovery, since there is no cache
44 * invalidation for fork extension.
45 */
46 BlockNumber smgr_targblock; /* current insertion target block */
47 BlockNumber smgr_cached_nblocks[MAX_FORKNUM + 1]; /* last known size */
48
49 /* additional public fields may someday exist here */
50
51 /*
52 * Fields below here are intended to be private to smgr.c and its
53 * submodules. Do not touch them from elsewhere.
54 */
55 int smgr_which; /* storage manager selector */
56
57 /*
58 * for md.c; per-fork arrays of the number of open segments
59 * (md_num_open_segs) and the segments themselves (md_seg_fds).
60 */
63
64 /*
65 * Pinning support. If unpinned (ie. pincount == 0), 'node' is a list
66 * link in list of all unpinned SMgrRelations.
67 */
71
73
74#define SmgrIsTemp(smgr) \
75 RelFileLocatorBackendIsTemp((smgr)->smgr_rlocator)
76
78
79extern void smgrinit(void);
80extern SMgrRelation smgropen(RelFileLocator rlocator, ProcNumber backend);
81extern bool smgrexists(SMgrRelation reln, ForkNumber forknum);
82extern void smgrpin(SMgrRelation reln);
83extern void smgrunpin(SMgrRelation reln);
84extern void smgrclose(SMgrRelation reln);
85extern void smgrdestroyall(void);
86extern void smgrrelease(SMgrRelation reln);
87extern void smgrreleaseall(void);
89extern void smgrcreate(SMgrRelation reln, ForkNumber forknum, bool isRedo);
90extern void smgrdosyncall(SMgrRelation *rels, int nrels);
91extern void smgrdounlinkall(SMgrRelation *rels, int nrels, bool isRedo);
92extern void smgrextend(SMgrRelation reln, ForkNumber forknum,
93 BlockNumber blocknum, const void *buffer, bool skipFsync);
94extern void smgrzeroextend(SMgrRelation reln, ForkNumber forknum,
95 BlockNumber blocknum, int nblocks, bool skipFsync);
96extern bool smgrprefetch(SMgrRelation reln, ForkNumber forknum,
97 BlockNumber blocknum, int nblocks);
98extern uint32 smgrmaxcombine(SMgrRelation reln, ForkNumber forknum,
99 BlockNumber blocknum);
100extern void smgrreadv(SMgrRelation reln, ForkNumber forknum,
101 BlockNumber blocknum,
102 void **buffers, BlockNumber nblocks);
103extern void smgrstartreadv(PgAioHandle *ioh,
104 SMgrRelation reln, ForkNumber forknum,
105 BlockNumber blocknum,
106 void **buffers, BlockNumber nblocks);
107extern void smgrwritev(SMgrRelation reln, ForkNumber forknum,
108 BlockNumber blocknum,
109 const void **buffers, BlockNumber nblocks,
110 bool skipFsync);
111extern void smgrwriteback(SMgrRelation reln, ForkNumber forknum,
112 BlockNumber blocknum, BlockNumber nblocks);
113extern BlockNumber smgrnblocks(SMgrRelation reln, ForkNumber forknum);
115extern void smgrtruncate(SMgrRelation reln, ForkNumber *forknum, int nforks,
116 BlockNumber *old_nblocks,
117 BlockNumber *nblocks);
118extern void smgrimmedsync(SMgrRelation reln, ForkNumber forknum);
119extern void smgrregistersync(SMgrRelation reln, ForkNumber forknum);
120extern void AtEOXact_SMgr(void);
121extern bool ProcessBarrierSmgrRelease(void);
122
123static inline void
125 void *buffer)
126{
127 smgrreadv(reln, forknum, blocknum, &buffer, 1);
128}
129
130static inline void
132 const void *buffer, bool skipFsync)
133{
134 smgrwritev(reln, forknum, blocknum, &buffer, 1, skipFsync);
135}
136
138 SMgrRelationData *smgr,
139 ForkNumber forknum,
140 BlockNumber blocknum,
141 int nblocks,
142 bool skip_fsync);
143
144#endif /* SMGR_H */
uint32 BlockNumber
Definition: block.h:31
#define PGDLLIMPORT
Definition: c.h:1291
uint32_t uint32
Definition: c.h:502
int ProcNumber
Definition: procnumber.h:24
ForkNumber
Definition: relpath.h:56
#define MAX_FORKNUM
Definition: relpath.h:70
BlockNumber smgrnblocks(SMgrRelation reln, ForkNumber forknum)
Definition: smgr.c:819
void smgrstartreadv(PgAioHandle *ioh, SMgrRelation reln, ForkNumber forknum, BlockNumber blocknum, void **buffers, BlockNumber nblocks)
Definition: smgr.c:753
void smgrwriteback(SMgrRelation reln, ForkNumber forknum, BlockNumber blocknum, BlockNumber nblocks)
Definition: smgr.c:805
void smgrrelease(SMgrRelation reln)
Definition: smgr.c:350
SMgrRelation smgropen(RelFileLocator rlocator, ProcNumber backend)
Definition: smgr.c:240
void smgrinit(void)
Definition: smgr.c:188
void smgrdestroyall(void)
Definition: smgr.c:386
void smgrreleaseall(void)
Definition: smgr.c:412
void smgrpin(SMgrRelation reln)
Definition: smgr.c:296
void smgrunpin(SMgrRelation reln)
Definition: smgr.c:311
void smgrdosyncall(SMgrRelation *rels, int nrels)
Definition: smgr.c:498
void smgrimmedsync(SMgrRelation reln, ForkNumber forknum)
Definition: smgr.c:965
void smgrcreate(SMgrRelation reln, ForkNumber forknum, bool isRedo)
Definition: smgr.c:481
BlockNumber smgrnblocks_cached(SMgrRelation reln, ForkNumber forknum)
Definition: smgr.c:847
void smgrclose(SMgrRelation reln)
Definition: smgr.c:374
static void smgrwrite(SMgrRelation reln, ForkNumber forknum, BlockNumber blocknum, const void *buffer, bool skipFsync)
Definition: smgr.h:131
uint32 smgrmaxcombine(SMgrRelation reln, ForkNumber forknum, BlockNumber blocknum)
Definition: smgr.c:697
struct SMgrRelationData SMgrRelationData
void smgrzeroextend(SMgrRelation reln, ForkNumber forknum, BlockNumber blocknum, int nblocks, bool skipFsync)
Definition: smgr.c:649
void smgrtruncate(SMgrRelation reln, ForkNumber *forknum, int nforks, BlockNumber *old_nblocks, BlockNumber *nblocks)
Definition: smgr.c:875
PGDLLIMPORT const PgAioTargetInfo aio_smgr_target_info
Definition: smgr.c:172
bool ProcessBarrierSmgrRelease(void)
Definition: smgr.c:1018
void AtEOXact_SMgr(void)
Definition: smgr.c:1008
static void smgrread(SMgrRelation reln, ForkNumber forknum, BlockNumber blocknum, void *buffer)
Definition: smgr.h:124
void smgrextend(SMgrRelation reln, ForkNumber forknum, BlockNumber blocknum, const void *buffer, bool skipFsync)
Definition: smgr.c:620
void smgrwritev(SMgrRelation reln, ForkNumber forknum, BlockNumber blocknum, const void **buffers, BlockNumber nblocks, bool skipFsync)
Definition: smgr.c:791
void smgrreleaserellocator(RelFileLocatorBackend rlocator)
Definition: smgr.c:443
bool smgrexists(SMgrRelation reln, ForkNumber forknum)
Definition: smgr.c:462
SMgrRelationData * SMgrRelation
Definition: smgr.h:72
void smgrreadv(SMgrRelation reln, ForkNumber forknum, BlockNumber blocknum, void **buffers, BlockNumber nblocks)
Definition: smgr.c:721
void smgrdounlinkall(SMgrRelation *rels, int nrels, bool isRedo)
Definition: smgr.c:538
void smgrregistersync(SMgrRelation reln, ForkNumber forknum)
Definition: smgr.c:931
bool smgrprefetch(SMgrRelation reln, ForkNumber forknum, BlockNumber blocknum, int nblocks)
Definition: smgr.c:678
void pgaio_io_set_target_smgr(PgAioHandle *ioh, SMgrRelationData *smgr, ForkNumber forknum, BlockNumber blocknum, int nblocks, bool skip_fsync)
Definition: smgr.c:1029
int md_num_open_segs[MAX_FORKNUM+1]
Definition: smgr.h:61
BlockNumber smgr_targblock
Definition: smgr.h:46
BlockNumber smgr_cached_nblocks[MAX_FORKNUM+1]
Definition: smgr.h:47
struct _MdfdVec * md_seg_fds[MAX_FORKNUM+1]
Definition: smgr.h:62
RelFileLocatorBackend smgr_rlocator
Definition: smgr.h:38
dlist_node node
Definition: smgr.h:69
int smgr_which
Definition: smgr.h:55
int pincount
Definition: smgr.h:68
Definition: md.c:82