multixact.h 5.1 KB

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