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