multixact.h 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164
  1. /*
  2. * multixact.h
  3. *
  4. * PostgreSQL multi-transaction-log manager
  5. *
  6. * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
  7. * Portions Copyright (c) 1994, Regents of the University of California
  8. *
  9. * src/include/access/multixact.h
  10. */
  11. #ifndef MULTIXACT_H
  12. #define MULTIXACT_H
  13. #include "access/xlogreader.h"
  14. #include "lib/stringinfo.h"
  15. #include "storage/sync.h"
  16. /*
  17. * The first two MultiXactId values are reserved to store the truncation Xid
  18. * and epoch of the first segment, so we start assigning multixact values from
  19. * 2.
  20. */
  21. #define InvalidMultiXactId ((MultiXactId) 0)
  22. #define FirstMultiXactId ((MultiXactId) 1)
  23. #define MaxMultiXactId ((MultiXactId) 0xFFFFFFFF)
  24. #define MultiXactIdIsValid(multi) ((multi) != InvalidMultiXactId)
  25. #define MaxMultiXactOffset ((MultiXactOffset) 0xFFFFFFFF)
  26. /* Number of SLRU buffers to use for multixact */
  27. #define NUM_MULTIXACTOFFSET_BUFFERS 8
  28. #define NUM_MULTIXACTMEMBER_BUFFERS 16
  29. /*
  30. * Possible multixact lock modes ("status"). The first four modes are for
  31. * tuple locks (FOR KEY SHARE, FOR SHARE, FOR NO KEY UPDATE, FOR UPDATE); the
  32. * next two are used for update and delete modes.
  33. */
  34. typedef enum
  35. {
  36. MultiXactStatusForKeyShare = 0x00,
  37. MultiXactStatusForShare = 0x01,
  38. MultiXactStatusForNoKeyUpdate = 0x02,
  39. MultiXactStatusForUpdate = 0x03,
  40. /* an update that doesn't touch "key" columns */
  41. MultiXactStatusNoKeyUpdate = 0x04,
  42. /* other updates, and delete */
  43. MultiXactStatusUpdate = 0x05
  44. } MultiXactStatus;
  45. #define MaxMultiXactStatus MultiXactStatusUpdate
  46. /* does a status value correspond to a tuple update? */
  47. #define ISUPDATE_from_mxstatus(status) \
  48. ((status) > MultiXactStatusForUpdate)
  49. typedef struct MultiXactMember
  50. {
  51. TransactionId xid;
  52. MultiXactStatus status;
  53. } MultiXactMember;
  54. /* ----------------
  55. * multixact-related XLOG entries
  56. * ----------------
  57. */
  58. #define XLOG_MULTIXACT_ZERO_OFF_PAGE 0x00
  59. #define XLOG_MULTIXACT_ZERO_MEM_PAGE 0x10
  60. #define XLOG_MULTIXACT_CREATE_ID 0x20
  61. #define XLOG_MULTIXACT_TRUNCATE_ID 0x30
  62. typedef struct xl_multixact_create
  63. {
  64. MultiXactId mid; /* new MultiXact's ID */
  65. MultiXactOffset moff; /* its starting offset in members file */
  66. int32 nmembers; /* number of member XIDs */
  67. MultiXactMember members[FLEXIBLE_ARRAY_MEMBER];
  68. } xl_multixact_create;
  69. #define SizeOfMultiXactCreate (offsetof(xl_multixact_create, members))
  70. typedef struct xl_multixact_truncate
  71. {
  72. Oid oldestMultiDB;
  73. /* to-be-truncated range of multixact offsets */
  74. MultiXactId startTruncOff; /* just for completeness' sake */
  75. MultiXactId endTruncOff;
  76. /* to-be-truncated range of multixact members */
  77. MultiXactOffset startTruncMemb;
  78. MultiXactOffset endTruncMemb;
  79. } xl_multixact_truncate;
  80. #define SizeOfMultiXactTruncate (sizeof(xl_multixact_truncate))
  81. extern MultiXactId MultiXactIdCreate(TransactionId xid1,
  82. MultiXactStatus status1, TransactionId xid2,
  83. MultiXactStatus status2);
  84. extern MultiXactId MultiXactIdExpand(MultiXactId multi, TransactionId xid,
  85. MultiXactStatus status);
  86. extern MultiXactId MultiXactIdCreateFromMembers(int nmembers,
  87. MultiXactMember *members);
  88. extern MultiXactId ReadNextMultiXactId(void);
  89. extern void ReadMultiXactIdRange(MultiXactId *oldest, MultiXactId *next);
  90. extern bool MultiXactIdIsRunning(MultiXactId multi, bool isLockOnly);
  91. extern void MultiXactIdSetOldestMember(void);
  92. extern int GetMultiXactIdMembers(MultiXactId multi, MultiXactMember **xids,
  93. bool allow_old, bool isLockOnly);
  94. extern bool MultiXactIdPrecedes(MultiXactId multi1, MultiXactId multi2);
  95. extern bool MultiXactIdPrecedesOrEquals(MultiXactId multi1,
  96. MultiXactId multi2);
  97. extern int multixactoffsetssyncfiletag(const FileTag *ftag, char *path);
  98. extern int multixactmemberssyncfiletag(const FileTag *ftag, char *path);
  99. extern void AtEOXact_MultiXact(void);
  100. extern void AtPrepare_MultiXact(void);
  101. extern void PostPrepare_MultiXact(TransactionId xid);
  102. extern Size MultiXactShmemSize(void);
  103. extern void MultiXactShmemInit(void);
  104. extern void BootStrapMultiXact(void);
  105. extern void StartupMultiXact(void);
  106. extern void TrimMultiXact(void);
  107. extern void SetMultiXactIdLimit(MultiXactId oldest_datminmxid,
  108. Oid oldest_datoid,
  109. bool is_startup);
  110. extern void MultiXactGetCheckptMulti(bool is_shutdown,
  111. MultiXactId *nextMulti,
  112. MultiXactOffset *nextMultiOffset,
  113. MultiXactId *oldestMulti,
  114. Oid *oldestMultiDB);
  115. extern void CheckPointMultiXact(void);
  116. extern MultiXactId GetOldestMultiXactId(void);
  117. extern void TruncateMultiXact(MultiXactId oldestMulti, Oid oldestMultiDB);
  118. extern void MultiXactSetNextMXact(MultiXactId nextMulti,
  119. MultiXactOffset nextMultiOffset);
  120. extern void MultiXactAdvanceNextMXact(MultiXactId minMulti,
  121. MultiXactOffset minMultiOffset);
  122. extern void MultiXactAdvanceOldest(MultiXactId oldestMulti, Oid oldestMultiDB);
  123. extern int MultiXactMemberFreezeThreshold(void);
  124. extern void multixact_twophase_recover(TransactionId xid, uint16 info,
  125. void *recdata, uint32 len);
  126. extern void multixact_twophase_postcommit(TransactionId xid, uint16 info,
  127. void *recdata, uint32 len);
  128. extern void multixact_twophase_postabort(TransactionId xid, uint16 info,
  129. void *recdata, uint32 len);
  130. extern void multixact_redo(XLogReaderState *record);
  131. extern void multixact_desc(StringInfo buf, XLogReaderState *record);
  132. extern const char *multixact_identify(uint8 info);
  133. extern char *mxid_to_string(MultiXactId multi, int nmembers,
  134. MultiXactMember *members);
  135. #endif /* MULTIXACT_H */