smgr.h 6.0 KB

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