smgr.h 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. /*-------------------------------------------------------------------------
  2. *
  3. * smgr.h
  4. * storage manager switch public interface declarations.
  5. *
  6. *
  7. * Portions Copyright (c) 1996-2022, 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 "lib/ilist.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. * The following fields are reset to InvalidBlockNumber upon a cache flush
  45. * event, and hold the last known size for each fork. This information is
  46. * currently only reliable during recovery, since there is no cache
  47. * invalidation for fork extension.
  48. */
  49. BlockNumber smgr_targblock; /* current insertion target block */
  50. BlockNumber smgr_cached_nblocks[MAX_FORKNUM + 1]; /* last known size */
  51. /* additional public fields may someday exist here */
  52. /*
  53. * Fields below here are intended to be private to smgr.c and its
  54. * submodules. Do not touch them from elsewhere.
  55. */
  56. int smgr_which; /* storage manager selector */
  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. */
  61. int md_num_open_segs[MAX_FORKNUM + 1];
  62. struct _MdfdVec *md_seg_fds[MAX_FORKNUM + 1];
  63. /* if unowned, list link in list of all unowned SMgrRelations */
  64. dlist_node node;
  65. } SMgrRelationData;
  66. typedef SMgrRelationData *SMgrRelation;
  67. #define SmgrIsTemp(smgr) \
  68. RelFileNodeBackendIsTemp((smgr)->smgr_rnode)
  69. extern void smgrinit(void);
  70. extern SMgrRelation smgropen(RelFileNode rnode, BackendId backend);
  71. extern bool smgrexists(SMgrRelation reln, ForkNumber forknum);
  72. extern void smgrsetowner(SMgrRelation *owner, SMgrRelation reln);
  73. extern void smgrclearowner(SMgrRelation *owner, SMgrRelation reln);
  74. extern void smgrclose(SMgrRelation reln);
  75. extern void smgrcloseall(void);
  76. extern void smgrclosenode(RelFileNodeBackend rnode);
  77. extern void smgrrelease(SMgrRelation reln);
  78. extern void smgrreleaseall(void);
  79. extern void smgrcreate(SMgrRelation reln, ForkNumber forknum, bool isRedo);
  80. extern void smgrdosyncall(SMgrRelation *rels, int nrels);
  81. extern void smgrdounlinkall(SMgrRelation *rels, int nrels, bool isRedo);
  82. extern void smgrextend(SMgrRelation reln, ForkNumber forknum,
  83. BlockNumber blocknum, char *buffer, bool skipFsync);
  84. extern bool smgrprefetch(SMgrRelation reln, ForkNumber forknum,
  85. BlockNumber blocknum);
  86. extern void smgrread(SMgrRelation reln, ForkNumber forknum,
  87. BlockNumber blocknum, char *buffer);
  88. extern void smgrwrite(SMgrRelation reln, ForkNumber forknum,
  89. BlockNumber blocknum, char *buffer, bool skipFsync);
  90. extern void smgrwriteback(SMgrRelation reln, ForkNumber forknum,
  91. BlockNumber blocknum, BlockNumber nblocks);
  92. extern BlockNumber smgrnblocks(SMgrRelation reln, ForkNumber forknum);
  93. extern BlockNumber smgrnblocks_cached(SMgrRelation reln, ForkNumber forknum);
  94. extern void smgrtruncate(SMgrRelation reln, ForkNumber *forknum,
  95. int nforks, BlockNumber *nblocks);
  96. extern void smgrimmedsync(SMgrRelation reln, ForkNumber forknum);
  97. extern void AtEOXact_SMgr(void);
  98. extern bool ProcessBarrierSmgrRelease(void);
  99. #endif /* SMGR_H */