4 * PostgreSQL multi-transaction-log manager
6 * Portions Copyright (c) 1996-2014, PostgreSQL Global Development Group
7 * Portions Copyright (c) 1994, Regents of the University of California
9 * src/include/access/multixact.h
14 #include "access/xlog.h"
18 * The first two MultiXactId values are reserved to store the truncation Xid
19 * and epoch of the first segment, so we start assigning multixact values from
22 #define InvalidMultiXactId ((MultiXactId) 0)
23 #define FirstMultiXactId ((MultiXactId) 1)
24 #define MaxMultiXactId ((MultiXactId) 0xFFFFFFFF)
26 #define MultiXactIdIsValid(multi) ((multi) != InvalidMultiXactId)
28 #define MaxMultiXactOffset ((MultiXactOffset) 0xFFFFFFFF)
30 /* Number of SLRU buffers to use for multixact */
31 #define NUM_MXACTOFFSET_BUFFERS 8
32 #define NUM_MXACTMEMBER_BUFFERS 16
35 * Possible multixact lock modes ("status"). The first four modes are for
36 * tuple locks (FOR KEY SHARE, FOR SHARE, FOR NO KEY UPDATE, FOR UPDATE); the
37 * next two are used for update and delete modes.
41 MultiXactStatusForKeyShare = 0x00,
42 MultiXactStatusForShare = 0x01,
43 MultiXactStatusForNoKeyUpdate = 0x02,
44 MultiXactStatusForUpdate = 0x03,
45 /* an update that doesn't touch "key" columns */
46 MultiXactStatusNoKeyUpdate = 0x04,
47 /* other updates, and delete */
48 MultiXactStatusUpdate = 0x05
51 #define MaxMultiXactStatus MultiXactStatusUpdate
53 /* does a status value correspond to a tuple update? */
54 #define ISUPDATE_from_mxstatus(status) \
55 ((status) > MultiXactStatusForUpdate)
58 typedef struct MultiXactMember
61 MultiXactStatus status;
66 * multixact-related XLOG entries
70 #define XLOG_MULTIXACT_ZERO_OFF_PAGE 0x00
71 #define XLOG_MULTIXACT_ZERO_MEM_PAGE 0x10
72 #define XLOG_MULTIXACT_CREATE_ID 0x20
74 typedef struct xl_multixact_create
76 MultiXactId mid; /* new MultiXact's ID */
77 MultiXactOffset moff; /* its starting offset in members file */
78 int32 nmembers; /* number of member XIDs */
79 MultiXactMember members[FLEXIBLE_ARRAY_MEMBER];
80 } xl_multixact_create;
82 #define SizeOfMultiXactCreate (offsetof(xl_multixact_create, members))
85 extern MultiXactId MultiXactIdCreate(TransactionId xid1,
86 MultiXactStatus status1, TransactionId xid2,
87 MultiXactStatus status2);
88 extern MultiXactId MultiXactIdExpand(MultiXactId multi, TransactionId xid,
89 MultiXactStatus status);
90 extern MultiXactId MultiXactIdCreateFromMembers(int nmembers,
91 MultiXactMember *members);
93 extern MultiXactId ReadNextMultiXactId(void);
94 extern bool MultiXactIdIsRunning(MultiXactId multi);
95 extern void MultiXactIdSetOldestMember(void);
96 extern int GetMultiXactIdMembers(MultiXactId multi, MultiXactMember **xids,
98 extern bool MultiXactHasRunningRemoteMembers(MultiXactId multi);
99 extern bool MultiXactIdPrecedes(MultiXactId multi1, MultiXactId multi2);
100 extern bool MultiXactIdPrecedesOrEquals(MultiXactId multi1,
103 extern void AtEOXact_MultiXact(void);
104 extern void AtPrepare_MultiXact(void);
105 extern void PostPrepare_MultiXact(TransactionId xid);
107 extern Size MultiXactShmemSize(void);
108 extern void MultiXactShmemInit(void);
109 extern void BootStrapMultiXact(void);
110 extern void StartupMultiXact(void);
111 extern void TrimMultiXact(void);
112 extern void ShutdownMultiXact(void);
113 extern void SetMultiXactIdLimit(MultiXactId oldest_datminmxid,
115 extern void MultiXactGetCheckptMulti(bool is_shutdown,
116 MultiXactId *nextMulti,
117 MultiXactOffset *nextMultiOffset,
118 MultiXactId *oldestMulti,
120 extern void CheckPointMultiXact(void);
121 extern MultiXactId GetOldestMultiXactId(void);
122 extern void TruncateMultiXact(void);
123 extern void MultiXactSetNextMXact(MultiXactId nextMulti,
124 MultiXactOffset nextMultiOffset);
125 extern void MultiXactAdvanceNextMXact(MultiXactId minMulti,
126 MultiXactOffset minMultiOffset);
127 extern void MultiXactAdvanceOldest(MultiXactId oldestMulti, Oid oldestMultiDB);
128 extern void MultiXactSetSafeTruncate(MultiXactId safeTruncateMulti);
130 extern void multixact_twophase_recover(TransactionId xid, uint16 info,
131 void *recdata, uint32 len);
132 extern void multixact_twophase_postcommit(TransactionId xid, uint16 info,
133 void *recdata, uint32 len);
134 extern void multixact_twophase_postabort(TransactionId xid, uint16 info,
135 void *recdata, uint32 len);
137 extern void multixact_redo(XLogRecPtr lsn, XLogRecord *record);
138 extern void multixact_desc(StringInfo buf, XLogRecord *record);
139 extern char *mxid_to_string(MultiXactId multi, int nmembers,
140 MultiXactMember *members);
142 #endif /* MULTIXACT_H */