]> granicus.if.org Git - postgresql/blob - src/include/access/multixact.h
Have multixact be truncated by checkpoint, not vacuum
[postgresql] / src / include / access / multixact.h
1 /*
2  * multixact.h
3  *
4  * PostgreSQL multi-transaction-log manager
5  *
6  * Portions Copyright (c) 1996-2014, 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/xlog.h"
15
16
17 /*
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
20  * 2.
21  */
22 #define InvalidMultiXactId      ((MultiXactId) 0)
23 #define FirstMultiXactId        ((MultiXactId) 1)
24 #define MaxMultiXactId          ((MultiXactId) 0xFFFFFFFF)
25
26 #define MultiXactIdIsValid(multi) ((multi) != InvalidMultiXactId)
27
28 #define MaxMultiXactOffset      ((MultiXactOffset) 0xFFFFFFFF)
29
30 /* Number of SLRU buffers to use for multixact */
31 #define NUM_MXACTOFFSET_BUFFERS         8
32 #define NUM_MXACTMEMBER_BUFFERS         16
33
34 /*
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.
38  */
39 typedef enum
40 {
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
49 } MultiXactStatus;
50
51 #define MaxMultiXactStatus MultiXactStatusUpdate
52
53 /* does a status value correspond to a tuple update? */
54 #define ISUPDATE_from_mxstatus(status) \
55                         ((status) > MultiXactStatusForUpdate)
56
57
58 typedef struct MultiXactMember
59 {
60         TransactionId xid;
61         MultiXactStatus status;
62 } MultiXactMember;
63
64
65 /* ----------------
66  *              multixact-related XLOG entries
67  * ----------------
68  */
69
70 #define XLOG_MULTIXACT_ZERO_OFF_PAGE    0x00
71 #define XLOG_MULTIXACT_ZERO_MEM_PAGE    0x10
72 #define XLOG_MULTIXACT_CREATE_ID                0x20
73
74 typedef struct xl_multixact_create
75 {
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;
81
82 #define SizeOfMultiXactCreate (offsetof(xl_multixact_create, members))
83
84
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);
92
93 extern MultiXactId ReadNextMultiXactId(void);
94 extern bool MultiXactIdIsRunning(MultiXactId multi);
95 extern void MultiXactIdSetOldestMember(void);
96 extern int GetMultiXactIdMembers(MultiXactId multi, MultiXactMember **xids,
97                                           bool allow_old);
98 extern bool MultiXactHasRunningRemoteMembers(MultiXactId multi);
99 extern bool MultiXactIdPrecedes(MultiXactId multi1, MultiXactId multi2);
100 extern bool MultiXactIdPrecedesOrEquals(MultiXactId multi1,
101                                                         MultiXactId multi2);
102
103 extern void AtEOXact_MultiXact(void);
104 extern void AtPrepare_MultiXact(void);
105 extern void PostPrepare_MultiXact(TransactionId xid);
106
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,
114                                         Oid oldest_datoid);
115 extern void MultiXactGetCheckptMulti(bool is_shutdown,
116                                                  MultiXactId *nextMulti,
117                                                  MultiXactOffset *nextMultiOffset,
118                                                  MultiXactId *oldestMulti,
119                                                  Oid *oldestMultiDB);
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);
129
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);
136
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);
141
142 #endif   /* MULTIXACT_H */