1 /*------------------------------------------------------------------------- 2 * 3 * smgr.h 4 * storage manager switch public interface declarations. 5 * 6 * 7 * Portions Copyright (c) 1996-2016, 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 "fmgr.h" 18 #include "lib/ilist.h" 19 #include "storage/block.h" 20 #include "storage/relfilenode.h" 21 22 23 /* 24 * smgr.c maintains a table of SMgrRelation objects, which are essentially 25 * cached file handles. An SMgrRelation is created (if not already present) 26 * by smgropen(), and destroyed by smgrclose(). Note that neither of these 27 * operations imply I/O, they just create or destroy a hashtable entry. 28 * (But smgrclose() may release associated resources, such as OS-level file 29 * descriptors.) 30 * 31 * An SMgrRelation may have an "owner", which is just a pointer to it from 32 * somewhere else; smgr.c will clear this pointer if the SMgrRelation is 33 * closed. We use this to avoid dangling pointers from relcache to smgr 34 * without having to make the smgr explicitly aware of relcache. There 35 * can't be more than one "owner" pointer per SMgrRelation, but that's 36 * all we need. 37 * 38 * SMgrRelations that do not have an "owner" are considered to be transient, 39 * and are deleted at end of transaction. 40 */ 41 typedef struct SMgrRelationData 42 { 43 /* rnode is the hashtable lookup key, so it must be first! */ 44 RelFileNodeBackend smgr_rnode; /* relation physical identifier */ 45 46 /* pointer to owning pointer, or NULL if none */ 47 struct SMgrRelationData **smgr_owner; 48 49 /* 50 * These next three fields are not actually used or manipulated by smgr, 51 * except that they are reset to InvalidBlockNumber upon a cache flush 52 * event (in particular, upon truncation of the relation). Higher levels 53 * store cached state here so that it will be reset when truncation 54 * happens. In all three cases, InvalidBlockNumber means "unknown". 55 */ 56 BlockNumber smgr_targblock; /* current insertion target block */ 57 BlockNumber smgr_fsm_nblocks; /* last known size of fsm fork */ 58 BlockNumber smgr_vm_nblocks; /* last known size of vm fork */ 59 60 /* additional public fields may someday exist here */ 61 62 /* 63 * Fields below here are intended to be private to smgr.c and its 64 * submodules. Do not touch them from elsewhere. 65 */ 66 int smgr_which; /* storage manager selector */ 67 68 /* for md.c; NULL for forks that are not open */ 69 struct _MdfdVec *md_fd[MAX_FORKNUM + 1]; 70 71 /* if unowned, list link in list of all unowned SMgrRelations */ 72 dlist_node node; 73 } SMgrRelationData; 74 75 typedef SMgrRelationData *SMgrRelation; 76 77 #define SmgrIsTemp(smgr) \ 78 RelFileNodeBackendIsTemp((smgr)->smgr_rnode) 79 80 extern void smgrinit(void); 81 extern SMgrRelation smgropen(RelFileNode rnode, BackendId backend); 82 extern bool smgrexists(SMgrRelation reln, ForkNumber forknum); 83 extern void smgrsetowner(SMgrRelation *owner, SMgrRelation reln); 84 extern void smgrclearowner(SMgrRelation *owner, SMgrRelation reln); 85 extern void smgrclose(SMgrRelation reln); 86 extern void smgrcloseall(void); 87 extern void smgrclosenode(RelFileNodeBackend rnode); 88 extern void smgrcreate(SMgrRelation reln, ForkNumber forknum, bool isRedo); 89 extern void smgrdounlink(SMgrRelation reln, bool isRedo); 90 extern void smgrdounlinkall(SMgrRelation *rels, int nrels, bool isRedo); 91 extern void smgrdounlinkfork(SMgrRelation reln, ForkNumber forknum, bool isRedo); 92 extern void smgrextend(SMgrRelation reln, ForkNumber forknum, 93 BlockNumber blocknum, char *buffer, bool skipFsync); 94 extern void smgrprefetch(SMgrRelation reln, ForkNumber forknum, 95 BlockNumber blocknum); 96 extern void smgrread(SMgrRelation reln, ForkNumber forknum, 97 BlockNumber blocknum, char *buffer); 98 extern void smgrwrite(SMgrRelation reln, ForkNumber forknum, 99 BlockNumber blocknum, char *buffer, bool skipFsync); 100 extern void smgrwriteback(SMgrRelation reln, ForkNumber forknum, 101 BlockNumber blocknum, BlockNumber nblocks); 102 extern BlockNumber smgrnblocks(SMgrRelation reln, ForkNumber forknum); 103 extern void smgrtruncate(SMgrRelation reln, ForkNumber forknum, 104 BlockNumber nblocks); 105 extern void smgrimmedsync(SMgrRelation reln, ForkNumber forknum); 106 extern void smgrpreckpt(void); 107 extern void smgrsync(void); 108 extern void smgrpostckpt(void); 109 extern void AtEOXact_SMgr(void); 110 111 112 /* internals: move me elsewhere -- ay 7/94 */ 113 114 /* in md.c */ 115 extern void mdinit(void); 116 extern void mdclose(SMgrRelation reln, ForkNumber forknum); 117 extern void mdcreate(SMgrRelation reln, ForkNumber forknum, bool isRedo); 118 extern bool mdexists(SMgrRelation reln, ForkNumber forknum); 119 extern void mdunlink(RelFileNodeBackend rnode, ForkNumber forknum, bool isRedo); 120 extern void mdextend(SMgrRelation reln, ForkNumber forknum, 121 BlockNumber blocknum, char *buffer, bool skipFsync); 122 extern void mdprefetch(SMgrRelation reln, ForkNumber forknum, 123 BlockNumber blocknum); 124 extern void mdread(SMgrRelation reln, ForkNumber forknum, BlockNumber blocknum, 125 char *buffer); 126 extern void mdwrite(SMgrRelation reln, ForkNumber forknum, 127 BlockNumber blocknum, char *buffer, bool skipFsync); 128 extern void mdwriteback(SMgrRelation reln, ForkNumber forknum, 129 BlockNumber blocknum, BlockNumber nblocks); 130 extern BlockNumber mdnblocks(SMgrRelation reln, ForkNumber forknum); 131 extern void mdtruncate(SMgrRelation reln, ForkNumber forknum, 132 BlockNumber nblocks); 133 extern void mdimmedsync(SMgrRelation reln, ForkNumber forknum); 134 extern void mdpreckpt(void); 135 extern void mdsync(void); 136 extern void mdpostckpt(void); 137 138 extern void SetForwardFsyncRequests(void); 139 extern void RememberFsyncRequest(RelFileNode rnode, ForkNumber forknum, 140 BlockNumber segno); 141 extern void ForgetRelationFsyncRequests(RelFileNode rnode, ForkNumber forknum); 142 extern void ForgetDatabaseFsyncRequests(Oid dbid); 143 extern void DropRelationFiles(RelFileNode *delrels, int ndelrels, bool isRedo); 144 145 /* smgrtype.c */ 146 extern Datum smgrout(PG_FUNCTION_ARGS); 147 extern Datum smgrin(PG_FUNCTION_ARGS); 148 extern Datum smgreq(PG_FUNCTION_ARGS); 149 extern Datum smgrne(PG_FUNCTION_ARGS); 150 151 #endif /* SMGR_H */ 152